Redis中BigKey的判定查找建议

avatar
作者
猴君
阅读量:0
判定依据
  1. key本身的数据量过大:string类型的key它的值为5MB
  2. key中的成员数量过多:一个zset类型的key成员数量为10000个
  3. key中的成员数据量过大:一个hash类型的key他的成员只有1000个但是这些value总大小超过100MB
  4. 查看内存命令
127.0.0.1:6379> hset k1 name 123 age 123 sex 123 email 123@123 (integer) 1 127.0.0.1:6379> memory usage k1 (integer) 96 127.0.0.1:6379>   
推荐
  1. 单个key的value小于10KB
  2. 对于集合类型的key建议元素数量小于1000
危害
  1. 网络阻塞
    1. 对于bigkey执行读请求时少量的QPS就可能导致带宽使用率被占满导致Redis实例 乃至物理机变慢
  2. 数据倾斜
    1. BigKey所在的Redis实例内存使用率远超其他使用率 无法使数据分片内存资源达到均衡
  3. Redis阻塞
    1. 对元素较多的hash list zset 等做运算耗时较多 使主线程被阻塞
  4. CPU压力
    1. BigKey的数据序列化和反系列化会导致CPU的使用率飙升 影响Redis实例和本机其他引用
查找BigKey
  1. redis-cli–bigkeys
[root@CentOS7 ~]# redis-cli --bigkeys  # Scanning the entire keyspace to find biggest keys as well as # average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed).  [00.00%] Biggest hash   found so far '"k1"' with 4 fields  -------- summary -------  Sampled 1 keys in the keyspace! Total key length in bytes is 2 (avg len 2.00)  Biggest   hash found '"k1"' has 4 fields  0 strings with 0 bytes (00.00% of keys, avg size 0.00) 0 lists with 0 items (00.00% of keys, avg size 0.00) 1 hashs with 4 fields (100.00% of keys, avg size 4.00) 0 streams with 0 entries (00.00% of keys, avg size 0.00) 0 sets with 0 members (00.00% of keys, avg size 0.00) 0 zsets with 0 members (00.00% of keys, avg size 0.00) [root@CentOS7 ~]#   
选择何时的数据结构
class user{     private String name;     private Integer age; } 
  1. JSON 优点:实现简单粗暴 缺点:数据耦合,不够灵活
user:1	{"name": "Jack", "age": 21} 
  1. String 优点:可以灵活访问对象任意字段 缺点:占用空间大、没办法做统一控制
user:1:name	Jack user:1:age	21 
  1. Hash 优点:底层使用ziplist,空间占用小,可以灵活访问对象的任意字段 缺点:代码相对复杂
user:1	name	jack 		age		21 
BigKey 案例

假如有hash类型的key,其中有100万对field和value,field是自增id,这个key存在什么问题?如何优化?

keyfieldvalue
someKeyid:0value0
id:999999value999999
  1. 方案一拆分为string类型
    | key | value |
    | — | — |
    | id:0 | value0 |
    | … | … |
    | id:999999 | value999999 |

存在的问题:string结构底层没有太多内存优化,内存占用较多想要批量获取这些数据比较麻烦

  1. 方案二拆分为小的hash,将 id / 100 作为key, 将id % 100 作为field,这样每100个元素为一个Hash
    | key | field | value |
    | — | — | — |
    | key:0 | id:00 | value0 |
    | | … | … |
    | | id:99 | value99 |
    | key:1 | id:00 | value100 |
    | | … | … |
    | | id:99 | value199 |
    | … | | |
    | key:9999 | id:00 | value999900 |
    | | … | … |
    | | id:99 | value999999 |

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!