Redis-设置过期时间及淘汰策略

news2024/11/27 23:34:41

文章目录

    • 1. TTL
    • 2. 设置过期时间
    • 3. 删除过期key
    • 4. 淘汰策略

Redis-设置过期时间及淘汰策略

项目组使用的 Redis 服务器发出了内存不足报警,查了一些资料,记录下。

1. TTL

查看 Redis key 是否过期是 TTL 命令,或者登陆 Redis 客户端,打开 key 之后右上角显示的 TTL,Redis 官方文档描述

TTL key
起始版本:1.0.0

时间复杂度:O(1)

返回key剩余的过期时间。 这种反射能力允许Redis客户端检查指定key在数据集里面剩余的有效期。

在Redis 2.6和之前版本,如果key不存在或者已过期时返回-1。

从Redis2.8开始,错误返回值的结果有如下改变:

如果key不存在或者已过期,返回 -2
如果key存在并且没有设置过期时间(永久有效),返回 -1 。
另见PTTL命令返回相同的信息,只不过他的时间单位是毫秒(仅适用于Redis 2.6及更高版本)。

返回值
Integer reply: key有效的秒数(TTL in seconds),或者一个负值的错误 (参考上文)。

例子
redis> SET mykey "Hello"
OK
redis> EXPIRE mykey 10 # 设置mykey 10秒后过期
(integer) 1
redis> TTL mykey # 查看mykey剩余的过期时间
(integer) 10
redis> 

经过了解,发现项目中许多 Redis key 并未设置过期时间。

管杀不管埋.jpg
(图源网络,侵删)

2. 设置过期时间

在使用 Redis 存储数据的时候,有些数据可能在某个时间点之后就不再有用了,用户可以用 DEL 命令显式地删除这些无用的数据,也可以通过 Redis 的过期时间(expiration)特性来让一个键在给定的时限(timeout)之后自动删除。

用于处理过期时间的 Redis 命令

命令示例和描述
PERSISTPERSIST key-name :移除键的过期时间
TTLTTL key-name :查看给定键距离过期还有多少秒
EXPIREEXPIRE key-name seconds :让给定键在指定的秒数之后过期
EXPIREATEXPIREAT key-name timestamp :将给定键的过期时间设置为给定的 UNIX 时间戳
PTTLPTTL key-name :查看给定键距离过期还有多少毫秒,Redis 2.6或以上版本可用
PEXPIREPEXPIRE key-name milliseconds :让给定键在指定的毫秒数之后过期,2.6或以上可用
PEXPIREATPEXPIREAT key-name timestamp-milliseconds :将给定键的过期时间设置为给定的毫秒级精度 UNIX 时间戳,2.6或以上可用

在这里插入图片描述
在这里插入图片描述

3. 删除过期key

那么问题来了,即使设置了过期时间,key 过期之后,不删除的话还是占着内存的。

redis中文文档 http://www.redis.cn/documentation.html

中有这段描述

Redis如何淘汰过期的keys

Redis keys过期有两种方式:被动和主动方式。

当一些客户端尝试访问它时,key会被发现并主动的过期。

当然,这样是不够的,因为有些过期的keys,永远不会访问他们。 无论如何,这些keys应该过期,所以定时随机测试设置keys的过期时间。所有这些过期的keys将会从密钥空间删除。

具体就是Redis每秒10次做的事情:

1. 测试随机的20个keys进行相关过期检测。
2. 删除所有已经过期的keys。
3. 如果有多于25%的keys过期,重复步奏1.

这是一个平凡的概率算法,基本上的假设是,我们的样本是这个密钥控件,并且我们不断重复过期检测,直到过期的keys的百分百低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过期keys。

以上描述中,被动方式就是常说的惰性删除:数据到达过期时间,不做处理。等下次访问该数据时,如果未过期,返回数据 ;发现已过期,删除,返回不存在(nil)。

主动方式就是常说的定期删除

Redis 每秒10次。。。。这个10次由 redis.conf 中 hz 控制,默认是10。hz的取值范围为1~500。增大hz参数的值会提升各项定期任务的执行频率,超时处理会更加精准。但也会提高Redis服务的CPU使用率。默认值10在一般情况下已经可以满足需求,如果业务场景对于某些定期任务的执行频率有很高的要求,您可以尝试在100以内调整参数值。

—PS:我这 redis 3.2.8 设置了这个参数没有生效,不知道为啥
在这里插入图片描述
在这里插入图片描述

还有就是定时删除:写功能将过期的 key 全删除了,十分耗费资源,不推荐。

4. 淘汰策略

Redis 即使设置了过期时间和删除方式,也会出现在插入新 key 时,内存不足的问题,这需要设置淘汰策略,将一些数据删除。

Redis 中文文档中,有下面的描述:

配置Redis成为一个缓存

如果你想把Redis当做一个缓存来用,所有的key都有过期时间,那么你可以考虑 使用以下设置(假设最大内存使用量为2M):

```
maxmemory 2mb
maxmemory-policy allkeys-lru
```

以上设置并不需要我们的应用使用EXPIRE(或相似的命令)命令去设置每个key的过期时间,因为 只要内存使用量到达2M,Redis就会使用类LRU算法自动删除某些key。

相比使用额外内存空间存储多个键的过期时间,使用缓存设置是一种更加有效利用内存的方式。而且相比每个键固定的 过期时间,使用LRU也是一种更加推荐的方式,因为这样能使应用的热数据(更频繁使用的键) 在内存中停留时间更久。

这其中涉及到3个 redis.conf 参数

maxmemory
当redis使用内存达到设定值时触发淘汰策略

在这里插入图片描述

maxmemory-samples
触发淘汰策略时,每次选取的key的数量,默认值是5,如果增加,会提高LRU或TTL的精准度,redis作者测试的结果是当这个配置为10时已经非常接近全量LRU的精准度了,另外增加这个值会在主动清理时消耗更多的CPU时间。

在这里插入图片描述

maxmemory-policy
淘汰策略,有以下8种:
1)noeviction: 不删除,直接返回报错信息。
2)allkeys-lru:移除最久未使用(使用频率最少)使用的key。
3)volatile-lru:在设置了过期时间的key中,移除最久未使用的key。
4)allkeys-random:随机移除某个key。
5)volatile-random:在设置了过期时间的key中,随机移除某个key。
6)volatile-ttl: 在设置了过期时间的key中,移除准备过期的key。
7)allkeys-lfu:移除最近最少使用的key。
8)volatile-lfu:在设置了过期时间的key中,移除最近最少使用的key。
注意这个检测范围是 maxmemory-samples 定义的值,并不是全库。

在这里插入图片描述

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

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

相关文章

重点算法排序之堆排序(下篇)

文章目录 一、堆排序的概念 1、1 堆的基本概念 1、2 堆的特性 二、堆排序的思路及代码实现 2、1 建堆 2、2 向下调整算法详解 2、3 建完堆后进行堆排序 2、3、1 排升序建大堆 2、3、2 建大堆后进行堆排序 三、堆排序的例题 2、1 例题1:堆排序 2、2 例题2&#x…

HTTP.sys远程代码执行漏洞修复

1.漏洞描述 Http.sys是Microsoft Windows处理HTTP请求的内核驱动程序。HTTP.sys会错误解析某些特殊构造的HTTP请求,导致远程代码执行漏洞。成功利用此漏洞后,攻击者可在System帐户上下文中执行任意代码。由于此漏洞存在于内核驱动程序中,攻击…

VMware下的虚拟机网络设置(NAT、桥接、仅主机)

在入门使用VMware搭建Linux的环境时,对于网络的设置时不可避免的,因为linux搭建完成后,或多或少的回去访问外部资源或者被外部资源访问。这时候设置的虚拟机网络连接方式就显得尤为重要,所以在这里整理了一下虚拟机的三种连接方式…

说说压缩文件“打开密码”的两种模式

我们知道,如果对压缩文件有保密需求,可以给压缩文件设置“打开密码”,通过密码才能查看压缩文件里的内容。那通过WinRAR设置的“打开密码”有两种模式,你知道吗?下面来具体说说。 模式一:可以看到压缩包的…

springboot集成mybatis

springboot集成mybatis 文章目录springboot集成mybatis前言一、初始化项目1.创建项目2.引入依赖3.创建实体类4.修改配置文件二、使用Mybatis1.纯注解方式2.使用xml文件方式三、使用pagehelper分页前言 MyBatis 是一个开源、轻量级的数据持久化框架,是 JDBC 和 Hibe…

赤池信息量准则(AIC)和贝叶斯信息准则(BIC)

一 AIC 赤池信息量准则(Akaike information criterion,AIC)是评估统计模型的复杂度和衡量统计模型“拟合”资料之优良性(Goodness of fit)的一种标准,是由日本统计学家赤池弘次创立和发展的。赤池信息量准则建立在信息熵的概念基…

LeetCode题目笔记——面试题 02.07. 链表相交

文章目录题目描述题目难度——简单方法一:数数,然后遍历代码/C方法二:双指针代码/C代码/Python总结题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c…

假期无聊,不如一起刷《剑指offer》(第六天)

剑指 Offer 41. 数据流中的中位数 剑指 Offer 41. 数据流中的中位数 这道题是求数据流的中位数,一般情况我们可以采用排序的方式很轻松的找出中位数。如果我们采用插入排序的话,每次插入数字的时间复杂度大概是O(N),怎么能让这个时间更短呢&a…

shell原理及Linux权限

shell及Linux权限 目录shell及Linux权限一、指令1.tar指令(重要)2.热键3.bc命令4.uname –r指令:5.关机6.以下命令作为扩展:二.shell命令以及运行原理三.权限1.权限的概念:2.Linux下有两种用户:超级用户(ro…

一图读懂mybatis 查询接口的源码流程

图比较大:如果看着比较糊的话,可以下载高清图:https://download.csdn.net/download/langwuzhe/87376216 第一步:创建 StatementHandler、ParameterHandler、ResultSetHandler-----------(三剑客的新生) 创建 StatementHandler 对…

WPS怎么转换PDF?保证你一学就会

相信大家在处理文件的时候肯定会使用到WPS文件,WPS文件包括Word、Excel、PPT文件,是我们经常使用的几种文件,有这几种文件我们可以更好的完成工作,但是在有些情况下,我们需要将WPS转换成PDF文件,这样就会更…

AS弹性伸缩简单介绍

AS 介绍 弹性伸缩(AutoScaling)是一种服务,可以自动调整弹性计算资源(ECS),以满足业务需求的变化。 弹性伸缩仅支持ECS实例或ECI实例数量的增加和减少,但不支持单个ECS实例或ECI实例的配置变更。 应用场景:弹性扩张、…

Windows安装使用Docker,方便你的开发和部署(DockerDesktop篇)

前言 首先声明,此篇不是完全的Docker技术文章,而是单纯的教你使用Docker,不包含Docker的一些命令、如何打包Docker镜像等等。 为什么要用Docker? 大家好,我是小简,今天带来一篇Windosw环境下使用Docker的…

女生学软件测试有什么优势么

在IT技术行业,女生学习软件测试还是有很大优势的。女生相较于男生更有耐心,包容性强,心思细腻,对细节把控更好,同时还能帮助团队男女平衡,活跃气氛。 软件测试是一个只要你肯学习就会有回报的职业&#xf…

判断用户输入的数字是奇数还是偶数

判断用户输入的数字是奇数还是偶数代码关键知识点 条件运算符, 相等运算符,为了让两个不同的数据类型(如number和string)的值可以作比较,必须要把一种类型转换为另一种类型(转换成相同的类型)&…

Ae 效果详解:CC Ball Action

Ae菜单:效果/模拟/CC Ball ActionEffect/Simulation/CC Ball ActionCC Ball Action (滚珠操作效果)可以将所有的像素变成小球模样,并且能够打破图层成球形网格。可通过摄像机观察其所具有的 3D 效果。◆ ◆ ◆效果控件属性说明S…

【数据结构与算法——C语言版】6. 排序算法(4)——快速排序

前言 本文介绍排序算法中的快速排序,快速排序是比较常用的一种排序算法,也是面试中经常会问到的一种排序算法,简称快排,是我们要介绍的第一种时间复杂度为O(nlogn)的排序算法。 核心思想 快速排序(Quick Sort)使用分治法策略&a…

Vue--》详解状态管理工具——Vuex

目录 vuex 搭建vuex环境 vuex的使用 vuex开发者工具使用 getters mapState和mapGetters mapMutations和mapActions 多组件共享数据 vuex实现模块化 vuex 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对vue应用中多个组件的共享状态进行集中式的管…

c语言进阶(4)——字符函数的详细解析

文章目录1.strlen函数2.strcpy函数3.strcat函数4.strcmp函数5.strncpy函数6.strncat函数7.strncmp函数8.strstr函数9.strtok函数10. strerror函数11. 相关字符转换函数12.字符转换函数1.strlen函数 size_t strlen( const char *string ); 用途:用来计算字符串长度的…

【云原生进阶之容器】第二章Controller Manager原理2.8节--Resync机制

8 Resync机制 8.1 DeltaFIFO队列为什么需要Resync 为什么需要 Resync 机制呢?因为在处理 SharedInformer 事件回调时,可能存在处理失败的情况,定时的 Resync 让这些处理失败的事件有了重新 onUpdate 处理的机会。 主要的目的是为了不丢数据,处理 resync 机制还有边缘触发与…