首页 > 数据库 >【Redis】Redis的数据过期策略有哪些

【Redis】Redis的数据过期策略有哪些

时间:2024-06-10 12:04:30浏览次数:18  
标签:删除 哪些 过期 Redis jedis 内存 mykey

Redis 提供了多种数据过期策略,用于管理存储在其中的数据的生命周期。数据过期策略决定了何时以及如何删除过期的数据。主要的策略有以下几种:

1. 定时删除(Timed Deletion)

在设置键的过期时间时,Redis 会创建一个定时器,当过期时间到达时自动删除该键。这种方法的优点是删除操作会在数据到期时立即进行,但缺点是定时器的管理会消耗系统资源,尤其是在大量键设置过期时间的情况下。

示例代码

Jedis jedis = new Jedis("localhost");
jedis.setex("mykey", 10, "value"); // 设置 mykey 10 秒后过期

2. 惰性删除(Lazy Deletion)

当客户端访问键时,Redis 会检查键是否过期。如果键已过期,则在访问时删除它。这种方法的优点是惰性删除不会增加额外的系统开销,但缺点是过期的键在没有被访问时不会被删除,可能会占用内存。

示例代码

Jedis jedis = new Jedis("localhost");
String value = jedis.get("mykey"); // 访问时如果过期则删除

3. 定期删除(Periodic Deletion)

Redis 会定期扫描数据库中的键,并删除其中已过期的键。这个过程是通过 Redis 的后台线程来完成的。Redis 通过随机抽取一定数量的键,并检查它们是否过期,从而避免一次性检查大量键而导致性能下降。

原理

  • Redis 每 100 毫秒会运行一个过期扫描任务。
  • 每次扫描时,随机检查一定数量的键。
  • 如果发现过期的键,则删除它们。
  • 如果发现有大量过期键,则增加扫描频率,以更快地删除过期键。

示例代码

// 该策略在 Redis 内部自动执行,用户无需特别配置

4. 主动删除与被动删除的结合

Redis 结合了惰性删除和定期删除策略,以提高内存管理的效率:

  • 惰性删除:在访问时检查并删除过期键。
  • 定期删除:通过后台任务定期扫描并删除过期键。

这种组合策略确保了在大多数情况下,过期键能够被及时删除,同时避免了高频率的过期检查所带来的性能开销。

5. 内存驱逐策略(Eviction Policy)

当 Redis 达到最大内存限制时,会根据配置的内存驱逐策略(maxmemory-policy)来决定如何处理新的写请求。驱逐策略决定了哪些数据会被删除,以腾出空间存储新的数据。常见的内存驱逐策略包括:

  • noeviction:禁止驱逐,达到内存限制时拒绝新的写请求。
  • allkeys-lru:从所有键中驱逐最近最少使用的键。
  • volatile-lru:从设置了过期时间的键中驱逐最近最少使用的键。
  • allkeys-random:从所有键中随机驱逐键。
  • volatile-random:从设置了过期时间的键中随机驱逐键。
  • volatile-ttl:从设置了过期时间的键中驱逐剩余时间最短的键。

示例配置(在 redis.conf 配置文件中):

maxmemory 256mb
maxmemory-policy allkeys-lru

过期策略配置和管理

Redis 提供了一些配置选项,用户可以在 redis.conf 配置文件中进行调整,也可以在运行时通过 CONFIG SET 命令进行设置。例如:

# 设置 Redis 的内存限制为 256MB
maxmemory 256mb

# 设置内存驱逐策略为 allkeys-lru
maxmemory-policy allkeys-lru

使用示例

以下是一些设置和获取键过期时间的示例代码:

import redis.clients.jedis.Jedis;

public class RedisExpirationExample {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost");

        // 设置键值对,并设置过期时间为 10 秒
        jedis.setex("mykey", 10, "value");

        // 获取键的剩余过期时间(秒)
        long ttl = jedis.ttl("mykey");
        System.out.println("Time to live for 'mykey': " + ttl + " seconds");

        // 手动删除键
        jedis.del("mykey");

        // 设置键值对,并设置过期时间为 10 秒
        jedis.set("mykey", "value");
        jedis.expire("mykey", 10);

        // 取消键的过期时间
        jedis.persist("mykey");

        jedis.close();
    }
}

总结

Redis 提供了多种数据过期策略,包括定时删除、惰性删除、定期删除以及结合使用的策略。同时,Redis 还提供了内存驱逐策略,在内存不足时通过不同的算法选择删除键。合理使用这些策略可以有效地管理 Redis 数据的生命周期,确保系统性能和内存使用的高效。

标签:删除,哪些,过期,Redis,jedis,内存,mykey
From: https://blog.csdn.net/hui_zai_/article/details/139512740

相关文章

  • selenium的主要功能有哪些
    Selenium是一个广泛使用的开源工具,用于自动化web浏览器的操作。它主要用于web应用程序的测试,但也可以用于其他需要浏览器自动化的任务。以下是Selenium的主要功能:###1. 浏览器自动化 Selenium可以自动化各种web浏览器的操作,如Chrome、Firefox、Safari、Edge......
  • Redis的缓存穿透、击穿、雪崩及解决方案
    Redis的缓存穿透、击穿、雪崩是三个不同的缓存机制问题,在设计和使用Redis缓存系统时,我们需要考虑以下三种常见的问题:缓存穿透、缓存击穿和缓存雪崩。缓存穿透(CachePenetration)定义:缓存穿透:缓存穿透是指查询一个在缓存和数据库中都不存在的数据,用户不断发起这样的请求,由......
  • Redis-0-目录
    0.背景本文,参考B站博主轩辕的编程宇宙-趣话Redis系列进行整理由于最近复习了Redis相关内容,自己整理了笔记,所以刚好结合博主聊到的内容串一下。字幕,借助:GreasyFork中的BilibiliCC字幕工具整理内容段落整合,由GPT完成。1.内容1.1Redis缓存管理机制你好,我是REDIS。一个叫An......
  • Redis-11-Redis与Mysql的数据一致性
    1.是什么数据一致性呢,讲的就是缓存中的数据和db中的数据是否能一致。2.为什么先看我这篇文章,了解下缓存策略:Redis-6-三种缓存读写策略在文章中,介绍了并发场景下的一致性问题,我们已经确定了一个基本思路:先更新db,再删除缓存。这个方案,奠定了我们在读写操作时的基本思路。2.1......
  • 应聘Java开发工程师应具备的能力有哪些?
    1.熟悉J2EE主流开发框架,如Spring、SpringBoot、MyBatis、MyBatisplus、SSH等主流框架,有独立开发项目、实际应用经验。Hibernate-ORM框架,用于对象和关系型数据库之间的映射。Dubbo-阿里巴巴开源的分布式服务框架,用于构建SOA服务化架构的高性能RPC通信框架。2.熟悉Oracl......
  • 安装电动球阀有哪些禁忌?
    安装电动球阀有哪些禁忌?安装电动球阀时,需要注意以下禁忌:1、禁止在管道系统中安装和使用不合格或不达标的电动球阀。应选择符合相关国家标准和行业规范的产品。2、禁止在电动球阀的进出口处出现压力差过大的情况。应保证进出口压力平衡,以避免阀门因压力过大而损坏。3、禁止......
  • 保养气动调节阀的常见方法有哪些?
    保养气动调节阀的常见方法有哪些?气动调节阀是一种常见的工业设备,正确的保养可以延长其使用寿命,并保证其正常运行。以下是一些保养气动调节阀的常见方法:一、定期检查:定期检查气动调节阀的外观,包括阀体、膜片、密封面等部件是否存在损坏、磨损或泄漏。如发现异常,及时更换或修......
  • python的优势有哪些?
    python的优点很多,下面简单地列举一些:简单Python的语法非常优雅,甚至没有像其他语言的大括号,分号等特殊符号,代表了一种极简主义的设计思想。阅读Python程序像是在读英语。易学Python入手非常快,学习曲线非常低,可以直接通过命令行交互环境来学习Python编程。免费/开源P......
  • 一个完整的java项目通常包含哪些层次(很全面)
    1.View层(视图层)职责:负责数据的展示和用户交互。在Web应用中,View层通常与HTML、CSS和JavaScript等技术相关。技术实现:在SpringMVC中,View层可以使用JSP、Thymeleaf、FreeMarker等模板引擎来实现。同时,现代的前端框架如React、Vue或Angular等也常常与Java后端项目结合使用。2.......
  • redis做为缓存,mysql的数据如何与redis进行同步呢?
    让我们一步步来实现如何让MySQL数据库的数据和Redis缓存保持同步。想象一下,MySQL是一个大仓库,存放着所有重要的货物(数据),而Redis则像是一个快速取货窗口,让你能更快拿到常用的东西。为了让两者保持一致,我们需要搭建一座桥梁,让仓库里的变动能及时反映到取货窗口。第一步:理解同步......