redis 变化

ddatsh

db #redis redis】 【change

版本

2.6 2012 (2.6.17)

2.8 2013-11-23(2.8.24 )

3.0 2015-4-1

3.2 2016-5-6

4.0 2017-07-15

5.0 2018-10-18

6.0 2020-08-27

​ 多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。不想因为多线程而变得复杂,需要去控制 key、lua、事务,LPUSH/LPOP 等等的并发问题

​ 使用 Redis 时,几乎不存在 CPU 成为瓶颈的情况, Redis 主要受限于内存和网络

​ 普通 Linux 系统上,Redis 通过使用pipelining 每秒可以处理 100 万个请求,应用程序主要使用 O(N) 或 O(log(N)) 的命令,它几乎不会占用太多 CPU

​ 使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗

​ 客户端缓存在某些方面进行了重新设计,特别是放弃了缓存槽方法而只使用密钥名。在分析了备选方案后,在其他 Redis 核心团队成员的帮助下,最终这种方法看起来更好。除此之外,最后这个特性用我在这个特性的 backlog 中的东西完成了,特别是“广播模式”

​ 当使用广播时,服务器不再试图记住每个客户端请求的密钥。相反,客户端订阅密钥前缀:每次修改与前缀匹配的密钥时,它们都会收到通知。这意味着更多的消息(但仅针对选定前缀),但服务器端没有内存工作。此外,现在支持 opt-in/opt-out 模式,因此客户端不使用广播模式,可以准确地告诉服务器客户端将缓存什么,以减少无效消息的数量。基本上,当需要低内存模式,以及需要非常选择性(低带宽)模式时,该特性现在都要好得多

​ 支持对客户端的权限控制,实现对不同的 key 授予不同的操作权限

​ 有一个新的 ACL 日志命令,允许查看所有违反 ACL 的客户机、访问不应该访问的命令、访问不应该访问的密钥,或者验证尝试失败。这对于调试 ACL 问题非常有用

​ Redis 5 使用的是 RESP2,而 Redis 6 开始在兼容 RESP2 的基础上,开始支持 RESP3

​ 一是因为希望能为客户端提供更多的语义化响应,以开发使用旧协议难以实现的功能;另一个原因是实现 Client-side-caching(客户端缓存)功能

​ Redis 将能够更频繁地进行部分重新同步,因为现在可以调整协议中的最终 ping,从而使副本和主服务器能够找到共同的偏移量

​ 带有超时的 Redis 命令现在好得多:不仅 BLPOP 和其他命令以前接受秒,现在接受十进制数,而且实际分辨率得到了提高,以便永远不会比当前的“HZ”值差,而不管连接了多少客户端

​ 根据文件的实际组成(较大或较小的值),可以预期有 20/30%的改进。当有许多客户机连接时,信息也变得更快了,这是一个长期的问题,现在终于消失了

​ 类似于 VIP 但又比 VIP 简单,客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群

​ redis 集群模式下,增加了对 multiple 操作的支持,跨 slot 操作等等(有点关系数据库的分库分表中间件的感觉)

7.0

  1. 在 AOF 文件中增加了数据更新时间点的标识,使得用户可以恢复某一时间点的数据。

  2. 增加了 API 以便于可以在 functions 和 Lua 脚本中明确地查看 ACL

Redis 7.0 新增 14 个用户端命令和 15 个已有命令的相关参数选项,其中包括:ZMPOP, BZMPOP,LMPOP, BLMPOP 等新命令,对于 EXPIRE 和 SET 命令,新增了更多的命令参数选项。

Redis 7.0 新增 10 个管理和监控相关的命令及其相关参数选项,其中包括:COMMAND LIST,COMMAND INFO,CLUSTER DELSLOTSRANGE and CLUSTER ADDSLOTSRANGE 等

新增配置项

​ config set maxmemory 10000001 maxmemory-clients 50% port 26381

性能提升

  1. Hash,List, Zset底层数据结构用 listpack 替换 ziplist
  2. List数据类型可超过 4GB 单个元素
  3. 降低 copy-on-write 期间内存使用
  4. 大量Hash或者zset 时节省大量内存
  5. 在集群模式下,节省了大量的内存并且降低了系统整体的延迟时间
  6. 在集群中,当一个主节点重启之后,从节点不再需要做完全同步,只需要做部分同步即可
  7. 当 Redis 启动时,总是建立一个 AOF 文件用于持久化
  8. 降低了长期没有响应客户 (idle, stale client) 的内存使用
  9. 降低了在客户回复数据包中的对于写的系统调用次数,也同时降低了 TCP packet 的数目

Radis 7.0 还对模块(Module)的 API 进行了部分修改如下:

  1. 新增了对 RESP3 类型的应答的 API 支持
  2. 新增了在 RM_Call 对 RESP3 回复消息的解析的 API 支持
  3. 增加了对 ACL 进行验证的支持
  4. 还增加 API:RM_CreateSubcommand,RM_KeyExists,RM_TrimStringAllocation, RM_SetCommandInfo 等

6.0 诸多企业级特性如 threaded-io、TLS 和 ACL 等,大幅提升了 Redis 的性能和安全性

7.0 接近一年的开发、三个候选版本,历史上改变最多的一个大版本, 50 多个新命令,大量核心新特性与改进,解决用户使用中的诸多问题,进一步拓展了 Redis 的使用场景

Function

Client-eviction

连接占用内存独立管理

Multi-part AOF

过去 rewrite 期间的增量数据需要在内存中保留,rewrite 结束后再把这部分增量数据写入新的 AOF 文件中以保证数据完整性

AOF rewrite 额外消耗内存和磁盘 IO,是 Redis AOF rewrite 的痛点,之前进行过多次改进但是资源消耗的本质问题一直没有解决

Multi-part AOF 机制采用 base(全量数据)+inc(增量数据) 独立文件存储,彻底解决内存和 IO 资源的浪费,同时也支持对历史 AOF 文件的保存管理,结合 AOF 文件中的时间信息还可以实现 PITR 按时间点恢复,进一步增强了 Redis 的数据可靠性,满足用户数据回档等需求

aof 文件由一个变成了多个,主要分为两种类型: 基本文件 (base files)、增量文件 (incr files),复数形式说明每一类文件不仅仅只有一个。此外还引入了一个清单文件 (manifest) 用于跟踪文件以及文件的创建和应用顺序 (恢复)

Sharded-pubsub

Redis 2.0 支持发布订阅机制,但cluster 集群模式下最为显著的就是在大规模集群中带来的广播风暴

pubsub 按 channel 进行发布订阅,然而集群模式下 channel 不被当做数据处理,也即不会参与到 hash 值计算无法按 slot 分发,所以在集群模式下 Redis 对用户发布的消息采用的是在集群中广播的方式

sharded-pubsub 把 channel 按分片来进行分发,一个分片节点只负责处理属于自己的 channel 而不会进行广播,以很简单的方法避免了资源的浪费

ACLV2

精细化权限管理

listpack 替代 ziplist

listpack用来替代ziplist,7.0没有ziplist的配置了(6.0版本仅部分数据类型作为过渡阶段在使用)