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
目录
相关文章
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
16天前
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
1月前
|
NoSQL Unix Redis
Redis 键(key)
10月更文挑战第15天
32 1
|
1月前
|
缓存 监控 负载均衡
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
51 3
|
1月前
|
NoSQL Redis
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
55 1
|
2月前
|
存储 缓存 NoSQL
Redis 大 Key 对持久化的影响及解决方案
Redis 大 Key 对持久化的影响及解决方案
45 1
|
2月前
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
241 4
Redis中大Key与热Key的解决方案
|
2月前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
95 3
|
2月前
|
存储 缓存 NoSQL
Redis过期Key的清理机制
Redis过期Key的清理机制
59 0
|
3月前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)