首页 > 数据库 >Redis过期时间删除策略详解

Redis过期时间删除策略详解

时间:2024-09-26 09:52:52浏览次数:9  
标签:策略 删除 过期 Redis 详解 内存 惰性

文章目录

Redis过期时间删除策略详解

一、引言

在许多应用程序中,我们经常需要缓存一些临时数据,这些数据在一定时间后就会失效。Redis 提供了键过期功能,允许我们设置键的生命周期。Redis 的过期键删除策略对内存管理至关重要,本篇博客将详细解析 Redis 的过期时间删除策略,并提供 Java 伪代码进行解读。

二、Redis过期键删除策略

1、定时删除

定时删除策略是在键的过期时间到达时,通过一个定时器触发删除操作。

优点:

  • 内存友好:过期键会立即被删除,释放内存。
  • 精确:过期键会在精确的过期时间点被删除。

缺点:

  • CPU资源消耗:如果过期键非常多,同时触发的定时器可能会消耗大量CPU资源。
  • 定时器资源:每个带过期时间的键都需要一个定时器,这在键的数量非常多时会消耗大量资源。

2、惰性删除

惰性删除策略不会在键过期时立即删除键,而是在键再次被访问时才进行检查和删除。

优点:

  • CPU友好:避免了定时器的CPU消耗,删除操作仅在键被访问时发生。
  • 资源节省:不需要为每个键维护一个定时器。

缺点:

  • 内存不友好:过期键可能会长时间占用内存,直到被再次访问。
  • 不确定性:无法保证过期键会在过期后立即被删除。

3、定期删除

定期删除策略是定时删除和惰性删除的折中方案,Redis 会定期地执行删除操作来清理过期键。

优点:

  • 平衡:在内存和CPU资源之间取得平衡。
  • 可控性:通过调整执行频率和每次执行的时间窗口,可以控制删除操作对系统性能的影响。

缺点:

  • 内存不友好:和惰性删除一样,过期键会占用内存直到被定期删除操作处理。
  • 设置复杂:需要合理配置定期删除的频率和时间窗口,以避免对系统性能造成负面影响。

三、Redis实际采用的策略

Redis 实际采用的是惰性删除 + 定期删除的策略。

1、惰性删除

当尝试访问一个键时,Redis 会检查该键是否已经过期。如果已经过期,Redis 将返回 null 并删除该键。

Java 伪代码
public String get(String key) {
    // 检查键是否存在
    if (keyExists(key)) {
        // 检查键是否过期
        if (isKeyExpired(key)) {
            // 删除键
            deleteKey(key);
            return null;
        }
        // 返回键的值
        return getValueForKey(key);
    }
    return null;
}

2、定期删除

Redis 通过一个后台进程定期执行删除操作,以清理过期的键。

Java 伪代码
public void定期删除() {
    long currentTime = System.currentTimeMillis();
    for (int i = 0; i < databases; i++) {
        RedisDB redisDb = getDatabase(i);
        Map<String, Expiry> expires = redisDb.getExpires();
        for (Map.Entry<String, Expiry> entry : expires.entrySet()) {
            String key = entry.getKey();
            Expiry expiry = entry.getValue();
            // 检查键是否过期
            if (currentTime > expiry.getTimestamp()) {
                // 删除键
                deleteKey(key);
            }
        }
    }
}

class Expiry {
    private long timestamp;

    public Expiry(long timestamp) {
        this.timestamp = timestamp;
    }

    public long getTimestamp() {
        return timestamp;
    }
}

四、总结

Redis 的过期键删除策略是其内存管理的重要组成部分。通过惰性删除和定期删除的结合使用,Redis 在保证内存有效利用的同时,也避免了过度消耗CPU资源。了解这些策略对于优化 Redis 的性能和资源使用至关重要。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

标签:策略,删除,过期,Redis,详解,内存,惰性
From: https://blog.csdn.net/NiNg_1_234/article/details/142548087

相关文章

  • 计算机网络中的VLAN详解
    文章目录计算机网络中的VLAN详解一、引言二、VLAN的作用与原理1、VLAN的作用2、VLAN的工作原理2.1、VLAN标签(Tag)三、VLAN的配置与接口类型1、VLAN的配置2、接口类型四、VLAN的应用场景1、企业网络2、数据中心3、教育网络五、VLAN间的通信六、总结计算机网络中的V......
  • [redis命令]set&zset命令汇总
    set命令命令含义SADD向集合添加一个或多个成员SCARD获取集合的成员数SDIFF返回给定所有集合的差集SDIFFSTORE返回给定所有集合的差集并存储在destination中SINTER返回给定所有集合的交集SINTERSTORE返回给定所有集合的交集并存储在destination中SISMEMBER判断member......
  • Java OpenFeign详解
    OpenFeign是一个用于Java的声明式HTTP客户端,主要用于简化RESTAPI的调用。它通常与SpringCloud结合使用,提供了方便的接口来与微服务进行交互。以下是对OpenFeign的详细介绍,包括其核心概念、用法和配置。核心概念声明式调用:OpenFeign允许开发者通过注解的方式定......
  • Spring Boot 三层架构结合 Redis 和 ELK 实现高效应用开发
    目录一、技术选型二、项目结构三、SpringBoot三层架构实现四、配置Redis五、配置ELK六、代码解析在企业级应用开发中,良好的架构设计和强大的技术栈能够提高开发效率、增强系统性能和可维护性。本文将介绍如何使用SpringBoot构建三层架构,并结合Redis和ELK(Ela......
  • RTCA DO-160G标准详解:航空电子设备的全面环境适应性测试指南
    第一章:目的与适用性1.0目的RTCADO-160G是为航空电子设备设定的环境测试标准。它为不同类型的航空电子设备定义了标准的环境条件测试程序,这些设备会暴露于飞机在运营、地面操作和运输过程中遇到的各种环境条件中。RTCADO-160G的主要目的是通过规定统一的测试方法,确保......
  • DO-331标准详解:基于模型的机载软件开发和验证
    MB.1.0引言DO-331是针对航空软件开发中基于模型的开发与验证的补充标准。随着航空工业对软件的依赖日益增强,模型驱动开发(Model-BasedDevelopment,MBD)已成为确保软件质量和安全的重要方法。DO-331的目标是为开发团队提供一套系统化的框架,以确保在软件开发过程中,所有使......
  • 08 函数参数详解
    3、函数参数-详解p104105函数参数不能设置成可变类型,有坑基本参数知识任意个数任意类型deffunc(a1,a2,a3):print(a1,a2,a3)func(1,"asdf",True)位置参数(位置传参)位置传参(调用函数并传入参数)【执行】deffunc(a1,a2):print(a1,a2)func(1,3......
  • Java BigDecimal 详解
     目录一、BigDecimal简介二、常用方法A、BigDecimal常用构造方法B、BigDecimal常用方法二、代码实现A、加减乘除1.创建两个BigDecimal对象2.BigDecimal相加3.BigDecimal相减4.BigDecimal相乘5.BigDecimal相除B、转换1.定义一个数值2.转换3.java.math.BigDeci......
  • Redisson与分布式锁
    一.Redis的常用客户端:Jedis:和命令最相似,API全面。缺点:多线程不安全(多线程可以使用连接池,安全使用Jedis)SpringData:线程安全的,底层基于Netty(异步的支持)Redisson:线程安全的,底层基于Netty,提供很多的分布式服务(分布式锁,分布式集合,分布式下的JUC的封装,延时队列)二.Redis实现......
  • Redis6 多线程模型
    优质博文:IT-BLOG-CN一、单线程的优缺点对于一个请求操作Redis主要做3件事情:从客户端读取数据/解析、执行Redis命令、回写数据给客户端。所以主线程其实就是把所有操作的这3件事情串行一起执行,因为是基于内存,所以执行速度非常快。优点&缺点:【1】优点:不存在锁的竞争问题和......