一、redis4.0新功能介绍
Redis4.0新增了非常实用的lazy free特性,从根本上解决Big Key(主要指定元素较多集合类型Key)删除的风险。
一)lazy free介绍
1、lazy free的定义
减少删除big key对redis主线程的阻塞。有效地避免删除big key带来的性能和可用性问题。
2、为什么需要lazy free
Redis是single-thread程序(除少量的bio任务),当运行一个耗时较大的请求时,会导致所有请求排队等待redis不能响应其他请求,引起性能问题,甚至集群发生故障切换。而redis删除大的集合键时,就属于这类比较耗时的请求。通过测试来看,删除一个100万个元素的集合键,耗时约1000ms左右。以下测试,删除一个100万个字段的hash键,耗时1360ms;处理此DEL请求期间,其他请求完全被阻塞。
测试估算的结果如下表:
在redis4.0前,没有lazy free功能;DBA只能通过取巧的方法,类似scan big key,每次删除100个元素;但在面对“被动”删除键的场景,这种取巧的删除就无能为力。
二)redis4.0的新功能
redis-4.0带来的Lazyfree机制可以避免del,flushdb/flushall,rename等命令引起的redis-server阻塞,提高服务稳定性。
1、unlink
在redis-4.0之前,redis执行del命令会在释放掉key的所有内存以后才会返回OK,这在key比较大的时候(比如说一个hash里头有1000W条数据),其他连接可能要等待很久。为了兼容已有的del语义,redis-4.0引入unlink命令,效果以及用法和del完全一样,但内存释放动作放到后台线程中执行。
2、flushdb/flushall
flushdb/flushall在redis-4.0中新引入了选项,可以指定是否使用Lazyfree的方式来清空整个内存。
3、rename
执行 rename oldkey newkey 时,如果newkey已经存在,redis会先删除,这也会引发上面提到的删除大key问题,如果想让redis在这种场景下也使用lazyfree的方式来删除,可以在控制台上打开如下配置。
4、其他场景
某些用户对数据设置过期时间,依赖redis的淘汰机制去删除已经过期的数据,这同样也存在上面提到的问题,淘汰某个大key会导致进程CPU出现抖动,redis-4.0提供了两个配置,可以让redis在淘汰或者逐出数据时也使用lazyfree的方式。
5、LFU&hotkey
redis-4.0新增了 allkey-lfu 和 volatile-lfu 两种数据逐出策略,同时还可以通过object命令来获取某个key的访问频度。
基于LFU机制,用户可以使用 scan + object freq 来发现热点key,当然redis也一起发布了更好用的工具——redis-cli。