Redis中的 大/热 key问题 ,如何解决(面试版)

big key 

什么是 big key?

big key:就是指一个内存空间占用比较大的键(Key)

造成的问题:

  1. 内存分布不均。在集群模式下,不同 slot分配到不同实例中,如果大 key 都映射到一个实例,则分布不均,查询效率也会受到影响。
  2. 由于 Redis 单线程执行命令,操作大 Key 时耗时较长,从而导致 Redis 出现其它命令阻塞的问题。
  3. 大Key对资源的占用巨大,在进行网络 I/O 传输的时候,导致你获取过程中产生的网络流量较大,从而产生网络传输时间延长甚至网络传输发现阻塞的现象,例如一个 key 2MB,请求个 1000 次 2000 MB。
  4. 客户端超时。因为操作大 Key 时耗时较长,可能导致客户端等待超时。

如何判断是否是big key?

大 Key 可能出现在不同的场景中,不过其本质都是相同的,就是对应的值所占内存非常大,但是要占用多少内存才算大key这没有绝对的说法,主要还是取决于具体的场景以及应用需求,例如:

set key "大型字符串,xxxxxx······(此处省略无数个字符)"
HMSET student:8927 name "big" nickname "大型哈希表" 

 到底占用多少内存才算得上是 big key 呢?这个没有一个绝对的说法,主要取决于具体的场景以及应用需求。参考阿里云redis文档:

使用bigkeys命令查询bigkeys

这个是 Redis 内置的指令,直接在 Redis 的客户端 redis-cli 中就可以使用,该命令可以获取 Redis的整体信息,并且显示每种类型数据中最大的 Key

如何解决 big key问题?

开发方面:

  1. 对要存储的数据进行压缩,压缩之后再进行存储
  2. 大化小,即把大对象拆分成小对象,即将一个大 Key 拆分成若干个小 Key,降低单个 Key 的内存大小
  3. 使用合适的数据结构进行存储,比如一些用 String 存储的场景,可以考虑使用 Hash、Set 等结构进行优化

业务层面:

  1. 根据实际情况,调整存储策略,只存一些必要的数据
  2. 优化业务逻辑,从根源上避免大 Key 的产生

数据分布方面:

  1. 采用 Redis 集群方式进行 Redis 的部署,然后将大 Key 散落到不同的服务器上面,加快响应速度

热key

什么是热key

热key:通常是key的访问频率占比过大,或带宽占比过大的key

热key导致的问题:因为 Redis 的读写是单线程执行的,所以热点 key 可能会影响 Redis 的整体效率,消耗大量的 CPU 资源,从而降低 Redis 的整体吞吐量。集群环境下会使得流量不均衡,从而导致读写热点倾斜问题的发生。

如何解决热Key问题

采用多级缓存

  • 例如使用本地缓存,在应用层就返回数据,避免请求再发送到 Redis。
  • 或者使用前端缓存,例如将数据存储到浏览器中,这样一段时间内请求都不需要发送到后端。
  • 或者使用 CDN 缓存之类的,总之设置多级缓存,设定好业务允许的过期时间,分流请求,均分压力。

热点 key 拆分

如果某个Key包含了大量的数据,可以将其拆分成多个Key。例如,将一个大的List拆分成多个小的List,并且采用不同的Key

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值