Redis大key问题 - 优化、清理

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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

目录
相关文章
|
4月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1061 7
|
7月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
329 61
Redis应用—6.热key探测设计与实践
|
4月前
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
7月前
|
缓存 NoSQL Redis
Redis如何优化频繁命令往返造成的性能瓶颈?
频繁的命令往返是Redis性能优化中需要重点关注的问题。通过使用Pipeline、Lua脚本、事务、合并命令、连接池以及合理设置网络超时,可以有效减少网络往返次数,优化Redis的性能。这些优化措施不仅提升了Redis的处理能力,还能确保系统在高并发情况下的稳定性和可靠性。
170 14
|
9月前
|
存储 监控 NoSQL
NoSQL与Redis配置与优化
通过合理配置和优化Redis,可以显著提高其性能和可靠性。选择合适的数据结构、优化内存使用、合理设置持久化策略、使用Pipeline批量执行命令、以及采用分布式集群方案,都是提升Redis性能的重要手段。同时,定期监控和维护Redis实例,及时调整配置,能够确保系统的稳定运行。希望本文对您在Redis的配置与优化方面有所帮助。
161 23
|
9月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
190 11
|
9月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
122 7
|
9月前
|
存储 监控 NoSQL
NoSQL与Redis配置与优化
通过合理配置和优化Redis,可以显著提高其性能和可靠性。选择合适的数据结构、优化内存使用、合理设置持久化策略、使用Pipeline批量执行命令、以及采用分布式集群方案,都是提升Redis性能的重要手段。
161 7
|
11月前
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
450 0
Redis大Key问题如何排查?如何解决?
|
11月前
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?