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

场景:由于之前第一个版本快速迭代,同事写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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用Lettuce批量删除Redis缓存需要使用RedisCommands接口提供的del方法,该方法可以接受多个key作为参数,批量删除对应的缓存。以下是使用Lettuce批量删除Redis缓存的示例代码: ```java import io.lettuce.core.RedisClient; import io.lettuce.core.RedisURI; import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.api.sync.RedisCommands; import java.util.Arrays; import java.util.List; public class LettuceBatchDeleteRedisCacheExample { public static void main(String[] args) { // 创建RedisClient对象 RedisURI redisURI = RedisURI.create("redis://localhost:6379"); RedisClient redisClient = RedisClient.create(redisURI); // 创建连接 StatefulRedisConnection<String, String> connection = redisClient.connect(); // 获取RedisCommands对象 RedisCommands<String, String> commands = connection.sync(); // 批量删除缓存 List<String> keys = Arrays.asList("key1", "key2", "key3"); Long deletedCount = commands.del(keys.toArray(new String[0])); System.out.println("Deleted " + deletedCount + " keys"); // 关闭连接和RedisClient connection.close(); redisClient.shutdown(); } } ``` 在这个例子,我们首先创建了一个RedisClient对象,并使用它来创建一个与Redis服务器的连接。然后,我们获取了RedisCommands对象,并使用它的del方法来批量删除缓存。最后,我们关闭了连接和RedisClient对象。 需要注意的是,使用Lettuce操作Redis时,我们需要确保连接和RedisClient对象被正确关闭,以避免资源泄漏的问题。可以使用try-with-resources语句来自动关闭连接和RedisClient对象,例如: ```java try (RedisClient redisClient = RedisClient.create(redisURI); StatefulRedisConnection<String, String> connection = redisClient.connect()) { RedisCommands<String, String> commands = connection.sync(); List<String> keys = Arrays.asList("key1", "key2", "key3"); Long deletedCount = commands.del(keys.toArray(new String[0])); System.out.println("Deleted " + deletedCount + " keys"); } ``` 这样可以确保在代码执行完毕后自动关闭连接和RedisClient对象,避免出现资源泄漏的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值