redisbigkey

一、Big Key

通俗来讲,Big Key就是key所对应的value很大,所占用redis的空间很大,其实本质上是大value的问题。(与key不同,value往往不受控制)。

redis中这些value很大,在序列化和反序列化的过程中会花费很长的时间,因此再操作redis的Big Key的时候,通常就比较耗时,有可能导致redis发生阻塞,从而降低redis的性能。

用几个实际的例子对大key的特征进行描述:

  • 一个String类型的Key,它的值为5MB(数据过大)
  • 一个List类型的Key,它的列表数量为20000个(列表数量过多)
  • 一个Zset类型的Key,它的成员数量为10000个(成员数量过多)
  • 一个Hash格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)

在实际业务中,大Key的判定仍然需要根据Redis的实际使用场景,业务场景来进行综合判断,通常会以数据大小与成员数量来判定。

二、Big Key产生场景

  1. redis数据结构使用不恰当

    将redis用在并不适合其能力的场景,造成Key的value过大,如使用string类型的Key存放大体积二进制文件型数据。

  2. 未及时清理的垃圾数据

    没有对无效数据进行定期清理,造成如HASH类型Key中的成员持续不断的增加。即一直往value塞数据,却没有删除机制

  3. 对业务预估不准确

    业务上线前规划设计考虑不足,没有对key中的成员进行合理的拆分,造成个别key中的成员数量过多

  4. 假设我们使用List数据结构保存某个明星/网红的粉丝,或者保存热点新闻的评论列表,因为粉丝数量巨大,热点新闻因为点击率、评论数会很多,这样List集合中存放的元素就会很多,可能导致value过大,进而产生Big Key问题。

三、Big Key的危害

  1. 阻塞请求

    Big Key对应的value较大,我们对其进行读写的时候,需要花费较长的时间,这样就有可能阻塞后续的请求处理。Redis的核心是单线程,并且线程中请求任务的处理是串行的,前面的任务完不成,后面的任务就处理不了了。

  2. 内存增大

    读取Big Key耗费的内存比正常Key会有所增大,如果不断的增大,可能会引发OOM(内存溢出),或达到redis的最大内存maxmemory设置引发写阻塞或重要key被逐出

  3. 阻塞网络

    读取单value较大时会占服务器网卡较多的宽带,自身变慢的同时可能会影响该服务器上的其他redis实例或者应用

  4. 影响主从同步,主从切换

    删除一个大Key造成主库较长时间的阻塞并引发同步中断或主从切换。

四、识别Big Key

  1. 使用redis自带的指令

    例如可以使用redis官方客户端redis-cli加上–bigkeys参数,可以找到某个实例5中数据类型(Sting, hsh, list, set, zset)的最大key。

    优点:可以在线扫描,不阻塞服务

    缺点:信息较少,内容不够精确

  2. 使用debug object key命令

  3. redis-rdb-tools开源工具

    pas

五、如何解决Big Key问题

  1. 对大Key进行拆分
  2. 对大Key进行清理
  3. 监控redis的内存,网络带宽,超时等指标
  4. 定期清理失效数据
  5. 压缩value

你可能感兴趣的:(redis,redis,数据库,java)