redis中大key问题的解决思路

redis中如果某一个key-value值过大,在访问量比较高的时候就可能会造成网络带宽不足,例如一个value值存储大小为5MB,同时有5000个并发访问,网络带宽需要209.7 Gbps,这必然会造成网络阻塞。其次redis中是单线程结构如果一个key-value值占用内存过大,传输时占用此线程时间过长,会影响其他数据的读取效率

在解决大key问题时,首先我们的找出大key:

  1. redis-cli --bigkeys命令。可以用来找到某个实例5种数据类型(string、hash、list、set、zset)最大的key。
    • 优点:不阻塞服务
    • 缺点:信息较少(只有各类型最大的key信息),内容不够精确(例如hash/list/set/zset都是以元素个数衡量大key,但实际上元素个数多不代表占用内存大)。
  2. redis-rdb-tools工具。redis实例上执行bgsave,然后对dump出来的rdb文件进行分析。
    • 优点:获取信息更详细
    • 缺点:需要离线操作,获取结果时间较长
  3. 使用实时Top key工具
    • 优点:准确性高、对性能几乎无影响。

    • 缺点:展示的Key数量有一定限制,但能满足常规场景下的需求。

 

所以我们在设计key值时应该尽量避免大key问题的出现,以下是我的解决思路:

1、大key问题我们尽量在设计之初就避免此问题的产生,合理设计业务访问量较大的数据结构,尽量避免在访问量较大的同时数据内存也过大

2、及时清除无效数据,例如list过长其中又存储着很多无效数据、hash中有大量无效数据,避免无效数据占用内存

3、必要时可以将redis中数据进行压缩,用时间换取空间

4、硬件上可以增加网络带宽提高网络传输