Redis6.0的新特性
- 面向网络处理的多IO线程:提升网络请求处理速度,提升性能
- 客户端缓存:直接读取本地缓存,提升性能
- 细粒度权限控制:安全考虑
- RESP3协议:增强客户端功能
面向网络处理的多IO线程
-
老版redis
-
单线程处理命令(后台线程:数据库删除,快照生成,AOF重写)
-
单线程处理网络请求 epoll
-
解决思路:
- 1.用户态网络协议栈(例如 DPDK)取代内核网络协议栈 (使用用户态网络协议)
- 2.采用多个IO线程处理网络请求,提升网络请求处理的并行度
-
-
-
Redis 的多 IO 线程只是用来处理网络请求的,对于读写命令,Redis 仍然使用单线程来处理\
-
具体实现
-
服务端和客户端建立socket连接,并分配处理线程
-
IO 线程读取并解析请求\
-
主线程执行请求操作\
-
IO 线程回写 Socket 和主线程清空全局队列\
-
-
1
如何使用多线程
- 开启多线程:io-thread-do-reads 配置项为 yes
- 线程个数要小于 Redis 实例所在机器的 CPU 核个数 io-threads 6\
客户端缓存
-
redis客户端将数据缓存在业务服务器中,实现快速读取数据
-
特殊场景:如果数据别修改或失效该如何处理
- 服务端会记录客户端获取的key
- 普通模式:如果key发生修改则会发送key失效的消息(但是只会发送一次失效信息) CLIENT TRACKING ON|OFF使用
- 广播模式:服务端会给客户端广播所有 key 的失效情况 ,RESP 3支持 RESP 2则通过监听_redis_:invalidate 频道,获得失效消息
细粒度的权限控制
-
高风险的命令(例如 KEYS、FLUSHDB、FLUSHALL 等)可以限制管理权限\
-
1
\
RESP3协议
-
在 RESP 2 中,客户端和服务器端的通信内容都是以字节数组形式进行编码的,客户端需要根据操作的命令或是数据类型自行对传输的数据进行解码,增加了客户端开发复杂度\
-
RESP 3 直接支持多种数据类型的区分编码,包括空值、浮点数、布尔值、有序的字典集合、无序的集合(利用不同的数据类型进行区分)\
总结
- 稳定性有待考证
\
\