Redis4.0新特性--概述
Redis4.0版本增加了很多新的特性,如:
- Redis Memeory Command:详细分析内存使用情况、内存使用诊断、内存碎片回收;
- PSYNC2:解决failover和从实例重启不能部分同步;
- LazyFree: 再也不用怕big key的删除引起集群故障切换;
- LFU: 支持近似的LFU内存淘汰算法;
- Active Memory Defragmentation:内存碎片回收效果很好(实验阶段);
- Modules: Redis成为更多的可能(觉得像mongo/mysql引入engine的阶段);
一、Redis Memeory Command
redis-4.0之前只能通过info memory来了解redis内部有限的内存信息,4.0提供了memory命令,帮助用户全面了解redis的内存状态。
通过memory helpin 命令查看memory命令帮助文档:
1) "MEMORY DOCTOR - Outputs memory problems report"
2) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
3) "MEMORY STATS - Show memory usage details"
4) "MEMORY PURGE - Ask the allocator to release memory"
5) "MEMORY MALLOC-STATS - Show allocator internal stats"</pre>
二、PSYNC2
部分重新同步(partial resync)增加版本;主要解决Redis运维管理过程中,从实例重启和主实例故障切换等场景带来的全量重新同步(full resync)问题。
三、LazyFree
Lazyfree机制可以避免del、flushdb/flushall、rename等命令引起的redis-server阻塞,提高服务稳定性。
lazy free应用于被动删除中,目前有4种场景,每种场景对应一个配置参数; 默认都是关闭,在生产环境需结合实际情况开启:
# 针对redis内存使用达到maxmemory,并设置有淘汰策略时,在被动淘汰键时,是否采用lazy free机制
# 不建议开启,可能使淘汰ley的内存释放不及时导致redis内存超用
lazyfree-lazy-eviction no
# 针对设置TTL且过期的key,被redis清理时是否采用lazy free机制
# 建议开启
lazyfree-lazy-expire yes
# 针对带有隐式del的操作命令(例如rename命令),是否采用lazy free机制
# 建议开启
lazyfree-lazy-server-del yes
# 针对slave全量数据同步、加载master的RDB文件之前的flushall操作来清理自己的数据场景,是否采用lazy free机制
# 若内存变动不大,建议可开启
slave-lazy-flush no
1 、del命令
在redis-4.0之前,redis执行del命令,会在释放掉key的所有内存以后才会返回OK,这在key比较大的时候(比如说一个hash里头有1000W条数据),其他连接可能要等待很久。
为了兼容已有的del语义,redis-4.0引入unlink命令,效果以及用法和del完全一样,但内存释放动作放到后台线程中执行。
UNLINK key [key ...]
2、flushdb/flushall命令
flushdb/flushall在redis-4.0中新引入了选项,可以指定是否使用Lazyfree的方式来清空整个内存。
FLUSHALL [ASYNC]
FLUSHDB [ASYNC]
3、rename命令
针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作。
例如:执行 rename oldkey newkey 时,如果newkey已经存在,redis会先删除,这也会引发上面提到的删除大key问题。对此可以设置lazyfree-lazy-server-del参数:
如果这些目标键是一个big key,那就会引入阻塞删除的性能问题。 此参数设置就
<pre style="margin: 10px 0px 0px;">lazyfree-lazy-server-del yes/no</pre>
四、LFU
redis-4.0新增了 allkey-lfu 和 volatile-lfu 两种数据逐出策略,同时还可以通过object命令来获取某个key的访问频度。
object freq user_key
基于LFU机制,用户可以使用 scan + object freq 来发现热点key,当然redis也一起发布了更好用的:
redis-cli --hotkeys
五、持久化
redis有两种持久化的方式——RDB和AOF其中RDB是一份内存快照AOF则为可回放的命令日志他们两个各有特点也相互独立。4.0开始允许使用RDB-AOF混合持久化的方式结合了两者的优点通过aof-use-rdb-preamble配置项可以打开混合开关。