redis 过期策略都有哪些?LRU 算法知道吗?写一下 java 代码实现?

Redis 的过期策略

Redis 提供了多种数据过期策略,以确保内存的有效利用和数据的及时清理。以下是主要的过期策略:

  1. 定时删除

    • 在设置键的过期时间时,创建一个定时器(timer),在键过期时立即删除。
    • 优点:键过期后立即释放内存。
    • 缺点:每个键都需要一个定时器,会消耗大量的系统资源。
  2. 惰性删除

    • 只有在访问一个键时,才会检查该键是否已过期,如果已过期则删除。
    • 优点:不会浪费系统资源,只有在需要时才进行检查。
    • 缺点:可能会导致大量已过期但未被访问的键占用内存。
  3. 定期删除

    • 定期检查并删除已过期的键,通常是在后台线程中执行。
    • 优点:平衡了定时删除和惰性删除的优缺点,既不会浪费系统资源,也不会导致大量已过期键占用内存。
    • 缺点:需要合理设置检查频率,否则可能会影响性能。

LRU 算法

LRU(Least Recently Used)算法是一种常用的缓存淘汰策略,用于管理缓存中的数据项。当缓存满时,优先淘汰最近最少使用的数据项。

Java 代码实现 LRU 算法

以下是一个简单的 Java 代码实现 LRU 算法,使用 LinkedHashMap 来实现:

import java.util.LinkedHashMap;
import java.util.Map;

public class LRUCache extends LinkedHashMap {
    private final int cacheSize;

    public LRUCache(int cacheSize) {
        // 使用 accessOrder 参数来启用按访问顺序排序
        super(cacheSize, 0.75f, true);
        this.cacheSize = cacheSize;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
        // 当缓存大小超过指定的 cacheSize 时,返回 true 表示移除最老的条目
        return size() > cacheSize;
    }

    public static void main(String[] args) {
        LRUCache cache = new LRUCache<>(3);

        cache.put(1, "A");
        cache.put(2, "B");
        cache.put(3, "C");

        System.out.println("Cache after initial insert: " + cache);

        // 访问某个键,使其成为最近使用的
        cache.get(1);

        cache.put(4, "D");

        System.out.println("Cache after adding a new entry: " + cache);
    }
}

代码解释

  1. 继承 LinkedHashMap

    • LinkedHashMap 是一个哈希表和链表实现的映射表,可以按照插入顺序或访问顺序维护元素的顺序。
    • 通过设置 accessOrder 参数为 true,启用按访问顺序排序。
  2. 构造函数

    • super(cacheSize, 0.75f, true) 调用父类的构造函数,初始化缓存大小、负载因子和访问顺序。
    • cacheSize 是缓存的最大容量。
  3. 重写 removeEldestEntry 方法

    • 当缓存大小超过 cacheSize 时,返回 true,表示移除最老的条目。
  4. 测试代码

    • 创建一个最大容量为 3 的 LRU 缓存。
    • 插入三个键值对,并打印当前缓存。
    • 访问键 1,使其成为最近使用的。
    • 插入一个新的键值对,触发缓存淘汰机制,移除最老的条目。
    • 打印最终的缓存状态。

通过这种方式,可以实现一个简单的 LRU 缓存,适用于各种需要缓存管理的场景。

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