关于Bigkey对redis 的影响和解决方法

  本文内容属于《redis开发与运维》读书笔记。


  bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB。如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。

  字符串类型:体现在单个value值很大,一般认为超过10KB就是
bigkey,但这个值和具体的OPS相关。
  
  非字符串类型:哈希、列表、集合、有序集合。
  

  bigkey的危害

  
  ·内存空间不均匀(平衡):例如在Redis 集群中,bigkey会造成各个节点的内存空间使用不均匀。
  
  超时阻塞:由于Redis时单线程,对bigkey进行操作时,不仅耗时并且会占用资源,也就意味着Redis阻塞的可能性会增大。
  
  网络拥塞:每次获取bigkey产生的网络流量较大,假设一个bigkey为1MB,每秒访问量为500,那么每秒产生500MB的流量,对于普通的千兆网卡(按照字节算是128MB/s)的服务器来说,这是不能接受的,而且一般服务器会采用单机多实例的方式来部署,也就是说一个bigkey可能会对其他实例造成影响。
  
  Tip:bigkey并不是存在就会对redis造成影响的额,比如这个bigkey虽然存在但是几乎没有请求去访问,那么只会有内存空间不均匀的问题,相对于另外两个问题就大概率不会发生,但是如果bigkey是一个热点key(访问次数及其频繁),那么其造成的影响将是非常恶劣的,所以在实际开发和运维时一定要密切关注bigkey的存在。
  

  bigkey的处理方法

  
  在实际生产环境中发现bigkey的两种方式如下:
  
  被动收集:许多人确实可能不重视bigkey,但是这种bigkey一旦大量访问,很可能就会带来命令慢查询和网卡跑满问题,开发人员通过对异常的分析通常能找到异常原因可能是bigkey,这种方式虽然不推荐,但是在实际生产环境中却大量存在,建议修改Redis客户端,当抛出异常时打印出所操作的key,方便排查bigkey问题。
  
  主动检测:scan+debug object:如果怀疑存在bigkey,可以使用scan命令渐进的扫描出所有的key,分别计算每个key的serializedlength,找到对应bigkey进行相应的处理和报警,这种方式是比较推荐的。

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