Redis系列-5.Redis大Key问题

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
目录
打赏
0
0
0
0
8
分享
相关文章
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
Redis应用—6.热key探测设计与实践
|
2月前
|
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
50 7
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
199 0
Redis大Key问题如何排查?如何解决?
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
5月前
|
Redis 键(key)
10月更文挑战第15天
69 1
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
213 3
|
5月前
|
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
89 1
|
6月前
|
Redis过期Key的清理机制
Redis过期Key的清理机制
115 0
|
6月前
|
Redis 大 Key 对持久化的影响及解决方案
Redis 大 Key 对持久化的影响及解决方案
81 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等