Redis中常见的三种删除策略

Redis中常见的三种删除策略是定时删除、定期删除和惰性删除。它们各有优缺点和适用场景

定时删除(定时过期):
  • 优点:简单、直观,适用于对数据过期时间精确要求不高的场景。
  • 缺点:可能会占用大量内存,不适用于数据量较大的情况。
  • 应用场景:适用于对数据过期时间要求不高,数据量较小的场景。
定期删除(定期过期):
  • 优点:相对于定时删除,可以更灵活地控制内存占用,适用于数据量较大的情况。
  • 缺点:可能会导致短时间内存占用较高,对系统性能有一定影响。
  • 应用场景:适用于数据量较大,对内存占用有一定要求的场景。
Jedis客户端来连接Redis,并通过ScheduledExecutorService定时检查并删除过期数据实现定时删除:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisConnectionException;

import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class RedisScheduledDeleteExample {
   

    public static void main(String[] args) {
   
        // 连接到本地的Redis服务
        Jedis jedis = new Jedis("localhost", 6379);

        try {
   
            // 设置键值对,并设置过期时间为10秒
            jedis.set("key1", "value1");
            jedis.expire("key1", 10);

            // 使用ScheduledExecutorService来定期检查并删除过期数据
            ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
            executor.scheduleAtFixedRate(() -> {
   
                // 获取所有键
                Set<String> keys = jedis.keys("*");
                for (String key : keys) {
   
                    // 检查键是否过期,过期则删除
                    if (jedis.ttl(key) == -2) {
   
                        jedis.del(key);
                        System.out.println("Key " + key + " has expired and has been deleted.");
                    }
                }
            }, 0, 1, TimeUnit.SECONDS); // 每秒检查一次

            // 等待一段时间,以便观察定时删除的效果
            try {
   
                Thread.sleep(15000);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }

            // 关闭连接
            jedis.close();
            executor.shutdown();
        } catch (JedisConnectionException e) {
   
            System.err.println("Could not connect to Redis. Please make sure that the Redis server is running.");
        }
    }
}
定期删除和定时删除的概念是相同的,因为我们使用了ScheduledExecutorService来定期检查并删除过期数据。这里的“定期”指的是按照固定的时间间隔进行删除操作。而“定时”通常指的是在特定的时间点执行操作。
如果你需要在特定的时间点执行删除操作,可以使用ScheduledExecutorService的schedule方法,或者使用其他定时任务调度框架,如Quartz等。这些方法都可以帮助你在特定的时间点执行删除操作,称之为 ——“定时删除”。
惰性删除(懒汉式过期):
  • 优点:节省内存空间,对系统性能影响较小。
  • 缺点:可能会导致内存占用过高,不适用于对内存占用有严格要求的场景。
  • 应用场景:适用于对内存占用要求较高,对数据过期时间要求不严格的场景。
惰性删除是指在获取数据时检查数据是否过期,如果过期则删除。
import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisConnectionException;

public class RedisLazyDeleteExample {
   

    public static void main(String[] args) {
   
        // 连接到本地的Redis服务
        Jedis jedis = new Jedis("localhost", 6379);

        try {
   
            // 设置键值对,并设置过期时间为10秒
            jedis.set("key1", "value1");
            jedis.expire("key1", 10);

            // 获取数据时检查数据是否过期,如果过期则删除
            String value = jedis.get("key1");
            if (value == null) {
   
                System.out.println("Key does not exist.");
            } else {
   
                System.out.println("Value of key1: " + value);
                Long ttl = jedis.ttl("key1");
                if (ttl != -2 && ttl != -1) {
   
                    System.out.println("Key is not expired.");
                } else {
   
                    jedis.del("key1");
                    System.out.println("Key has expired and has been deleted.");
                }
            }

            // 关闭连接
            jedis.close();
        } catch (JedisConnectionException e) {
   
            System.err.println("Could not connect to Redis. Please make sure that the Redis server is running.");
        }
    }
}

总结: 以上是Redis中的三种常见删除策略,使用时可根据实际业务与场景进行选择。

相关推荐

  1. Redis常见删除策略

    2023-12-14 17:04:07       36 阅读
  2. Redis删除策略

    2023-12-14 17:04:07       24 阅读
  3. Mysql常用删除方式

    2023-12-14 17:04:07       28 阅读
  4. Redis--缓存常用 3 读写策略

    2023-12-14 17:04:07       17 阅读
  5. Redis——Redis数据库结构、删除策略及淘汰策略

    2023-12-14 17:04:07       12 阅读
  6. Redis过期键删除策略

    2023-12-14 17:04:07       40 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-14 17:04:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-14 17:04:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-14 17:04:07       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-14 17:04:07       20 阅读

热门阅读

  1. 矩阵的相似标准型1

    2023-12-14 17:04:07       26 阅读
  2. 【点云异常点检测】MVTec AD数据集介绍

    2023-12-14 17:04:07       36 阅读
  3. PID算法

    PID算法

    2023-12-14 17:04:07      28 阅读
  4. solidity 整数溢出漏洞

    2023-12-14 17:04:07       38 阅读
  5. LinuxBasicsForHackers笔记 -- 了解和检查无线网络

    2023-12-14 17:04:07       44 阅读
  6. Moonbeam与Subsocial集成,为网络带来社交应用创建

    2023-12-14 17:04:07       36 阅读
  7. maui sqlite开发一个商城加购物车的演示(2)

    2023-12-14 17:04:07       35 阅读
  8. Linux - 内存 - memblock 分配器

    2023-12-14 17:04:07       38 阅读
  9. Linux 创建一个service并设置开机启动

    2023-12-14 17:04:07       47 阅读
  10. Springboot+Libreoffice集成开发

    2023-12-14 17:04:07       41 阅读
  11. springboot_3.2_freemark_基础环境配置

    2023-12-14 17:04:07       36 阅读