Redis中BigKey的判定查找建议

判定依据
  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 |
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值