什么是大key
redis是key-value映射结构的,一般来说,key设置好大小是固定的,那么只有不断的增大的是value。value很大的映射的是key就是大key。
redis大key影响
- 执行大key命令的客户端本身,耗时明显增加,甚至超时
- 执行大key相关读取或者删除操作时,会严重占用带宽和CPU,影响其他客户端
- 大key本身的存储带来分布式系统中分片数据不平衡,CPU使用率也不平衡
- 大key有时候也是热key,读取操作频繁,影响面会很大
- 执行大key删除时,在低版本redis中可能阻塞线程
这样看来大key的影响还是很明显的,最典型的就是阻塞线程,并发量下降,导致客户端超时,服务端业务成功率下降。
大key问题处理
1. 查找大key
-
.
/redis-cli --bigkeys
-
redis-rdb-tools
2. 处理方法
根据大key的实际用途可以分为两种情况:可删除和不可删除。
- 可删除,惰性删除大key 在数据不丢失的情况下,可以选择惰性删除大key
- 当Redis版本大于4.0时,可使用UNLINK命令安全地删除大Key,该命令能够以非阻塞的方式,逐步地清理传入的Key。
- 当Redis版本小于4.0时,避免使用阻塞式命令KEYS,而是建议通过SCAN命令执行增量迭代扫描key,然后判断进行删除。
- 不可删除,压缩和拆分key
-
当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗。
-
当value是string,压缩之后仍然是大key,则需要进行拆分,一个大key分为不同的部分,记录每个部分的key,使用multiget等操作实现事务读取。
-
当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片。