为什么单线程Redis能那么快

单线程澄清

Redis的单线程,指的是Redis的键值对读写由一个线程来完成。

Redis的多线程:

  • 持久化
  • 异步删除
  • 集群数据同步
  • 网络IO (Redis6.0引入,5.0及之前都是单线程)

单线程快的原因

内存数据库

Redis完全基于内存,大部分操作都是在内存中完成的。内存操作相比于磁盘操作,速度要快很多。

没有锁的开销

Redis采用单线程模型,避免了不必要的上下文切换和竞争条件。多线程或多进程导致的切换会消耗CPU,考虑各种锁的问题也会导致性能损耗。

I/O多路复用

Redis采用了非阻塞+epoll模型,具体ET/LT待查证。

  ET是Edge Triggered的缩写,它表示边缘触发。在这种模式下,只有当某个文件描述符有数据到达时,才会触发一个事件。换句话说,当客户端发送数据到服务端时,只有第一次有数据到达时,epoll_wait会返回。即使后续还有数据到达,也不会再次触发。
  LT是Level Triggered的缩写,它表示水平触发。在这种模式下,只要某个文件描述符中有数据可读,每次调用epoll_wait都会得到通知。也就是说,即使应用程序在处理事件时没有读取完所有数据,epoll_wait也会继续返回,直到所有数据都被读取完。
  这两种触发模式各有优缺点。边缘触发模式的优点在于它只会在数据到达时触发事件,因此不会产生空轮询,效率更高。但是,如果应用程序需要处理大量数据,并且不能一次性读取完所有数据,边缘触发模式可能会产生大量的epoll_wait调用,增加CPU负载。而水平触发模式的优点在于它可以处理任何大小的数据,并且不会产生空轮询。但是,如果应用程序只需要处理少量的数据,并且希望减少epoll_wait调用的次数,水平触发模式可能会浪费CPU资源。

高效的数据结构

Redis常用类型有string、list、hash、zset、set,对应底层实现有简单动态字符串、双向链表、压缩列表、哈希表、跳表、整数数组。

更多信息详见Redis的底层数据结构

posted @ 2023-10-24 16:56  kiper  阅读(6)  评论(0编辑  收藏  举报