Redis线程模型

Redis本身是一个单线程模型,不存在锁竞争和上下文切换开销,这里的单线程是狭义上的单线程,也就是处理客户端请求的线程只有一个,在Redis中其实支持多线程,下面来看看吧

异步删除
Redis4.0增加了异步删除功能,UNLINK命令可以异步删除过期key,避免过多的过期key或过期大key阻塞主线程执行
此外,redis如果开启了lazy free机制,会有一个独立线程定期删除过期Key
AOF重写
bgrewriteaof命令启动一个独立线程来重写AOF文件,同样的还有bgsave命令,启动独立线程来进行RDB持久化
多线程网络I/O
image

这算是Redis6.0版本引入的最重要的改进了,主要是为了提高网络 IO 读写性能。那为什么之前没有引入呢?而且,为什么只引入多线程I/O呢?

  • Redis的性能瓶颈在于内存和网络,而不在于CPU
  • 单线程编程更简单,易维护
  • 单线程不存在锁竞争和上下文切换开销
io-threads 4 // 开启多线程写
io-threads-do-reads yes // 开启多线程读

Redis的多线程网络I/O主要基于I/O多路复用模型实现,感兴趣的可以自行查阅,可参考https://www.cnblogs.com/hlxs/p/13631219.html。

其实,结合Redis的线程模型也可以看出,之所以通过MULTI或者LUA脚本可以实现原子性,是因为本身为单线程运行,同时在脚本执行期间不允许被中断,才得以实现原子性,并不像MySQL的原子性实现那么复杂

posted @ 2025-11-19 23:49  xxs不是小学生  阅读(6)  评论(0)    收藏  举报