Redis系列-5.Redis大Key问题

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis系列-5.Redis大Key问题

BigKey


相关面试题


阿里广告平台,海量数据里查询某一固定前缀的key


小红书,你如何生产上限制 key *等危险命令以防止误用?


美团,MEMORY USAGE 命令用过吗?


BigKey问题,多大算big?如何发现?如何删除?如何处理?


BigKey做过调优吗?惰性释放lazyfree了解吗?


MoreKey问题,生产上Redis数据库有1000W数据,你如何遍历?key * 可以吗?


MoreKey案例


大批量往Redis中插入测试数据


Linux Bash下面执行,插入100W


# 生成100W条redis批量设置kv的语句(key=kn,value=vn)写入到/tmp目录下的redisTest.txt文件中


for((i=1;i<=100*10000;i++)); do echo “set ki v i vivi” >> /tmp/redisTest.txt ;done;


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


结合自己机器的地址:


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


参考机器硬件,100w数据插入redis花费5.8秒左右


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



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


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


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


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


不用keys * 避免卡顿,那该用什么呢?


scan 命令登场


一句话,类似mysql limit 但是又不完全相同


Redis SCAN 命令及其相关命令 SSCANHSCANZSCAN 命令都是用于增量遍历集合中的元素。


  • SCAN 用于遍历当前数据库中的键。
  • SSCAN 用于遍历集合键中的元素。
  • HSCAN 用于遍历哈希键中的键值对。
  • ZSCAN 用于遍历有序集合中的元素(包括元素成员和元素分值)。


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


语法

特点

SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。


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


第一个元素是用于进行下一次迭代的新游标,


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


SCAN的遍历顺序


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


使用


BigKey案例


多大算Big


参考阿里云Redis开发规范

String是Value,最大512MB,但是>=10KB就是bigkey


list、hash、set、zset,个数超过5000就是bigkey


  • list:一个列表最多可以包含2^32-1个元素
  • hash:Redis中每个hash可以存储2^32-1个键值对
  • set:集合中最大的成员数为2^32-1


危害


内存分配不均匀,集群迁移困难


超时删除,大key删除作梗


网络流量阻塞


如何产生


例如:


王心凌粉丝列表,典型案例粉丝逐步递增


某个报表,月日年的积累


如何发现


redis-cli --bigkeys


好处,见最下面总结


给出每种数据结构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


MESORY USAGE键



如何删除



命令


String


一般用del,如果过于庞大unlink(Redis的UNLINK操作用于删除指定的键,与DEL操作不同的是,UNLINK操作是非阻塞的,即它会先将键的引用计数减1,如果引用计数降为0,则会在后台异步删除键所占用的内存空间,这样可以避免在删除大量键时造成阻塞。)


hash


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

list


使用ltrim渐进式逐步删除,知道全部删除完成

set


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

Zset


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


BigKey生产调优


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


阻塞和非阻塞删除命令

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 监控 NoSQL
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
【Redis性能瓶颈揭秘】「调优系列」深入分析热Key的排查策略和解决方案
215292 11
|
2月前
|
存储 缓存 NoSQL
【Redis】Redis魔法:揭秘Key的自动消失术——过期删除机制解析
【Redis】Redis魔法:揭秘Key的自动消失术——过期删除机制解析
132 0
|
3月前
|
NoSQL Java Redis
面试01-Redis 如何从海量数据中查询出某一个 Key
面试01-Redis 如何从海量数据中查询出某一个 Key
96 0
|
7月前
|
存储 NoSQL Java
Redis中的Big Key问题:排查与解决思路
在使用 Redis 的过程中,有一些问题可能会悄无声息地影响我们的系统性能,其中最具代表性的就是 Big Key 问题。
49 0
|
6天前
|
存储 NoSQL Redis
【Redis】Redis如何实现key的过期删除
【Redis】Redis如何实现key的过期删除
|
5月前
|
存储 NoSQL 测试技术
redis 大key
redis 大key
51 0
|
2月前
|
NoSQL Java Redis
Spring Boot 监听 Redis Key 失效事件实现定时任务
Spring Boot 监听 Redis Key 失效事件实现定时任务
55 0
|
25天前
|
NoSQL Shell Redis
批量迁移redis实例的key
批量迁移redis实例的key
|
1月前
|
NoSQL Java Redis
SpringBoot中操作RedisTemplate获取redis中以某些字符串为前缀的KEY列表
SpringBoot中操作RedisTemplate获取redis中以某些字符串为前缀的KEY列表
31 0
|
2月前
|
存储 NoSQL 算法
Redis中删除过期Key的三种策略
Redis中删除过期Key的三种策略
30 0