记一次生产环境上从redis亿级缓存中批量删除key

本文记录了一次在生产环境中解决Redis内存不断增长的问题,由于未设置超时时间,需要批量删除亿级缓存key。文章讨论了不能使用`keys`命令的原因,并对比了两种基于`scan`命令的解决方案:一种是错误的游标不移动的模糊匹配,另一种是正确的全局扫描方法。
摘要由CSDN通过智能技术生成

场景:由于之前第一个版本快速迭代,同事写redis的时候,没有设置超时时间,导致redis上线两个月之后,发现内存在一直在涨,故需要清除redis中没有设置超时时间的key

方案:大家都知道生产环境不能使用keys命令来遍历,这可能会造成redis阻塞,cpu暴涨100%等情况产生,特别是在集群环境中存储量特别大的时候,上面所述现象尤为常见;一般在亿级缓存数据批量删除时,使用redis scan批量删除key尤为有效

一、添加maven依赖

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

二、网上常见的scan模糊匹配批量删除key(游标不移动,错误方法)

这种方法有个问题,那就是没法移动游标,无法全局扫描redis集群中所有匹配的key

 public void scan(String pattern, Consumer<byte[]> consumer,Long count) {
   
        this.stringRedisTemplate.execute((RedisConnection connection) -> {
   
            try (Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().match
Redis是一个开源的内存数据结构存储系统,用作数据库、缓存和消息间件。它支持多种类型的数据结构,如字符串、散列、列表、集合、有序集合等。当数据量达到千万级别时,进行批量删除可能会影响性能。以下是几种批量删除千万级数据的策略: 1. 使用Scan命令:由于Redis不支持直接使用`DEL *`来删除所有键,因为这会阻塞Redis服务器直到所有键被删除。所以可以使用Scan命令来逐步迭代并删除匹配的键。Scan命令可以返回一部分符合匹配模式的键,然后你可以对每个返回的键执行DEL命令。 ```bash SCAN cursor [MATCH pattern] [COUNT count] DEL key1 [key2 ...] ``` 2. 分批次删除:将需要删除的键分批次进行删除,可以减少单次操作对Redis性能的影响。例如,可以将键列表分成每批次1000个键,然后逐批次删除。 3. 使用Lua脚本:在Redis服务器端运行Lua脚本进行批量删除,可以减少网络往返次数。通过`EVAL`命令可以执行Lua脚本,并在一次网络调用完成多个删除操作。 ```lua local keys = redis.call('keys', 'pattern:*') -- 替换为实际的匹配模式 for i, key in ipairs(keys) do redis.call('del', key) end ``` 4. 使用pipeline:在Redis 2.6及以上版本,可以使用pipeline功能将多个命令打包在一起发送给服务器,这样可以减少网络延迟的影响。 ```bash MULTI DEL key1 DEL key2 ... DEL keyN EXEC ``` 在执行这些操作时需要注意以下几点: - 确保Redis服务器有足够的内存空间,以便在删除大量数据时不会造成内存溢出。 - 在生产环境删除操作可能会影响性能,最好在流量较低的时段进行。 - 如果数据存储在持久化配置的Redis,可能需要考虑持久化数据文件的大小以及删除操作可能对持久化性能的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值