在工作中Redis已经成为必备的一款高性能的缓存数据库,但是在实际的使用过程中,我们常常会遇到两个常见的问题,也就是文章标题所说的大 key与热 key。
大 key 指的是一个键中包含了大量的数据。(总结一个字就是大)
热 key 指的是频繁访问的键。(总结就是热,访问频繁。)
key 的大与不大,热与不热要根据自己的业务,从实际情况进行评估。
大key 与 热key 都会给 Redis 实例造成一系列的影响,如内存占用过高,CPU 负载增加,持久化时间变长,性能下降等。
产生 大key 的原因有很多种,下面咱就一起看一下工作中经常遇到的这几种。
(1) 存储大量数据
存储了大量数据也是我们经常遇到 大key 的最多的原因了。
比如 String 类型直接保存了一个大的文本或者二进制数据;Hash 结构中存储大量的键值对。
SET zuiyu_large_text_key "very large text content..."
HMSET zuiyu_large_hash_key field1 value1 field2 value2 ... fieldN valueN
(2) 缓存时间设置不合理
缓存时间设置不合理这个造成 大key 的原因大概是个隐藏挺深的老 bug,有的业务场景,使用 Redis 缓存数据,业务是定时往该 key 上写数据,由于该 key 是没有设置缓存时间的造成这个 key 随着时间的流逝,占用的内存越来越多,对于该点,只需要设置一个合理的过期时间即可。
前提是多次写入不是覆盖,而是追加才会有该问题。
SETEX zuiyu_key_with_expiry value 3600 # 设置过期时间为3600秒
(3) 数据结构使用不当
在使用 List 数据结构存储数据时,重复的添加数据,造成该 key 越来越大,实际上业务是不需要有重复的数据存在的。
List
LPUSH zuiyu_large_list_key value
(4) 小结
大key 的产生根本原因就是在一个 key 下面存储的数据多了。
(1) 热门数据
热key 的产生一般意味着系统访问火爆了,但是火爆的只是其中一个点或者n个点。类似微博中某个明星的瓜,当上头条的时候,大量的人去访问,造成了该明星所对应的 key 成为 热key。
(2) 频繁的更新
某些业务场景,单位时间内一直频繁的对 key 进行更新,该 key 也会成为 热key。
(3) 热门搜索
类似于第一中的热门数据,产生了热门数据,该数据对应的热门关键词也被大量的用户去搜索,造成该关键词被频繁访问,最终导致该 key 也称为 热key。
(4) 小结
热key 的产生无外乎热门数据,热门数据产生的热门关键词以及对同一个 key 在某段时间内的频繁访问。
针对 大key 我们要尽可能的避免同一个 key 下大量的数据。针对 热key 我们要合理设置过期时间,增加布隆过滤器等技术实现无效请求过滤,对即将到来的数据进行缓存预热、热点数据分片处理。
如果觉得博客文章对您有帮助,异或土豪有钱任性,可以通过以下扫码向我捐助。也可以动动手指,帮我分享和传播。您的肯定,是我不懈努力的动力!感谢各位亲~