Redis线程模型
对于读写命令来说,Redis 一直是单线程模型。不过,在 Redis 4.0 版本之后引入了多线程来执行一些大键值对的异步删除操作, Redis 6.0 版本之后引入了多线程来处理网络请求(提高网络 IO 读写性能)。
单线程模型
Redis 4.0 之后新增了UNLINK
(可以看作是 DEL
的异步版本)、FLUSHALL ASYNC
(清空所有数据库的所有 key,不仅仅是当前 SELECT
的数据库)、FLUSHDB ASYNC
(清空当前 SELECT
数据库中的所有 key)等异步命令。
Redis6.0
Redis6.0 引入多线程主要是为了提高网络 IO 读写性能,因为这个算是 Redis 中的一个性能瓶颈(Redis 的瓶颈主要受限于内存和网络)。
虽然,Redis6.0 引入了多线程,但是 Redis 的多线程只是在网络数据的读写这类耗时操作上使用了,执行命令仍然是单线程顺序执行。因此,你也不需要担心线程安全问题。
Redis6.0 的多线程默认是禁用的,只使用主线程。如需开启需要设置 IO 线程数 > 1,需要修改 redis 配置文件 redis.conf
:
io-threads 4 #设置1的话只会开启主线程,官网建议4核的机器建议设置为2或3个线程,8核的建议设置为6个线程
速度快
官方数据 redis 可以做到每秒近10w的并发,这么快的原因主要总结为以下几点:
完全基于内存操作
使用单线程模型来处理客户端的请求,避免了上下文的切换
redis 6.0之后又使用了多线程,依然使用单线程模型来处理客户端的请求,只是使用多线程来处理数据的读写和协议解析,执行命令还是使用单线程,不会有线程安全的问题。
之所以加入了多线程因为 redis 的性能瓶颈在于网络IO而非CPU,使用多线程能提升IO读写的效率,从而整体提高redis的性能。
IO 多路复用机制
自身使用 C 语言编写,有很多优化机制,比如动态字符串 sds