当前位置: 首页 > news >正文

redis查询速度快的原因?

核心原因(决定性因素)
1. 纯内存存储与访问
这是最根本、最主要的原因。

物理限制的差异:内存(RAM)的读写速度是纳秒级别(ns),而即使是最快的固态硬盘(SSD)也是微秒级别(μs)。1μs = 1000ns。这意味着内存的访问速度比磁盘快几个数量级。

避免磁盘 I/O:传统数据库(如 MySQL)的数据主要存储在磁盘上,查询时需要通过磁盘 I/O 将数据读入内存,这个过程是系统中最慢的环节之一。Redis 将所有数据放在内存中,直接操作内存,彻底规避了这个瓶颈。

2. 高效的数据结构
Redis 不仅仅是简单的 Key-Value 存储,它的 Value 可以是多种数据结构,并且每种结构都经过极致优化。

(1)量身定制的实现

String:使用简单动态字符串(SDS),可以高效地执行长度计算、追加等操作。

Hash:在元素较少时使用 ziplist(压缩列表),这是一种紧凑的、连续内存存储格式,能极大减少内存占用和内存访问次数。

List:底层使用 quicklist,它是 ziplist 和双向链表的混合体,平衡了内存效率和操作性能。

Set / Sorted Set:使用 intset(整数集合)或 hashtable;Sorted Set 使用 skiplist(跳跃表)+ hashtable 的组合,可以在 O(logN) 时间复杂度内完成范围查询。

HyperLogLog、Bitmap 等:这些专门的数据结构让特定计算(如基数统计)变得极其高效。

(2)时间复杂度低:大多数操作的复杂度都是 O(1) 或 O(logN),这意味着数据量增大时,操作时间的增长非常缓慢。

3. 单线程模型(核心处理逻辑)
这是一个经常被误解但非常关键的设计。

避免上下文切换和竞争:Redis 的核心网络事件处理器和执行命令的模块是单线程的。这意味着它不需要为共享数据加锁,也避免了多线程之间频繁的上下文切换带来的 CPU 消耗。

无锁竞争:单线程天然是原子操作,不存在因为锁竞争而导致的性能下降问题。

注意:这里的“单线程”指的是处理命令的主线程。Redis 在后期的版本中,使用多线程来处理一些后台任务(如持久化、异步删除 unlink 命令),但处理客户端请求的核心逻辑仍然是单线程的。

4. I/O 多路复用
单线程如何能处理成千上万的并发连接?答案是 I/O 多路复用技术。

非阻塞 I/O:Redis 使用 epoll(Linux)、kqueue(BSD) 这样的系统机制。它允许单个线程监视多个网络连接( sockets),当某个连接有数据到达时,操作系统会通知 Redis,然后 Redis 再去处理。

事件驱动:整个系统是一个事件循环,当没有事件发生时,线程是休眠的,不消耗 CPU。一旦有连接请求、读事件或写事件,线程就会被唤醒进行处理。

高并发支撑:这种模式使得单线程的 Redis 能够轻松应对数万甚至数十万的并发连接,而线程本身不会成为瓶颈。

辅助原因

5. 优化的网络模型
Redis 的通信协议(RESP)设计得非常简单,易于解析。客户端和服务器之间的数据传输高效,减少了网络开销。

6. 源码级别的优化
Redis 的 C 语言源码质量极高,处处体现了对性能的追求。例如使用自定义的内存分配器来减少碎片,使用紧凑的数据结构来利用 CPU 缓存(局部性原理)等。

总结
我们可以将 Redis 的高速归因于一个精妙的组合:

原因解决的问题带来的效果
内存存储磁盘 I/O 速度慢根本性提速,访问速度提升数个量级
高效数据结构数据操作本身慢算法级优化,每个操作都尽可能高效
单线程模型多线程上下文切换和锁竞争CPU 高效利用,代码路径清晰无阻塞
I/O 多路复用单线程处理海量连接高并发支撑,用少量资源服务大量客户端

一个生动的比喻

如果把数据库查询比作去图书馆找书。

传统磁盘数据库:你需要告诉图书管理员(CPU)要找的书名,他得去巨大的书库(磁盘)里一本本地找,非常慢。
Redis:图书管理员(Redis 单线程)手边有一个整理得井井有条的小书桌(内存),所有热门书籍都放在桌上。他采用一种高效的工作方法(I/O 多路复用),同时接收很多人的请求,然后迅速从桌上找到书递给你。因为书桌小且整理有序(高效数据结构),所以他几乎不用花时间寻找。

因此,Redis 的“快”是一个系统工程的结果,它通过在存储介质、数据结构、线程模型和网络模型等各个层面做出最优选择,最终实现了极致的性能。

http://www.dtcms.com/a/585382.html

相关文章:

  • 社区类网站开发网站怎么提升流量
  • 注册网站时手机号格式不正确容易做的html5的网站
  • 如何查询哪些服务器 IP 访问了 Google Cloud 的 Vertex AI API
  • DataWhale-HelloAgents(第一部分:智能体与语言模型基础)
  • Ollama:在本地运行大语言模型的利器
  • 构建智能知识库问答助手:LangChain与大语言模型的深度融合实践
  • 大语言模型如何获得符号逻辑演绎能力?从频率范式到贝叶斯范式的转移
  • 网站建设中的功能新浪微博图床wordpress
  • 【玩泰山派】9、ubuntu22.04安装中文输入法
  • Spring IOC/DI 与 MVC 从入门到实战
  • SCNet超算平台DCU异构环境的Ollama启动服务后无法转发公网的问题解决
  • macOS下如何全文检索epub格式文件?
  • 一键配置 macOS 终极终端:iTerm2 + Oh My Zsh 自动化安装脚本
  • 如何在 Mac、Ubuntu、CentOS、Windows 上安装 MySQL 客户端
  • 石景山广州网站建设外贸soho建站多少钱
  • 某观鸟记录中心的爬虫——mitmproxy的简单使用
  • 58同城上海网站建设北京朝阳区房价
  • 金融网络销售怎么找客源公司网站做优化少钱
  • 代码随想录 Q84.分发饼干
  • 11.8 脚本网页 打砖块max
  • 终极笔记应用程序Alexandrie
  • 「嵌」入未来,「式」界无限 · 第5篇:能源电力的智能化跃迁
  • 自动化实践(7.25):把 PsTools 接入 PowerShell / 批处理 / Ansible
  • 太原在线网站建设深圳网站关键词优化
  • AWS Lambda的安全之道:S3静态加密与运行时完整性检查的双重保障
  • 时序数据库选型指南从大数据视角看IoTDB的核心优势
  • 长沙网站建站模板创免费网站
  • dede 门户网站长春建站网站建设
  • Android Hilt 入门教程_传统写法和Hilt写法的比较
  • 【开题答辩全过程】以 个性化宿舍分配管理系统为例,包含答辩的问题和答案