REDIS_06Redis版本改动特性及Redis6新特性
2023-04-26 23:45:32 4 举报
AI智能生成
Redis版本改动特性及Redis6新特性
作者其他创作
大纲/内容
版本迭代和重大改进
Redis 4
模块系统
Redis 4.0 发生的最大变化就是加入了模块系统
系统可以让用户通过自己编写的代码来扩展和实现 Redis 本身并不具备的功能
与 Redis 内核本身完全分离、互不干扰, 所以用户可以在有需要的情况下才启用这个功能
PSYNC 2.0
PSYNC命令解决了旧版本的 Redis 在复制时的一些不够优化的地方
旧版本
一个从服务器在 FAILOVER 之后成为了新的主节点, 那么其他从节点在复制这个新主的时候就必须进行全量复制
一个从服务器如果重启了, 那么它就必须与主服务器重新进行全量复制
当复制为链式复制的时候,如 A—>B—>C ,主节点为A。当A出现问题,C节点不能正常复制B节点的数据。当提升B为主节点,C需要全量同步B的数据
新版本
新主和从服务器在处理这种情况时, 将在条件允许的情况下使用部分复制
只要条件允许, 主从在处理这种情况时将使用部分复制
PSYNC2解决了链式复制之间的关联性。A出现问题不影响C节点,B提升为主C不需要全量同步
缓存驱逐策略优化
最不经常使用。在一段时间内,使用次数最少的数据,优先被淘汰
Lazy Free
旧版本
用户在使用 DEL命令删除体积较大的键, 又或者在使用 FLUSHDB 和 FLUSHALL删除包含大量键的数据库时, 都可能会造成服务器阻塞
新版本
Redis 4.0 新添加了UNLINK命令, 这个命令是DEL命令的异步版本, 它可以将删除指定键的操作放在后台线程里面执行, 从而尽可能地避免服务器阻塞
交换数据库
新增了SWAPDB命令
这个命令可以对指定的两个数据库进行互换
通过执行命令 SWAPDB 0 1 , 我们可以将原来的数据库 0 变成数据库 1 , 而原来的数据库 1 则变成数据库 0
混合持久化
新增了 RDB-AOF 混合持久化格式
AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容, 其中 RDB 格式的内容用于记录已有的数据, 而 AOF 格式的内存则用于记录最近发生了变化的数据
同时兼有 RDB 持久化和 AOF 持久化的优点 —— 既能够快速地生成重写文件, 也能够在出现问题时, 快速地载入数据
配置项:aof-use-rdb-preamble
内存命令
新添加了一个MEMORY命令, 这个命令可以用于视察内存使用情况
MEMORY USAGE子命令可以估算储存给定键所需的内存
MEMORY STATS子命令可以查看 Redis 当前的内存使用情况
MEMORY PURGE子命令可以要求分配器释放内存
MEMORY MALLOC-STATS子命令可以展示分配器内部状态
兼容 NAT 和 Docker
4.0中增加了三个配置
cluster-announce-ip:要宣布的IP地址
cluster-announce-port:要宣布的数据端口
cluster-announce-bus-port:节点通信端口,默认在端口前+1
在Docker环境中,如果使用的不是host网络模式,在容器内部的IP和PORT都是隔离的
如果配置了以后,Redis节点会将配置中的这些IP和PORT告知客户端或其他节点,通过Docker转发到容器内的临时IP和PORT的
Redis 5
Stream类型
获取元素高效,复杂度为O(logN)
支持offset,每个消息元素有唯一id。不会因为新元素加入或者其他元素淘汰而改变id。
支持消息元素持久化,可以保存到AOF和RDB中
支持消费分组
支持ACK(消费确认)
Stream性能与消费者数量无明显关系
允许按时间线逐出历史数据,支持block,给予radix tree和listpack,内存开销少
不能从中间删除消息元素
List, Pub/Sub, Zset比较
List获取元素的复杂度为O(N)
List没有offset概念,如果有元素被逐出,无法确定最新的元素
Pub/Sub不支持持久化消息
Pub/Sub不支持消费分组
Pub/Sub性能与客户端数量负相关
Zset不能重复添加相同元素,不支持逐出和block,内存开销大
Zet支持删除任意元素
新的Redis模块API
定时器(Timers)、集群(Cluster)和字典API(Dictionary APIs)
集群管理器更改
redis5.0彻底抛弃了依赖基于Ruby的redis-trib.rb脚本
将集群管理功能全部集成到完全用C写的redis-cli中。可以通过命令redis-cli --cluster help查看帮助信息
Redis 6
expire cycle
重新编写了Redis活动到期周期,以更快地回收已到期的key
多线程IO
redis 6.0 以前
操作在一个线程中执行完成
redis 6.0
可以通过如下参数配置多线程模型
io-threads 4
有三个IO 线程,还有一个线程是main线程,main线程负责IO读写和命令执行操作
这三个IO线程只会执行 IO中的write 操作
io-threads-do-reads yes // 将支持IO线程执行 读写任务。
引入多线程的原因
内存的响应时长大约为100纳秒,对于小数据包,Redis服务器可以处理80,000到100,000 QPS,一般来说单线程的Redis已经足够使用
读写网络的read/write系统调用占用了Redis执行期间大部分CPU时间,瓶颈主要在于网络的 IO 消耗
可以充分利用服务器 CPU 资源,目前主线程只能利用一个核
多线程任务可以分摊 Redis 同步 IO 读写负荷
配置
多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行
不需要去考虑控制 key、lua、事务,LPUSH/LPOP 等等的并发及线程安全问题
io-threads-do-reads yes
多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf
设置线程数
官方建议4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数
线程数并不是越大越好,官方认为超过了8个基本就没什么意义了
如果开启多线程,至少要4核的机器,且Redis实例已经占用相当大的CPU耗时的时候才建议采用,否则使用多线程没有意义
多线程的实现机制
主线程负责接收建立连接请求,获取 socket 放入全局等待读处理队列
主线程处理完读事件之后,通过 RR(Round Robin) 将这些连接分配给这些 IO 线程
主线程阻塞等待 IO 线程读取 socket 完毕
主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行
主线程阻塞等待 IO 线程将数据回写 socket 完毕
解除绑定,清空等待队列
设计特点
IO 线程要么同时在读 socket,要么同时在写,不会同时读或写
IO 线程只负责读写 socket 解析命令,不负责命令处理
IO多路复用
经典的Reactor设计模式,有时也称为异步阻塞IO
多路指的是多个socket连接,复用指的是复用一个线程
多路复用主要有三种技术:select,poll,epoll
epoll是最新的也是目前最好的多路复用技术
采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
Redis在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),所以造就了Redis具有很高的吞吐量
0 条评论
下一页