Redis重大版本整理(Redis2.6-Redis7.0)

Redis借鉴了Linux操做系统对于版本号的命名规则:node 版本号第二位若是是奇数,则为非稳定版本(例如2.7、2.9、3.1),若是是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。

当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本,因此咱们在生产环境一般选取偶数版本的Redis。

下面是重大版本新功能的归纳:

Redis7.0
  • 新增Function自定义函数库,函数库支持持久化与可复制

  • 支持Client-Eviction

  • 支持Sharded-Pub/Sub

  • 支持命令执行耗时直方图

  • 支持子命令级别的性能统计

  • 支持Global Replication Buffer

  • 使用 Multi-Part AOF 机制避免 AOF 重写机制的开销;

  • 对 RDB 文件使用了新版本格式(10),与旧版本不兼容;

  • 在读取老的RDB文件格式的时候将ziplist转换为listpack,这种转换发生于两种情况之下:从磁盘读取文件或者从一个主节点进行复制文件的时候;

  • ACL: 细粒度基于 key 的权限控制,通过 selector 支持多种命令规则,支持对Pub/Sub channel的权限控制。

  • 主从复制:TTL 总是被复制为绝对(非相对)毫秒时间

  • 不再支持 gopher协议,删除 STRALGO 命令

  • 当在配置文件中设置replica-serve-stale-data=no, 当主节点不再提供服务时,PING命令得不到返回值;

  • 在redis.conf配置文件中,protected-mode 默认更改为yes,只有当你希望你的客户端在没有授权的情况下可以连接到Redis server的时候可以将protected-mode设置为no;

  • Lua脚本(脚本本身代码)不再支持持久化和复制,仅对命令执行结果进行持久化和复制

Redis6.0
  • 多线程 IO(Threaded I/O)
  • 众多新模块(modules)API
  • 更好的过期循环(expire cycle)
  • 支持SSL
  • ACLs 权限控制
  • RESP3 协议
  • 客户端缓存(Client side caching)
  • 无盘复制&PSYNC2
  • Redis-benchmark支持集群
  • Redis-cli 优化、重写 Systemd 支持
  • Redis 集群代理与 Redis 6 一同发布(但在不同的 repo)
  • RDB更快加载
  • SRANDMEMBER和类似的命令具有更好的分布
  • STRALGO 命令
  • 带有超时的 Redis 命令更易用
Redis5.0
  • 新的流数据类型(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 版本
  • 引入 CLIENT UNBLOCK 和 CLIENT ID
  • 新增 LOLWUT 命令 http://antirez.com/news/123
  • 在不存在需要保持向后兼容性的地方,弃用 “slave” 术语
  • 网络层中的差异优化Lua 相关的改进
  • 引入动态的 HZ(Dynamic HZ) 以平衡空闲 CPU 使用率和响应性
  • 对 Redis 核心代码进行了重构并在许多方面进行了改进
Redis4.0

可能出乎不少的意料,Redis3.2以后的版本是4.0,而不是3.4、3.6、3.8。

通常这种重大版本号的升级也意味着软件或者工具自己发生了重大改革。下面是Redis4.0的新特性:

  • 提供了模块系统,方便第三方开发者拓展Redis的功能。
  • PSYNC2.0:优化了以前版本中,主从节点切换必然引发全量复制的问题。
  • 提供了新的缓存剔除算法:LFU(Last Frequently Used)(注意LFU和LRU算法的不同之处,LRU的淘汰规则是基于访问时间,而LFU是基于访问次数的),并对已有算法进行了优化。
  • 提供了非阻塞del和flushall/flushdb功能,新添加了 UNLINK 命令, 这个命令是 DEL 命令的异步版本, 它可以将删除指定键的操作放在后台线程里面执行
  • 提供了memory命令,实现对内存更为全面的监控统计。
  • 提供了交互数据库功能,实现Redis内部数据库的数据置换。
  • 提供了RDB-AOF混合持久化*格式,充分利用了AOF和RDB各自优点。
  • Redis Cluster 兼容NAT和Docker
Redis3.2

Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征以下:

  • 添加GEO相关功能。
  • SDS在速度和节省空间上都作了优化。
  • 支持用upstart或者systemd管理Redis进程。
  • 新的List编码类型:quicklist
  • 从节点读取过时数据保证一致性。
  • 添加了hstrlen命令。
  • 加强了debug命令,支持了更多的参数。
  • Lua脚本功能加强。
  • 添加了Lua Debugger。
  • config set 支持更多的配置参数。
  • 优化了Redis崩溃后的相关报告。
  • 新的RDB格式,可是仍然兼容旧的RDB
  • 加速RDB的加载速度。
  • spop命令支持个数参数。
  • cluster nodes命令获得加速。
  • Jemalloc更新到4.0.3版本。
Redis3.0(里程碑)

Redis3.0在2015年4月1日正式发布,相比于Redis2.8主要特性以下:

Redis最大的改动就是添加Redis的分布式实现Redis Cluster。

  • Redis Cluster:Redis的官方分布式实现。
  • 全新的embedded string对象编码结果,优化小对象内存访问,在特定的工做负载下载速度大幅提高。
  • Iru算法大幅提高。
  • migrate链接缓存,大幅提高键迁移的速度。
  • migrate命令两个新的参数copy和replace。
  • 新的client pause命令,在指定时间内中止处理客户端请求。
  • bitcount命令性能提高。
  • config set设置maxmemory时候能够设置不一样的单位(以前只能是字节)。
  • Redis日志小作调整:日志中会反应当前实例的角色(master或者slave)。
  • incr命令性能提高。
Redis2.8

Redis2.8在2013年11月22日正式发布,经历了24个版本,到2.8.24版本,相比于Redis2.6,主要特性以下:

  • 添加部分主从复制的功能,在必定程度上下降了因为网络问题,形成频繁全量复制生成RDB对系统形成的压力。
  • 尝试性的支持IPv6.
  • 能够经过config set命令设置maxclients。
  • 能够用bind命令绑定多个IP地址。
  • Redis设置了明显的进程名,方便使用ps命令查看系统进程。
  • config rewrite命令能够将config set持久化到Redis配置文件中。
  • 发布订阅添加了pubsub。
  • Redis Sentinel第二版,相比于Redis2.6的Redis Sentinel,此版本已经变成生产可用。
Redis2.6

Redis2.6在2012年正是发布,经历了17个版本,到2.6.17版本,相对于Redis2.4,主要特性以下:缓存

  • 服务端支持Lua脚本。网络
  • 去掉虚拟内存相关功能。分布式
  • 放开对客户端链接数的硬编码限制。工具
  • 键的过时时间支持毫秒。性能
  • 从节点支持只读功能。优化
  • 两个新的位图命令:bitcount和bitop。
  • 加强了redis-benchmark的功能:支持定制化的压测,CSV输出等功能。
  • 基于浮点数自增命令:incrbyfloat和hincrbyfloat。
  • redis-cli可使用–eval参数实现Lua脚本执行。
  • shutdown命令加强。
  • 重构了大量的核心代码,全部集群相关的代码都去掉了,cluster功能将会是3.0版本最大的亮点。
  • info能够按照section输出,而且添加了一些统计项
  • sort命令优化

Redis 4.0 新功能简介 https://blog.huangz.me/diary/2016/redis-4-outline.html

Redis 5.0新功能介绍 https://juejin.im/post/6844903832997085197

Redis 6.0 新特性 - 多线程连环 13 问 https://xie.infoq.cn/article/fdc6387f6eca550b8e3a1b0ea
https://developer.aliyun.com/article/763834

Redis 7.0 新功能新特性总览 https://blog.csdn.net/qianshangding0708/article/details/124580604

<think>好的,我现在需要回答用户关于Redis结合Lua使用的情况以及是否建议现在使用的问题。首先,我需要回忆Redis和Lua结合的基本知识,确认它们的常见应用场景和优势。 用户的问题有两个部分:使用是否普遍,以及当前是否建议使用。我应该先介绍Redis为何会集成Lua,比如为了支持原子性操作和复杂命令的封装。然后说明Lua在Redis中的使用方式,比如通过EVAL和EVALSHA命令。 接下来,需要考虑使用Lua的好处,比如原子性执行、减少网络开销、性能优化等。同时也要提到可能的缺点,比如调试困难、Lua脚本的复杂度管理,以及版本升级时的兼容性问题。 然后,应该讨论当前的实际应用情况,是否有广泛采用,比如大型项目或者高并发场景中的使用案例。同时,需要提到Redis版本支持情况,确保用户了解不同版本可能存在的差异,比如从Redis 2.6开始支持Lua,后续版本的改进。 还要考虑是否建议使用,这时候需要权衡利弊,根据使用场景来判断。比如在高并发需要原子操作时推荐使用,但也要注意脚本编写的规范和复杂度控制。 可能还需要提到一些最佳实践,比如保持脚本简洁、使用SCRIPT LOAD和EVALSHA来减少带宽、处理错误的方法等。同时,注意Lua脚本的沙盒环境,不能执行某些操作,比如调用系统命令,这可能会影响安全性和功能。 最后,要确保回答结构清晰,分点列出优缺点、使用场景和建议,让用户能够逐步理解。同时要使用中文,避免技术术语过于晦涩,必要时进行解释。</think>Redis 结合 Lua 的使用在业界非常普遍,尤其在需要**原子性操作**或**复杂业务逻辑封装**的场景中。以下是逐步分析: --- ### 一、**Redis 为何集成 Lua?** 1. **原子性保证** Redis 单线程特性 + Lua 脚本的原子执行 = 避免竞态条件。例如: ```lua -- 扣减库存操作(伪代码) if redis.call('GET', 'stock') > 0 then redis.call('DECR', 'stock') return 'SUCCESS' else return 'FAIL' end ``` $$ \text{执行过程无中断,保证一致性} $$ 2. **减少网络开销** 将多个命令合并为一个脚本,减少客户端与服务器间的通信次数。 3. **灵活性** Lua 支持复杂逻辑(如循环、条件判断),弥补 Redis 命令的局限性。 --- ### 二、**实际应用场景** 1. **限流器** 例如滑动窗口限流,通过 Lua 计算时间窗口内的请求量。 2. **秒杀系统** 库存扣减、防止超卖。 3. **分布式锁** 实现锁的续期(看门狗机制)或释放锁的原子性判断。 4. **复杂计算** 如集合运算、统计等,直接在服务端完成。 --- ### 三、**当前是否建议使用?** #### ✅ **推荐使用的情况** - **需要原子性操作**:如事务性需求,避免多命令竞态问题。 - **高频调用场景**:通过脚本减少网络往返时间(RTT)。 - **逻辑稳定且轻量**:脚本不宜过于复杂,避免阻塞 Redis 主线程。 #### ⚠️ **注意事项** 1. **脚本复杂度控制** Lua 脚本执行是单线程的,长时间运行会阻塞其他操作。建议: - 使用 `SCRIPT KILL` 终止长脚本(非写操作)。 - 通过 `redis.set_repl(redis.REPL_NONE)` 避免主从同步延迟。 2. **调试困难** Redis 不提供 Lua 调试工具,需通过日志或外部测试。 3. **版本兼容性** Redis 5.0+ 支持 Function(更模块化的脚本管理),建议新项目优先使用 Function。 --- ### 四、**最佳实践** 1. **使用 `EVALSHA` 替代 `EVAL`** 预加载脚本生成 SHA1 哈希,减少传输开销。 ```bash redis-cli SCRIPT LOAD "return 'hello'" # 返回 sha1 值后调用 redis-cli EVALSHA <sha1> 0 ``` 2. **错误处理** Lua 中通过 `redis.pcall` 捕获异常,避免脚本中断。 3. **禁用高危操作** Redis 禁用了 Lua 的部分系统调用(如执行文件 IO),确保安全性。 --- ### 五、**总结** - **多吗?** → 多,尤其在原子性和高性能场景中广泛应用。 - **建议吗?** → **建议**,但需遵循轻量化、可维护性原则,避免过度依赖复杂脚本。 - **替代方案** → Redis Function(7.0+)、事务(MULTI/EXEC)适用于简单场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值