BIG KEY
作者:w08e
Big key , hot key 傻傻分不清楚
什么是大key
Redis 中的 "大 Key" 通常指的是一个占用较大内存空间的键(Key)。这可能会对 Redis 的性能产生负面影响,因为大 Key 可能导致内存碎片化、删除延迟以及网络传输时间延长等问题。
大 Key 可能出现在不同的场景中,例如:
- 大型字符串
- 大型列表
- 大规模哈希表
可以通过redis内置bigkeys
获取整体统计情况
风险
大 Key 可能会导致以下问题:
-
内存碎片化:大 Key 占用的内存块较大,可能导致内存碎片化,从而影响 Redis 的内存使用效率。
-
网络传输延迟:传输大 Key 的数据可能会导致较长的网络传输时间,特别是在进行备份、迁移或从节点同步等操作时。
-
删除阻塞:在删除大 Key 的过程中,可能会导致其他操作的响应时间变长。这是因为在删除大 Key 时,需要遍历键中的所有元素,并在内部进行相应的清理操作。在此期间,其他操作会等待删除操作完成。
-
持久化延迟:如果 Redis 实例使用了持久化机制(如 RDB 快照或 AOF 日志),删除大 Key 可能会导致持久化操作的延迟,因为持久化过程也需要处理大 Key 的数据。
解决
HOT KEY
什么是热key
与大 Key 一样,热 Key 没有一个明确定义,通常情况下,当某个 Key 的请求频率显著高于其他 Key 时,我们就可以将其视为热 Key。
热 Key 可能会引发多种问题,包括占用大量的 CPU 资源从而影响 Redis 的吞吐量,或者在集群中可能导致流量不均衡,形成读写热点问题等。
Redis 从版本 4.0 开始引入了 hotkey
命令,允许通过客户端的 redis-cli --hotkeys
命令扫描库中的所有热点 Key。
解决
-
读写分离
-
热key备份
我们可以将热 Key 复制到多个 Redis 实例,并在请求时随机选择一个备份实例来分散请求压力。
比如,假如现有热 Key "foo",我们将其复制到三个分片中,分别叫做 foo_1、foo_2 与 foo_3,当请求 "foo" 时,我们为其随机添加一个后缀,从而实现分散请求压力的效果:
-
二级缓存
对于一些热 Key,我们可以考虑使用一些本地缓存工具(比如 Guava 或 Ehcache) 直接将其缓存到 JVM 内存中,从根本上避免对 Redis 造成压力。
不过,这种方案下缓存会占用额外的运行时内存,因此需要有选择进行缓存,以避免占用过多内存资源。并且当与 Redis 缓存共用时,也要考虑数据一致性问题。