背景
意大利作者antirez和朋友共建了一个网站,网站访问量越来越大。受盈利模式的影响,没有通过提升硬件配置,antirez 而是另寻办法,通过提升列表操作的性能来解决负载问题。决定写一个具有列表结构的内存数据库原型。这个数据库原型支持 O(1) 复杂的推入和弹出操作,将数据存到内存,从而不受磁盘io的影响,以极快的速度执行针对列表的push和prop出作。09年用C 语言重写了这个内存数据库,并且加上了持久化的功能,从而redis诞生。至今已发展13年,以精简、高效、稳定的特性,在互联网内存数据库中变得越来越流行。现已发展至7.0的版本,本文将阐述各个版本的迭代和新特性
版本回顾
Redis 2.6
- 服务端支持Lua脚本。
- 去掉虚拟内存相关功能。
- 放开对客户端连接数的硬编码限制。
- 键的过期时间支持毫秒。
- 从节点提供只读功能。
- 两个新的位图命令:bitcount和bitop。
- 增强了redis-benchmark的功能:支持定制化的压测,CSV输出等功能。
- 基于浮点数自增命令:incrbyfloat和hincrbyfloat。
- redis-cli可以使用--eval参数实现Lua脚本执行。
- shutdown命令增强。
- info可以按照section输出,并且添加了一些统计项。
- sort命令优化。
Redis 2.8
- 添加部分主从复制的功能,在必定程度上下降了因为网络问题,形成频繁全量复制生成RDB对系统形成的压力。
- 尝试性的支持IPv6.
- 能够经过config set命令设置maxclients。
- 能够用bind命令绑定多个IP地址。
- Redis设置了明显的进程名,方便使用ps命令查看系统进程。
- config rewrite命令能够将config set持久化到Redis配置文件中。
- 发布订阅添加了pubsub。
- Redis Sentinel第二版,相比于Redis2.6的Redis Sentinel,此版本已经变成生产可用。
Redis 3.0
该版本是一个里程碑的版本,新增了Redis集群的分布式方案
- Redis Cluster:Redis的官方分布式实现。
- 全新的embedded string对象编码结果,优化小对象内存访问,在特定的工做负载下载速度大幅提高。
- Iru算法大幅提高。
- migrate链接缓存,大幅提高键迁移的速度。
- migrate命令两个新的参数copy和replace。
- 新的client pause命令,在指定时间内中止处理客户端请求。
- bitcount命令性能提高。
- config set设置maxmemory时候能够设置不一样的单位(以前只能是字节)。
- Redis日志小作调整:日志中会反应当前实例的角色(master或者slave)。
- incr命令性能提高。
- 添加GEO相关功能。
- 新的List编码类型:quicklist。
Redis 4.0
该版本提供了许多新的特性,如新增了非常实用的lazy free特性,当删除键的时候,redis提供异步延时释放key内存的功能,把key释放操作放在bio(Background I/O)单独的子线程处理中,减少删除big key对redis主线程的阻塞。有效地避免删除big key带来的性能和可用性问题
- 提供了模块系统,方便第三方开发者拓展Redis的功能。
- PSYNC2.0:优化了以前版本中,主从节点切换必然引发全量复制的问题。
- 新增了非常实用的lazy free特性,从根本上解决Big Key(主要指定元素较多集合类型Key)删除的风险
- 提供了新的缓存剔除算法:LFU(Last Frequently Used)(注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的),并对已有算法进行了优化。
- 提供了非阻塞del和flushall/flushdb功能,新添加了 UNLINK 命令, 这个命令是 DEL 命令的异步版本, 它可以将删除指定键的操作放在后台线程里面执行
- 提供了memory命令,实现对内存更为全面的监控统计。
- 提供了交互数据库功能,实现Redis内部数据库的数据置换。
- 提供了RDB-AOF混合持久化*格式,充分利用了AOF和RDB各自优点。
- Redis Cluster 兼容NAT和Docker。
Redis 5.0
该版本最大的变化,就是新增了stream数据类型
- 新的流数据类型(Stream data type)(支持多播的可持久化的消息队列) https://redis.io/topics/streams-intro
- 新的 Redis 模块 API:定时器、集群和字典 API(Timers, Cluster and Dictionary APIs)
- RDB 增加 LFU 和 LRU 信息
- 集群管理器从 Ruby (redis-trib.rb) 移植到了redis-cli 中的 C 语言代码
- 新的有序集合(sorted set)命令:ZPOPMIN/MAX 和阻塞变体(blocking variants)
- 升级 Active defragmentation 至 v2 版本增强 HyperLogLog 的实现
- 更好的内存统计报告
- 许多包含子命令的命令现在都有一个 HELP 子命令
- 客户端频繁连接和断开连接时,性能表现更好
- 许多错误修复和其他方面的改进
- 升级 Jemalloc 至 5.1 版本
Redis 6.0
该版本引入了网络IO多线程,Redis模型主要分为网络模块和命令处理模块,作者认为正常情况下,redis 单线程模型中,网络模块往往成为瓶颈高发地;
- 多线程 IO(Threaded I/O)
- 众多新模块(modules)API
- 更好的过期循环(expire cycle)
- 支持SSL
- ACLs 权限控制
- RESP3 协议
- 客户端缓存(Client side caching)
- 无盘复制&PSYNC2
- Redis-benchmark支持集群
- Redis-cli 优化、重写 Systemd 支持
- Redis 集群代理与 Redis 6 一同发布
- SRANDMEMBER和类似的命令具有更好的分布
- STRALGO 命令
- 带有超时的 Redis 命令更易用
Redis 7.0
该版本就是重构了dict结构,内存占用更小,内存成本会大大减少,RDB版本不向下兼容
主要特性
- 新增function
- 新的RDB版本,版本号为version10,该版本不与之前版本兼容
- 采用切片式AOF,减少AOF重写的问题
- 使用新的数据结构listpack完全代替ziplst
- 内存和性能方面有大的提升,内存更加节省
- 新增一些新的用户命令和选项
- 新增一些info信息
主要变化
- Function:相比于lua(since 2.8)、module(since 4.0),Redis Gears(one module)它是一种新的服务端脚本编程方式,解决了以往的一些痛点。
- 新的AOF模式:将AOF进行切片(譬如按照大小),主要解决AOF重写对可用性干扰,同时还在日志中添加了元信息(时间戳)可以进行定点恢复(point-in-time recovery )。这个功能是阿里云团队提供的
- maxmemory-client配置: 用来限制全部客户端的总内存(防止溢出),此前版本中只能针对单个客户端的输入输出缓冲区进行限制。
- Redis Cluster: 支持hostname配置(之前版本只支持IP)、较好支持pubsub(之前会有消息扩散)、在cluster bus链接管理做了优化防止内存泄露。
- ACL:更细粒度的基于key的权限控制、基于selectors的命令权限控制。
- 使用新的数据结构listpack完全代替ziplist:包含encoding返回类型、hash/set/zset内部实现方式和配置等
- repl-diskless-sync:无盘复制默认为yes
- config set maxmemory执行后立即返回,不等evict完成
- jemalloc升级到5.2.1
展望和拓展
多模服务
Redis受欢迎主要原因是极高的性能以及丰富、方便使用的数据结构,这些简单好用的数据结构大幅度降低开发业务复杂度。大家都在紧贴用户需求,开发更多的数据结构。
- Redislabs为代表的厂商正在大力的丰富Redis的数据结构(modules),如RedisSearch、Redis-Json、RedisGraph、RedisTimeSeries和RedisBloom等。
- 以阿里云云厂商代表。支持多种增强型数据结构模块(modules),包括TairString(含CAS和CAD命令)、TairHash、TairGIS、TairBloom、TairDoc、TairTS、TairCpc、TairZset、TairRoaring和TairSearch,使业务无需再关心存储的结构和时效性,能够极大提升业务开发效率。
一致性发展
原生的Redis仍旧采用异步复制,数据修改操作只要在本地执行完成就会返回结果,相比于其他数据库没有提供副本间数据强一致的语义。在对数据可靠性有极高要求的用户(例如金融行业,和传统行业)中不会被完全接纳。
写在最后
Redislabs在2021年8月正式更名为Redis,可能也会像MongoDB,ElasticSearch一样走向彻底的商业化。2022年是一个充满无数个变化的一年,数据库引来蓬勃发展,百花齐放。Redis 7.0已发布,在性能和内存优化上很大的提升,依然秉着作者初心,用技术优化成本,相必Redis 7.0也会大放光彩,变得越来越流行。