clxmm
首页
  • 01redis学习

    • 01redis开始
  • 02redis学习

    • 01redis开始
  • vue2学习

    • 01vue学习
  • centos安装zsh

    • centos安装zsh
GitHub (opens new window)
首页
  • 01redis学习

    • 01redis开始
  • 02redis学习

    • 01redis开始
  • vue2学习

    • 01vue学习
  • centos安装zsh

    • centos安装zsh
GitHub (opens new window)
  • redis

    • 01redis
    • 02redis持久化
    • 03redis事务和管道
    • 04redis发布与订阅
    • 05Redis复制(replica)
    • 06Redis哨兵(sentinel)
    • 07Redis集群(cluster)
    • 08redis与SpringBoot集成
    • redis单线程与多线程
    • redis的BigKey
      • 1.面试题
      • 2.MoreKey案例
        • 2.1 大批量往redis里面插入2000W测试数据key
        • 2.2 keys等命令的使用和禁用
        • 2.3 不用keys *避免卡顿,那该用什么
      • 3.BigKey生产案例
        • 3.1 多大算Big
        • 3.2哪些危害
        • 3.3 如何产生
        • 3.4如何发现
        • 3.5如何删除
      • 4.BigKey调优
    • redis缓存双写一致性
    • 12redis与mysql双写一致性
    • 13案列bitmap-hyperlog-geo
    • 14布隆过滤器BloomFilter
    • 缓存预热、雪崩、击穿、穿透
    • redis的分布式锁
    • 17Redlock算法和缓存淘汰
    • 18Redis源码
  • redis02

  • 后端学习
  • redis
clxmm
2024-09-10
目录

redis的BigKey

# 1.面试题

  1. 阿里广告平台,海量数据里查询某一固定前缀的key
  2. 小红书,你如何生产上限制keys */flushdb/flushall等危险命令以防止误删误用?
  3. 美团,MEMORY USAGE 命令你用过吗?
  4. BigKey问题,多大算big?你如何发现?如何删除?如何处理?
  5. BigKey你做过调优吗?惰性释放lazyfree了解过吗?
  6. Morekey问题,生产上redis数据库有1000W记录,你如何遍历?key *可以吗?

# 2.MoreKey案例

# 2.1 大批量往redis里面插入2000W测试数据key

根据电脑性能调整

// 生成数据
for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> tmp/redisTest.txt ;done;
// 插入数据
cat tmp/redisTest.txt | src/redis-7.0.0/src/redis-cli -h 127.0.0.1 -p 6379 -a 123456abc --pipe
1
2
3
4

# 2.2 keys等命令的使用和禁用

keys * 你试试100W花费多少秒遍历查询

key * 这个指令有致命的弊端,在实际环境中最好不要使用

限制

生产上限制keys */flushdb/flushall等危险命令以防止误删误用?

通过配置设置禁用这些命令,redis.conf在SECURITY这一项中

# 2.3 不用keys *避免卡顿,那该用什么

  • scan命令登场

    • https://redis.io/commands/scan/ (opens new window)
    • https://redis.com.cn/commands/scan.html (opens new window)
    • Redis SCAN 命令 | 菜鸟教程 (runoob.com) (opens new window)
    • 一句话,类似mysql limit的但不完全相同
  • SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

    SCAN 返回一个包含两个元素的数组,

    第一个元素是用于进行下一次迭代的新游标, 第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回零表示迭代已结束。

  • SCAN的遍历顺序

    非常特别,它不是从第一维数组的第零位一直遍历到末尾,而是采用了高位进位加法来遍历。之所以使用这样特殊的方式进行遍历,是考虑到字典的扩容和缩容时避免槽位的遍历重复和遗漏。

使用

nps2-r:db0> scan 0 match k* count  15
1) "212992"
2) 1) "k385339"
2) "k2664"
3) "k390224"
4) "k370659"
5) "k389840"
6) "k346105"
7) "k347177"
8) "k452887"
9) "k57626"
10) "k248140"
11) "k348208"
12) "k334578"
13) "k5605"
14) "k497571"
15) "k426935"
nps2-r:db0> scan 212992 match k* count  15
1) "73728"
2) 1) "k433414"
2) "k56782"
3) "k490717"
4) "k320049"
5) "k280000"
6) "k433253"
7) "k178110"
8) "k445520"
9) "k390957"
10) "k119322"
11) "k94856"
12) "k158928"
13) "k467993"
14) "k140943"
15) "k27801"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

# 3.BigKey生产案例

# 3.1 多大算Big

  • string是value,最大512MB但是≥10KB就是bigkey
  • list、hash、set和zset,个数超过5000就是bigkey

# 3.2哪些危害

  • 内存不均,集群迁移困难
  • 超时删除,大key删除作梗
  • 网络流量阻塞

# 3.3 如何产生

  • 社交类: 王心凌粉丝列表,典型案例粉丝逐步递增
  • 汇总统计:某个报表,月日年经年累月的积累

# 3.4如何发现

  • 如何发现

    • 好处,见最下面总结

      给出每种数据结构Top 1 bigkey,同时给出每种数据类型的键值个数+平均大小

    • 不足

      想查询大于10kb的所有key,--bigkeys参数就无能为力了,需要用到memory usage来计算每个键值的字节数

    redis-cli --bigkeys -a 111111 
    
    redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys
    
    每隔 100 条 scan 指令就会休眠 0.1s,ops 就不会剧烈抬升,但是扫描的时间会变长
    redis-cli -h 127.0.0.1 -p 7001 –-bigkeys -i 0.1
    
    
    
    1
    2
    3
    4
    5
    6
    7
    8
  • MEMORY USAGE 键

    • 计算每个键值的字节数

    • https://redis.com.cn/commands/memory-usage.html (opens new window)

# 3.5如何删除

  • 参考《阿里云Redis开发规范》

  • 官网 (opens new window)

  • 普通命令

    • String:一般用del,如果过于庞大unlink

    • hash

      • 使用hscan每次获取少量field-value,再使用hdel删除每个field
    • list

      • 使用ltrim渐进式逐步删除,直到全部删除完成

      • 命令

      • 阿里

    • set

      • 使用sscan每次获取部分元素,再使用srem命令删除每个元素
    • zset

      • 使用zscan每次获取部分元素,再使用ZREMRANGEBYRANK命令删除每个元素

# 4.BigKey调优

redis.conf配置文件LAZY FREEING相关说明

  • 阻塞和非阻塞删除命令
  • 优化配置

编辑 (opens new window)
#redis
上次更新: 2024/09/11, 22:40:14
redis单线程与多线程
redis缓存双写一致性

← redis单线程与多线程 redis缓存双写一致性→

最近更新
01
vue3
02-08
02
vue3-1
01-24
03
vue3
01-18
更多文章>
Theme by Vdoing | Copyright © 2024-2025 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式