Redis(高阶篇)02章——BigKey

一、面试题

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

二、MoreKey案例

(1)大批量往redis里面插入2000W测试数据key

2.1.1Linux Bash下面执行,插入100W数据

  1. 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中
   for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;

2.1.2通过redis提供的管道-pipe命令插入100W大批量数据

cat /tmp/redisTest.txt | redis-cli -h 127.0.0.1 -p 6379 -a 111111 --pipe

(2)某快递巨头真实生产案例新闻

2.2.1新闻

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

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

  1. 输入keys */flushdb/flushall等命令时,同时按下Tab键会有提示
  2. 通过配置设置禁用这些命令,redis.conf在SECURITY这一项中

(3)不用keys *避免卡顿,那该用什么

2.3.1scan命令登场

  1. SCAN | Docs
  2. Redis SCAN 命令 递增地遍历key空间
  3. 一句话,类似MySQL limit,但是不完全相同

2.3.2Scan命令用于迭代数据库中的数据库键

  1. 语法
  2. 特点
  3. 使用

三、BigKey案例

(1)多大算Big

通常我们说的BigKey,不是在值的Key很大,而是指的Key对应的value很大

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

3.1.2string和二级结构

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

(2)哪些危害

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

(3)如何产生

(4)如何发现

3.4.1redis-cli --bigkey

3.4.2memory usage 键

  1. 英文官网:MEMORY USAGE | Docs
  2. 中文官网:MEMORY USAGE | Docs
  3. 计算每个键值的字节数

(5)如何删除

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

3.5.2官网

  1. SCAN | Docs
  2. Redis SCAN 命令 递增地遍历key空间

3.5.3普通命令

(1)String

一般用del,如果过于庞大使用unlink key 删除

(2)hash
  1. 使用hscan每次获取少量field-value,再使用hdel删除每个field
  2. 命令
  3. 阿里手册
(3)list
  1. 使用ltrim渐进式逐步删除,直到全部删除完成
  2. 命令
  3. 阿里手册
(4)set
  1. 使用sscan每次获取部分元素,在使用srem命令删除每个元素
  2. 命令
  3. 阿里手册
(5)zset
  1. 使用zscan每次获取部分元素,在使用zremrangebyrank命令删除每个元素
  2. 命令
  3. 阿里手册

四、BigKey生产调优

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

  1. 阻塞和非阻塞删除命令:
  2. 优化配置
相关推荐
sekaii2 分钟前
ReDistribution plan细节
linux·服务器·数据库
qq_4592384928 分钟前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端
焱焱枫38 分钟前
自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用
数据库·sql·oracle
2301_7930698242 分钟前
Spring Boot +SQL项目优化策略,GraphQL和SQL 区别,Spring JDBC 等原理辨析(万字长文+代码)
java·数据库·spring boot·sql·jdbc·orm
是姜姜啊!1 小时前
java连接redis
java·redis
hhw1991121 小时前
spring boot知识点5
java·数据库·spring boot
ITPUB-微风1 小时前
功能开关聚合对象实践:提升金融领域的高可用性
网络·数据库·金融
去看日出2 小时前
Linux(centos)系统安装部署MySQL8.0数据库(GLIBC版本)
linux·数据库·centos
Hanyaoo2 小时前
为什么mvcc中?m_ids 列表并不等同于 min_trx_id 和 max_trx_id 之间的所有事务 ID
数据库
偏右右2 小时前
PL/SQL 异常处理
数据库·sql·oracle