当前位置: 首页 > news >正文

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 fields0 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	jackage		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 |
http://www.lryc.cn/news/413533.html

相关文章:

  • Swift-语法基础
  • 面向对象进阶:多态、内部类、常用API
  • 寸(英寸)、码、斤、公顷等日常中大概的换算单位你清楚吗
  • Python面试宝典第26题:最长公共子序列
  • 接口测试学习笔记2
  • vue3修改带小数点的价格数字:小数点的前后数字,要分别显示成不同颜色和大小!已经封装成组件了!
  • JVM(Java虚拟机) - JVM内存分配与内存管理
  • Linux中vim的基本介绍和使用
  • 宝塔面板上,安装rabbitmq
  • 【Docker系列】Docker 镜像管理:删除无标签镜像的技巧
  • 数据采集器
  • 小红书0510笔试-编程题
  • 2024年热门开放式耳机评测!悠律、韶音、声阔到底该选谁?
  • 计算机毕业设计选题推荐-智慧物业服务系统-Java/Python项目实战
  • 新手小白学习PCB设计,立创EDA专业版
  • 查物流信息用什么软件
  • (40)温度传感器
  • 【靶场实操】sql-labs通关详解----第二节:前端页面相关(Less-11-Less-17)
  • 样式与特效(2)——新闻列表
  • NICE Seminar(2023-07-16)|演化算法的理论研究到底有什么用?(南京大学钱超教授)
  • 优盘驱动器未格式化?数据恢复全攻略
  • (超全)Kubernetes 的核心组件解析
  • 前端常用的【设计模式】和使用场景
  • QT下载问题:Download from your IP address is not allowed
  • 自建数据库VS云数据库
  • 【大数据开发语言Scala的入门教程】
  • docker部署kkfileview文件在线预览服务
  • 朱锐 | 生命图像中的时间和意识
  • pytorch: cpu,cuda,tensorRt 推理对比学习
  • android 音频播放器,(一)SoundPool音频播放实例