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中的三种常见删除策略,使用时可根据实际业务与场景进行选择。

你可能感兴趣的:(Java,Redis,redis,数据库,java)