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

redis为什么快

文章目录

  • 前言
    • 1、内存存储:
    • 2、单线程模型:
      • 补充:
    • 3、异步非阻塞I/O:(多路复用)
      • 信息补充:
      • 与Java中的IO区别:
      • 监测解释
        • select系统调用:
        • poll系统调用:
        • epoll系统调用(Linux特有):
      • 工作原理
      • 具体例子
    • 4、高效数据结构:
      • 基础数据结构
        • 1、 字符串(String)
        • 2. 哈希(Hash)
        • 3. 列表(List)
        • 4. 集合(Set)
        • 5. 有序集合(Sorted Set)
      • 高级数据类型
        • 6. 位图(Bitmap)
        • 7. HyperLogLog
        • 8. 地理空间(GEO)
    • 5、持久化选项:
    • 6、优化策略:
    • 7、事件驱动:
    • 8、批量处理和管道技术:
  • 总结:


前言

Why is Redis so fast ?

Redis作为一种基于内存的数据存储系统,其快速性能由多个因素共同作用所致。


1、内存存储:

与传统数据库不同,Redis将所有数据存储在内存中,而不是磁盘上。内存的读写速度远远快于磁盘,因此Redis能够非常快速地读取和写入数据,避免了磁盘I/O操作带来的延迟,这一点是Redis速度快的关键所在。

2、单线程模型:

Redis采用单线程模型来处理客户端请求,这意味着它不需要在多线程之间进行上下文切换,从而减少了线程切换带来的开销。同时,单线程也简化了锁的管理,因为同一时间只有一个请求被处理,无需复杂的锁机制来保护共享资源。

补充:

  1. Redis的操作本质上是CPU密集型,而不是IO密集型,因此避免线程切换对性能影响更大。

  2. Redis的实现中,使用了原子操作和简单数据结构,进一步减少了线程间竞争的可能性,从而保持了高效的执行。

  3. 单线程处理减少了线程争用带来的缓存失效问题,避免了频繁的缓存刷新,因而进一步提升了性能。

  4. Redis使用IO多路复用(比如select或epoll)的机制,使得单线程在面对多个客户端连接时仍能保持高效处理。

  5. Redis 6.0引入了多线程(主要用于处理网络请求),使得其在高并发下的性能得到一定提升,但主要的数据操作仍然是单线程,以保持简单性和高性能。

  6. MySQL在多线程模型下,通过锁机制和事务隔离保证数据一致性,适合事务性需求强的场景。Redis单线程模型更适合对事务一致性要求不高的场景。

3、异步非阻塞I/O:(多路复用)

Redis使用异步非阻塞I/O模型,允许在等待某些I/O操作完成时继续执行其他任务,从而提高了整体性能。这种模型使得Redis能够高效地处理多个客户端连接和请求。

信息补充:

IO多路复用(IO multiplexing)是一种高效的I/O处理机制,允许单个进程或线程同时监控多个文件描述符(如套接字)的I/O事件。
这种机制通过提供统一的接口(如select、poll、epoll等系统调用)来同时监听多个文件描述符的I/O状态,当某个文件描述符上有I/O事件发生时(如数据可读、可写或有异常),这些接口会立即返回并告知应用程序哪些文件描述符有事件发生。
这样,单个进程或线程就能并发地处理多个I/O操作,从而提高了系统的吞吐量和效率。

在Redis中,IO多路复用技术得到了广泛应用。Redis服务器是一个事件驱动的程序,它利用IO多路复用机制来同时处理多个客户端的连接请求和响应。这种机制使得Redis能够使用单进程、单线程模型就保持优秀的吞吐量。

与Java中的IO区别:

模型差异:Java的传统IO模型通常是阻塞式的,即在进行读写操作时,线程会被阻塞直到操作完成。而IO多路复用则允许单个线程同时处理多个I/O操作,不会因某个操作的阻塞而影响其他操作的处理。

效率和性能:由于Java的传统IO在处理多个连接时需要为每个连接分配一个线程,这会导致大量的线程创建、销毁和上下文切换开销。而IO多路复用则通过单个线程管理多个


http://www.kler.cn/a/374840.html

相关文章:

  • NLP 中文拼写检测开源-01-基于贝叶斯公式的拼写检查器 CSC
  • 单元测试mock框架Mockito
  • Docker Compose 安装 Harbor
  • 随手记:小程序兼容后台的wangEditor富文本配置链接
  • 【数据安全】如何保证其安全
  • STM32, GD32 cubemx CAN 低速率125kbps 报文丢失,解决了
  • 什么是React.js,有什么特点
  • 常见生成式模型汇总
  • Spark的集群环境部署
  • 自动化测试工具Ranorex Studio(十八)-调用用户定义的action
  • day-77 超级饮料的最大强化能量
  • .net Core 使用Panda.DynamicWebApi动态构造路由
  • qt QDoubleSpinBox详解
  • 第15课 算法(下)
  • 使用 Cloudreve 搭建你的专属个人网盘
  • 分布式 ID 生成策略(一)
  • 如何提高社媒品牌知名度,3个增加曝光的实操方法
  • 微信小程序服务通知
  • 【HarmonyOS NEXT】在 HarmonyOS NEXT 中实现优雅的加载动画
  • python 五子棋小游戏
  • GIN 反向代理功能
  • C/C++ 每日一练:二叉树的先序遍历
  • Webserver(2.6)信号
  • 信号完整性SI总结【小登培训】
  • OpenCV基础知识
  • DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)