Redis中BigKey的判定查找建议

embedded/2024/10/19 23:36:50/
判定依据
  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.ppmy.cn/embedded/93322.html

相关文章

关于LLC知识5

RLC的增益曲线不知一条 频率升高,增益会越来越低 无论在容性区还是感性区,当负载加重的时候,R阻值会变小,所以R的分压也会变小,导致增益会变低 当负载突然加重,输出电压会变低,增益曲线由红色变…

【北斗授时服务】NTP网络时间服务器 安徽京准智造

【北斗授时服务】NTP网络时间服务器 安徽京准智造 【北斗授时服务】NTP网络时间服务器 安徽京准智造 一、NTP网络时间服务器产品介绍: NTP网络时间服务器是针对计算机、自动化装置等进行校时而研发的高科技设备,该产品可从GPS卫星(北斗卫星、…

如何实现局域网远程监控员工电脑?精选5个远程监控员工电脑的方法!建议收藏!

在企业管理中,局域网远程监控员工电脑是一项重要的需求,这不仅可以加强对员工行为的监管,还能提高企业的信息安全性和运营效率。本文将为您介绍5个实现局域网远程监控员工电脑的方法,为您的企业管理提供有力支持。 一、使用专业的…

【oracle】数据库基本使用

一、oracle数据库简介 Oracle 数据库,亦称 Oracle RDBMS,或简称 Oracle,是一款由甲骨文公司推出的高效、稳定且广泛应用的关系型数据库管理系统。该数据库系统不仅在数据管理领域处于领先地位,而且由于其良好的可移植性、易用性和…

video视频自动播放兼容IOS与Android

有个需求是自动播放,但是在Android手机上正常播放,在iOS上就不播放 在移动设备上,尤其是在 iOS 设备上,视频的自动播放存在一些限制。为了使视频在 iOS 设备上自动播放,你需要确保以下几点: 确保视频是静…

树莓派智能语音助手之TTS - pyttsx3 + espeak

要让树莓派“开口说话”,就需要文字转语音的功能。起初选用Coqui-TTS,需要安装torch2.1(因为TTS需要torch>2.1.0),结果没有找到现成的whl文件(目前找到的torch可用版本是1.8),只能…

leetcode217. 存在重复元素,哈希表秒解

leetcode217. 存在重复元素 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出:true 示例 2&#x…

linux中如何查看是不是守护进程

linux中如何查看是不是守护进程在 Linux 中,要确定一个进程是否是守护进程,通常可以通过以下几个方面来进行判断:1. **检查进程是否与终端相关联**:- 使用 ps 命令查看进程的 TTY 列。- 守护进程通常没有控制终端,因此 TTY 列会显…