devops| redis 数据量暴涨进行数据清理实战

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: redis 作为程序员的 「瑞士军刀」, 在现有业务中扮演着重要的角色. 为了避免触雷, 「保卫世界和平」, 对 redis 数据进行分析并清理.

最近一段时间, 需求爆发式增长, 业务量也蹭蹭蹭上涨, 也伴随着一些新的烦恼, 线上 redis 服务, 频繁触发容量超出 80% 阀值报警. 而 redis 作为程序员的 「瑞士军刀」, 在现有业务中扮演着重要的角色. 为了避免触雷, 「保卫世界和平」, 对 redis 数据进行分析并清理.

快速寻找解决办法

业务使用的阿里云的 redis 服务, 报警也是使用阿里云上设置的, 比如下面这个模板:

aliyun-redis-monitor

容量不够用, 首先想到的就是 redis 的淘汰机制, 对应的设置:

aliyun-redis-maxmemory

各个淘汰机制不作过多介绍, 感兴趣可以搜索网上更详细的资料进行了解. 现有的淘汰机制是符合现有业务特点的, 那就需要从其他地方下功夫了.

快速的在阿里云 redis 服务控制面板中浏览了一圈, 没有发现相关的设置, 于是转向百度. 尝试 redis 容量超过阀值 redis 数据分析 redis 数据清理 等关键词后, 依然没有找到相关的答案.

最后, 向技术社区进行求助 -- Swoole 开发者 微信交流群. 刚一抛出问题, 就找到需要的答案了.

@daydaygo 我搞过,我们公司滥用redis,缓存和数据库都在用。最后搞了个脚本,scan所有key,统计前缀,然后根据前缀对应到业务中,再挨个干掉。当然淘汰机制和swap都得上。 -- Mr.Xie

@Mr. Xie 推荐工具 https://github.com/sripathikrishnan/redis-rdb-tools -- ForzaDong
这个有尝试过,好像因为dump太大,分析老是失败,就放弃了。 当时有 20G, 现在减半了.  -- Mr.Xie
2G跑了10多分钟吧, 你分析前100就行了, 不用全部分析. -- ForzaDong
当时内存耗光,bgsave失败,也没有启swap,比较紧急,没想那么多。 -- Mr.Xie

代码审计, redis 存储空间的回收. 只会 set get 不考虑 del 的程序员, 不是好程序员. -- 如果的如果
用完就的释放, 这要养成习惯. -- dbq
都知道重要, 但大多数都赶工期. -- zhanghan

bigscan? 使用 --bigkeys 参数. -- Leandre

挑选了聊天中的部分, 不仅有解决方法, 还有宝贵的一线经验.

数据清理实战

  • 下载阿里云的备份数据到本地进行分析

[图片上传失败...(image-5fc52a-1523981140107)]

下载获取 redis 的 .rdb 备份文件

有 go/php 2个语言支持, go 语言示例:

analysis := NewAnalysis()
//Open redis: 127.0.0.1:6379 without password
err := analysis.Open("127.0.0.1", 6379, "")
defer analysis.Close()
if err != nil {
    fmt.Println("something wrong:", err)
    return
}

//Scan the keys which can be split by '#' ':'
//Special pattern characters need to escape by '\'
analysis.Start([]string{"#", ":"})

//Find the csv file in default target folder: ./reports
//CSV file name format: redis-analysis-{host:port}-{db}.csv
//The keys order by count desc
analysis.SaveReports("./reports")

分析的效果:

image

PS: 需要将 .rdb 文件中的数据, 导入到本地的 redis 服务器中, 然后使用此工具进行分析

  • 工具二(推荐): redis-rdb-tools
sripathikrishnan/redis-rdb-tools

推荐使用此工具, 阿里云的帮助文档列举了详细的使用方法, 这里就不过多解释了.

PS: 阿里云帮助文档有空可以多看看, 尤其是里面的 最佳实践

写在最后

redis 作为程序员的 「瑞士军刀」, 对它多一点了解, 可以说是 性价比很高 的一件事儿, 这里再推荐几个资源:

如何提取Redis中的大KEY -- 使用 –bigkeys 参数
Redis危险命令重命名、禁用

keys * 使用 scan 命令进行重写(PHP版本, 代码来自 yuchen 大大):

public static function redisKeys($redis, $pattern, $step, $callback=NULL) {
    if (strpos($pattern, '*') === false) {
        throw new \ErrorException('none * in pattern');
    }

    $ret = [];
    $cursor = 0;
    do {
        $redis_query = $redis->scan($cursor, 'match', $pattern, 'count', $step);
        if (! empty($redis_query[1])) {
            if (is_callable($callback)) {
                $_ret = call_user_func($callback, $redis_query[1]);
                if ( false === $_ret ) {
                    break;
                }
                else if ((! empty($_ret)) && is_array($_ret)) {
                    $ret = array_merge($ret, $_ret);
                }
            }
            else {
                $ret = array_merge($ret, $redis_query[1]);
            }
        }

        $cursor = $redis_query[0];
    } while ($cursor != 0);

    return $ret;
}

感谢 Swoole 开发者微信交流群 里的各位大大给出的指导~

相关实践学习
基于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
目录
相关文章
|
2月前
|
NoSQL Redis
Redis的数据淘汰策略有哪些 ?
Redis 提供了 8 种数据淘汰策略,分为淘汰易失数据和淘汰全库数据两大类。易失数据淘汰策略包括:volatile-lru、volatile-lfu、volatile-ttl 和 volatile-random;全库数据淘汰策略包括:allkeys-lru、allkeys-lfu 和 allkeys-random。此外,还有 no-eviction 策略,禁止驱逐数据,当内存不足时新写入操作会报错。
184 16
|
2月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
69 4
|
17天前
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
数据并发竞争是大流量系统(如火车票系统、微博平台)中常见的问题,可能导致用户体验下降甚至系统崩溃。本文介绍了两种解决方案:1) 加写回操作加互斥锁,查询失败快速返回默认值;2) 保持多个缓存备份,减少并发竞争概率。通过实践案例展示,成功提高了系统的稳定性和性能。
|
17天前
|
缓存 监控 NoSQL
Redis经典问题:数据不一致
在使用Redis时,缓存与数据库数据不一致会导致应用异常。主要原因包括缓存更新失败、Rehash异常等。解决方案有:重试机制、缩短缓存时间、优化写入策略、建立监控报警、定期验证一致性、采用缓存分层及数据回滚恢复机制。这些措施可确保数据最终一致性,提升应用稳定性和性能。
|
2月前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
75 14
|
2月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
63 13
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
47 5
|
2月前
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
Redis 采用两种过期键删除策略:惰性删除和定期删除。惰性删除在读取键时检查是否过期并删除,对 CPU 友好但可能积压大量过期键。定期删除则定时抽样检查并删除过期键,对内存更友好。默认每秒扫描 10 次,每次检查 20 个键,若超过 25% 过期则继续检查,单次最大执行时间 25ms。两者结合使用以平衡性能和资源占用。
57 11
|
2月前
|
监控 NoSQL 测试技术
【赵渝强老师】Redis的AOF数据持久化
Redis 是内存数据库,提供数据持久化功能,支持 RDB 和 AOF 两种方式。AOF 以日志形式记录每个写操作,支持定期重写以压缩文件。默认情况下,AOF 功能关闭,需在 `redis.conf` 中启用。通过 `info` 命令可监控 AOF 状态。AOF 重写功能可有效控制文件大小,避免性能下降。
|
2月前
|
存储 监控 NoSQL
【赵渝强老师】Redis的RDB数据持久化
Redis 是内存数据库,提供数据持久化功能以防止服务器进程退出导致数据丢失。Redis 支持 RDB 和 AOF 两种持久化方式,其中 RDB 是默认的持久化方式。RDB 通过在指定时间间隔内将内存中的数据快照写入磁盘,确保数据的安全性和恢复能力。RDB 持久化机制包括创建子进程、将数据写入临时文件并替换旧文件等步骤。优点包括适合大规模数据恢复和低数据完整性要求的场景,但也有数据完整性和一致性较低及备份时占用内存的缺点。
下一篇
开通oss服务