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 开发者微信交流群 里的各位大大给出的指导~

目录
相关文章
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
22天前
|
存储 NoSQL 前端开发
Redis专题-实战篇一-基于Session和Redis实现登录业务
本项目基于SpringBoot实现黑马点评系统,涵盖Session与Redis两种登录方案。通过验证码登录、用户信息存储、拦截器校验等流程,解决集群环境下Session不共享问题,采用Redis替代Session实现数据共享与自动续期,提升系统可扩展性与安全性。
131 3
Redis专题-实战篇一-基于Session和Redis实现登录业务
|
22天前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
111 1
Redis专题-实战篇二-商户查询缓存
|
7月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
647 0
分布式爬虫框架Scrapy-Redis实战指南
|
4月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
292 40
|
5月前
|
数据采集 存储 NoSQL
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
325 67
|
4月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1078 7
|
4月前
|
机器学习/深度学习 存储 NoSQL
基于 Flink + Redis 的实时特征工程实战:电商场景动态分桶计数实现
本文介绍了基于 Flink 与 Redis 构建的电商场景下实时特征工程解决方案,重点实现动态分桶计数等复杂特征计算。通过流处理引擎 Flink 实时加工用户行为数据,结合 Redis 高性能存储,满足推荐系统毫秒级特征更新需求。技术架构涵盖状态管理、窗口计算、Redis 数据模型设计及特征服务集成,有效提升模型预测效果与系统吞吐能力。
370 2
|
4月前
|
存储 缓存 NoSQL
告别数据僵尸!Redis实现自动清理过期键值对
在数据激增的时代,Redis如同内存管理的智能管家,支持键值对的自动过期功能,实现“数据保鲜”。通过`EXPIRE`设定生命倒计时、`TTL`查询剩余时间,结合惰性删除与定期清理策略,Redis高效维护内存秩序。本文以Python实战演示其过期机制,并提供最佳实践指南,助你掌握数据生命周期管理的艺术,让数据优雅退场。
274 0
|
7月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用的算法是哈希槽分区算法。Redis集群中有16384个哈希槽(槽的范围是 0 -16383,哈希槽),将不同的哈希槽分布在不同的Redis节点上面进行管理,也就是说每个Redis节点只负责一部分的哈希槽。在对数据进行操作的时候,集群会对使用CRC16算法对key进行计算并对16384取模(slot = CRC16(key)%16383),得到的结果就是 Key-Value 所放入的槽,通过这个值,去找到对应的槽所对应的Redis节点,然后直接到这个对应的节点上进行存取操作