Redis大key问题 - 优化、清理

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 【6月更文挑战第14天】Redis内置命令如STRLEN、LLEN等用于检测不同类型Key的大小。避免使用DEBUG OBJECT和MEMORY USAGE因高资源消耗。大Key优化包括业务设计避免大Key、数据拆分、更换存储方案、数据压缩和合理清理。清理大Key应选低峰期或分批异步进行,以减少阻塞。使用如HSCAN、SREM等命令避免一次性操作大量数据。

Redis内置命令

通过Redis内置命令对目标Key进行分析,可以使用风险较低的命令来查询目前Key的字节数、列表长度或成员数量

  • STRING类型:执行STRLEN命令,返回对应Key的value的字节数。

  • LIST类型:执行LLEN命令,返回对应Key的列表长度。

  • HASH类型:执行HLEN命令,返回对应Key的成员数量。

  • SET类型:执行SCARD命令,返回对应Key的成员数量。

  • ZSET类型:执行ZCARD命令,返回对应Key的成员数量。

  • STREAM类型:执行XLEN命令,返回对应Key的成员数量。

注意!!!

DEBUG OBJECTMEMORY USAGE命令在执行时需占用较多资源,且时间复杂度为O(N),有阻塞Redis实例的风险,不建议使用。

大Key优化

业务侧 -- 根本

业务侧优先考虑避免大key设计,不要什么都往里放,仅仅缓存必要的数据字段

拆分 分片

例如将含有数万成员的一个HASH Key拆分为多个HASH Key,并保证每个Key的成员数量在合理范围。在Redis集群架构中,拆分大Key能对数据分片间的内存平衡起到显著作用

需要考虑下面几个问题:

  1. 定量拆分还是动态拆分?定量拆分需要考虑value增长的问题;动态分片就是先按原key读第一个分片,第一个分片的value记录分片的总数,然后再按照shard_num取。

  2. 存在部分写问题,比如写入10个分片的数据,只有5个分片写入成功,就会造成数据不一致问题。解决方案有下面几个

    • 引入版本机制

    • value最前面带上版本号

    • 一个分片不对就算错误,重新加载,容易陷入死循环

  3. 开发、维护、组装的成本

更换存储方案

换别的没有大key问题的存储

  1. 持久型kv存储

    • 软件:LSM-Tree

    • 硬件:固态存储

  2. 本地缓存,和redis结合实现多级缓存

  3. CDN

数据压缩

golang自带的zip和unzip可以对string类型的数据进行压缩

string类型

考虑使用容器型数据结构替换 string,提高内存利用效率,也能一定程度节省键名空间

合理的清理机制

对过期数据进行定期清理

堆积大量过期数据会造成大Key的产生,例如在HASH数据类型中以增量的形式不断写入大量数据而忽略了数据的时效性。可以通过定时任务的方式对失效数据进行清理。

在清理HASH数据时,建议通过HSCAN命令配合HDEL命令对失效数据进行清理,避免清理大量数据造成Redis阻塞。

对大Key进行清理

直接删除的话容易阻塞,因为Redis是单线程,从而影响到其他线上请求,超时增加的话会导致Redis连接打满,从而引发各种异常问题

解决方案:

  1. 选择业务流量低峰期的时候删除

  2. 分批定时定量删除:一次删除一部分,防止一次性删除大量数据导致阻塞

    • hash:hsacn扫描

    • set:srandmember 随机取数删除

    • zset:zremrangebyrank 移除指定排名(rank)区间内的所有元素

    • list:直接 pop 删

  3. 异步删除:用unlink代码del删除,只是将键与键空间断开连接,实际的删除异步进行,非阻塞,逐步清理

如何找出优化大Key与热Key,产生的原因和问题_云数据库 Redis 版(Redis)-阿里云帮助中心

https://github.com/qizong007/effective-backend-engineer/blob/main/docs/system-design/redis-big-key.md

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1天前
|
NoSQL Redis
蓝易云 - redis报错WRONGTYPE Operation against a key holding the wrong kind of value
解决这个问题的方法是检查你的代码,确保你对每个键使用的命令与该键的类型匹配。你可以使用 `TYPE`命令来确定一个键的类型。例如,`TYPE mykey`将返回 `mykey`的类型。
10 3
|
10天前
|
NoSQL Redis 容器
Redis大Key问题 - 标准、原因、查找
【6月更文挑战第13天】**大Key标准**在不同场景各异,一般string超1MB或容器超10k元素视为大;高并发场景中,string超10KB,容器超5k或整体10MB。**阿里云Redis**中,大Key可能表现为String值5MB,ZSET成员10k,或Hash总值100MB。**大Key影响**包括高读取成本、操作阻塞、存储压力不均。**产生原因**多源于业务设计、动态增长管理和程序错误。**查找大Key**可通过云服务的实时/离线统计,`redis-cli --bigkeys`或使用Redis RDB Tools分析RDB文件。注意,某些特定需求可能需额外工具。
19 1
|
5天前
|
存储 缓存 运维
Redis的热Key问题
【6月更文挑战第18天】Redis中的热Key是高访问频率的Key,如QPS高、大带宽使用或CPU密集型操作。热Key可能导致CPU占用过高、访问倾斜、缓存击穿和系统性能下降。爆款商品、热点事件等可引发热Key。检测热Key可借助云服务、`redis-cli hotkeys`、业务层监控或`MONITOR`命令。优化策略包括复制热Key到多分片、采用读写分离,但需权衡代码复杂性和数据一致性。
16 0
|
5天前
|
存储 NoSQL Redis
redis大key对持久化的影响
redis大key对持久化的影响
13 0
|
19天前
|
NoSQL 关系型数据库 MySQL
Redis进阶-select 1. /xxx 切换数据库DBSIZE- 获取当前数据库中的key的个数flushdb-删除当前数据的所有keyflushall-删除所有表的所有库Re
Redis进阶-select 1. /xxx 切换数据库DBSIZE- 获取当前数据库中的key的个数flushdb-删除当前数据的所有keyflushall-删除所有表的所有库Re
|
1月前
|
NoSQL Linux 网络安全
Linux安装Redis(详细教程)
Linux安装Redis(详细教程)
99 2
|
1月前
|
NoSQL Linux Redis
Redis -- 安装客户端redis-plus-plus
Redis -- 安装客户端redis-plus-plus
55 0
|
7天前
|
NoSQL Redis Windows
win10下Redis安装、启动教程
win10下Redis安装、启动教程
16 2
|
8天前
|
消息中间件 缓存 NoSQL
Redis单实例安装
Redis单实例安装
17 1
|
11天前
|
NoSQL Linux 网络安全
基于 centOS7 的 redis 安装
基于 centOS7 的 redis 安装
47 1

热门文章

最新文章