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

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 数据的生命周期,确保系统性能和内存使用的高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C#线程设计】3:threadpool

实现: (1).控件:group Box,text Box,check Box,label,botton,richtextbox 控件拉取见:https://blog.csdn.net/m0_74749240/article/details/139409510?spm1…

插卡式仪器模块:数据记录模块(插卡式)

• 32 位分辨率 • 250 KSPS 采样率 • 可以同时并且连续地记录两个通道的电压输入 • 实时上传原始数据至 PC 端 通道22输入阻抗电压22 kΩ10 MΩ电流0.2 Ω输入范围电压 250 mV 4.5 V电流1.5 A耦合DCDC带宽450 Hz385 HzADC 分辨率32 Bits24 Bits采样率10 kSPS250 kSPS测量…

kafka集成SpringBoot api编写教程

1.新建项目 用的idea是20222.1.3版本,没有Spring Initializr 插件,不能直接创建springboot项目 可以在以下网址创建项目,下载后解压,然后用idea打开项目即可 1.1 在 https://start.spring.io/ 上创建项目 1.2上传到linux&#x…

知识图谱的应用---智能公安

文章目录 智慧公安典型应用 智慧公安 智能公安是利用互联网、物联网、人工智能、云计算、智能引擎、视频技术、知识图谱等技术为支撑,以公安信息化为核心,通过互联化、物联化、智能化的方式,促进公安系统各个功能模块高度集成、协调运作&…

【Redis】Redis实现高性能的原因

Redis 作为一个单线程的数据库,能够达到高性能的关键在于其设计上的几个方面。以下是 Redis 快速的几个主要原因: 1. 内存存储 Redis 是一个内存数据库,所有数据都存储在内存中。内存的访问速度远远快于磁盘,所以这使得读写操作…

DataGridView *星号行

这个问题可能是因为你的 DataGridView 控件中的 AllowUserToAddRows 属性被设置为 true,导致在最后一行出现了一个星号行。这个星号行实际上是 DataGridView 控件中的“空行”,它会在最后一行自动添加,以便用户可以添加新的行。 要解决这个问…

第53集《摄大乘论》

《摄大乘论》,和尚尼慈悲、诸位法师、诸位居士,阿弥陀佛!(阿弥陀佛!)请大家打开《讲义》第一七八页,乙七、增上心学分。 这一科是正宗分的第七科,讲到增上心学。我们在前面花了很多的时间,来介…

stm32之USMART调试组件的使用

一、什么是USMART? USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具。具体工作过程是通过串口发送命令给单片机,然后单片机收到命令之后调用单片机里面对应的相关函数,并执行,同时支持返回结果。 二、USMART调…

Vue.js 学习总结(8)—— Vue 3 的 Teleport 特性,让你实现跨组件传输内容

什么是 Teleport? 在 Vue 3 中,Teleport 是一个新的内置组件,它允许你将子组件或 DOM 元素渲染到指定的 DOM 节点之外。简而言之,你可以将某个组件“传送”到另一个地方,而不必让它们局限于父组件的 DOM 树结构中。 …

ReactRouter——路由配置、路由跳转、带参跳转、新route配置项

目录 写在前面 (一)初步使用router 1.安装react-router-dom 2.创建router结构 3.嵌套路由 4.配置not found页面 (1)确切路由报错页面 (2)未配置路由报错页面 5.重定向 (二)路由跳转 1.组件跳转 2.NavLink 3.js跳转 (三)传递参数 1.searchParams(query)参数 2…

这两款kimi和豆包插件,用来辅助文献阅读和总结,太香了!娜姐亲测好用

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 ChatGPT刚出来的时候,几款速读PDF的AI工具ChatDoc、ChatPDF也跟着火了起来,可见大家对于速读文献、总结文档需求很高。 我记得ChatPDF只有几次免费机会…

Follow Carl To Grow|【LeetCode】654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

【LeetCode】654.最大二叉树 题意:给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀…

2024.6.9 七

Python的time库 先导入库 import time相关函数 time.time() 返回当前时间的时间戳(一个记录时间的浮点数),从1970年开始算的 time.localtime(sec) 返回一个指定时间戳(sec)的struct_time对象,是一个元组封装起来的,默认是当地时间 struct_time对象 tm_year 年 tm_mon 月 tm_…

opencv--使用opencv实现旋转角度的模板匹配

下面的例子是简单的使用opencv 实现的模板匹配流程,其中时间性能和精确度还需要调整,如果直接使用会出问题,所以这个只是例子,根据代码原理可以实现尺度变化的模板匹配和旋转尺度变化同时,具体根据实现的旋转代码进一步…

Nacos的配置中心

1.前言 除了注册中心和负载均衡之外, Nacos还是⼀个配置中心, 具备配置管理的功能. Namespace 的常用场景之一是不同环境的配置区分隔离, 例如开发测试环境和⽣产环境的配置隔离。 1.1 为什么需要配置中心? 当前项目的配置都在代码中,会存…

Django 部署指南

部署 Django 应用程序涉及将我们的应用程序从开发环境部署到生产环境,并确保它可以在生产服务器上安全运行和扩展。其实了解几种部署方案,相信你对将来的项目更得心应手。 1、问题背景 Django 是一款流行的 Python Web 框架,但对于新手来说&…

elasticsearch hanlp 插件安装操作

elasticsearch hanlp 插件安装操作 下载 hanlp 插件上传hanlp插件到elasticsearch服务器安装hanlp插件kibana测试 下载 hanlp 插件 这里大家根据自己对应的 elasticsearch 版本下载匹配版本的 hanlp 插件,由于 hanlp 及 elasticsearch 各个版本之间差别较大&#x…

将克隆到本地的6.824项目上传到自己的github

前置知识见:把自己在本地完成的mit6.s081项目上传到自己的github仓库里_mit6.s081 lab上传-CSDN博客 先在github建立一个自己的仓库 由于github可以给自己的主分支改名了,我这次是勾选了创建README文件 在本地同样是建立一条remote分支 git remote add…

Ant Design Vue Table组件全单元格编辑实现方案

在ant上的table常见用法是一行的元素可编辑&#xff0c;如下&#xff1a; 但是现在有一个需求是全部单元格均可编辑&#xff0c;如何实现呢&#xff1f; 表格组件 <a-tablev-if"query.personnel_type 0"size"middle"row-key"id":scroll&qu…