首页 > 数据库 >2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?

时间:2023-07-01 21:01:09浏览次数:42  
标签:01 过期 redis maxmemory Redis 算法 LRU 淘汰

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?

答案2023-07-01:

缓存淘汰算法(过期策略)

当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率几乎等同于不可用。

maxmemory

在生产环境中,我们严禁Redis发生交换行为。为了限制Redis的最大内存使用量,Redis提供了一个配置参数maxmemory,用于设置期望的最大内存大小。

当实际内存超出maxmemory限制时,Redis提供了几种可选策略(maxmemory-policy),供用户自行选择如何释放空间以便继续提供读写服务。

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?_Redis

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?_Redis_02

  • noeviction: 这种策略不会继续为写请求提供服务(DEL请求可以继续提供服务),但读请求可以继续进行。这保证不会丢失数据,但会导致在线业务无法持续进行。这是默认的淘汰策略。
  • volatile-lru: 该策略尝试淘汰设置了过期时间的键,优先淘汰最近最少使用的键。没有设置过期时间的键不会被淘汰,以确保持久化数据不会突然丢失。
  • volatile-ttl: 与前面的策略相似,但淘汰的依据是键的剩余生存时间(TTL)值,TTL越小的键优先被淘汰。
  • volatile-random: 与前面的策略类似,但是淘汰过期键集合中的键时是随机的。
  • allkeys-lru: 与volatile-lru不同,该策略淘汰的是整个键集合,而不仅限于过期键集合。这意味着没有设置过期时间的键也会被淘汰。
  • allkeys-random: 与前面的策略类似,但淘汰的键是整个键集合中的随机键。

策略中的"volatile-xxx"仅针对带有过期时间的键进行淘汰,而"allkeys-xxx"策略会对所有键进行淘汰。如果您只是将Redis用作缓存,应该使用"allkeys-xxx"策略,客户端在写入缓存时不需要提供过期时间。如果您还希望同时使用Redis的持久化功能,则应使用"volatile-xxx"策略,这样可以保留未设置过期时间的键,它们将被视为永久键而不会被LRU算法淘汰。

LRU 算法

LRU算法的实现通常涉及两个数据结构:字典和链表。字典用于以键值对的形式存储数据,而链表用于维护键的访问顺序。链表中的元素按照最近访问的时间顺序排列,最近访问的元素位于链表的头部,而不常使用的元素位于尾部。当缓存空间已满时,将会踢掉链表尾部的元素。

链表尾部的元素是不被频繁访问的,因此在空间满时会被移除。而链表头部的元素是最近被访问过的,暂时不会被移除。

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?_缓存_03

近似 LRU 算法

Redis使用的是近似LRU算法,与LRU算法有一些不同。由于LRU算法需要消耗大量的额外内存并需要对数据结构进行较大改造,所以Redis选择使用近似LRU算法。

近似LRU算法在现有数据结构的基础上采用了随机采样法来淘汰元素,能够达到非常接近LRU算法的效果。为了实现近似LRU算法,Redis为每个键增加了一个额外的小字段,该字段的长度为24个比特,表示最后一次访问该键的时间戳。

当Redis执行写操作时,如果发现内存超出maxmemory限制,它会执行一次LRU淘汰算法。该算法非常简单:随机选择5个键(可配置为maxmemory-samples数),然后淘汰最旧的键。如果淘汰后仍然超出maxmemory,Redis将继续随机采样淘汰,直到内存低于maxmemory为止。

2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?_缓存_04

maxmemory-policy的配置决定了采样的方式。若为"allkeys",则从所有键的字典中进行随机采样;若为"volatile",则从带有过期时间的键字典中随机采样。每次采样的键数量由maxmemory-samples配置确定,默认为5。

采样数量越大,近似LRU算法的效果越接近严格的LRU算法。

此外,Redis 3.0引入了淘汰池的概念,新的算法会维护一个候选池(大小为16)。池中的数据按访问时间排序,首次随机选取的键将放入池中。随后的每次随机选取只有在访问时间小于池中最小时间时,才会放入池中,直到池满为止。当池满时,如果有新的键需要放入,将移除最后访问时间最大(最近被访问)的键。这进一步提升了近似LRU算法的效果。

标签:01,过期,redis,maxmemory,Redis,算法,LRU,淘汰
From: https://blog.51cto.com/moonfdd/6601476

相关文章

  • Redis中的事务与持久化简单整理
    Redis中的事务与持久化事务可以一次执行多个命令,并带有两个重要的保证:1、事务中的所有命令都被序列化并按顺序执行。Redis执行事务期间,不会被其它客户端发送的命令打断,事务中的所有命令都作为一个隔离操作顺序执行。2、Redis事务是原子操作,或者执行所有命令或者都不执行。通......
  • LeetCode-146-LRU缓存
    146题:LRU缓存题目请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intke......
  • HO引擎近况20230701
    6月份忘了来写博客了,原因主要就是我离职了,好多事所以这个彻底忘了离职的原因是公司说现金流断了,没钱了,整个项目组都砍了,别的项目组据说也快了于是这个月就在找工作中,各种原因,真的不好找我感觉可以自己需要再去充充电了,而且需要开拓一下自己以前想做没做的方面,为以后多......
  • JMeter性能测试-01
    一、使用JMeter工具发送get请求(1)不带参数的get请求 (2)路径上带参数的get请求 (3)带参数的get请求二、使用JMeter工具发送post请求(1)不带参数的post请求 (2)表单数据类型的post请求 (3)form数据类型的post请求,要添加http信息管理头,申明是json数据格式三、JMeter设......
  • Redis实现分布式锁的7种方案
    7种方案前言日常开发中,秒杀下单、抢红包等等业务场景,都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开,跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方,欢迎大家指出哈,一起学习一起进步。 什么是分布式锁方案一:SETNX+EXPIRE方案二......
  • Redis 的 AOF 重写机制
    Redis的AOF重写机制AOF持久化机制简介AOF(AppendOnlyFile)是一种持久化机制,它将Redis的写操作以日志的形式记录在文件中,以保证数据的安全性和可恢复性。AOF持久化机制的优点有以下几个:可以保证数据的完整性,即使发生系统崩溃或者断电,也可以通过AOF文件恢复数据可......
  • 02_MyBatis01
    1.JDBC操作的缺陷JDBC查询数据代码JDBC添加数据代码JDBC操作的问题数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能sql语句在代码中硬编码,造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。查询操作时,需要手动将结果集中的数据手动封......
  • Redis持久化之 混合持久化
    Redis混合持久化什么是混合持久化混合持久化是在AOF持久化的基础上,定期进行RDB持久化,以保证数据的快速恢复混合持久化的实现方式是在AOF重写时,将RDB文件以二进制压缩格式写入到AOF文件的开头,之后的数据再以AOF格式追加到文件的末尾3混合持久化的优点是:可以减......
  • Redis群集​
    在centos01安装配置ntp服务器,Centos到centos06配置同步时间,在centos01到centos06安装redis服务器在centos02到centos06修改配置文件开启群集功能,查看节点监听发端口信息在centos01配置redis复制群集查看群集状态,添加删除群集节点,转移卡槽信息修改服务器配置文件重新时间服务器从red......
  • Redis数据结构——快速列表(quicklist)1
    Redis数据结构——快速列表(quicklist)一、什么是quicklistquicklist是Redis3.2版本以后针对链表和压缩列表进行改造的一种数据结构,是zipList和linkedList的混合体,相对于链表它压缩了内存。进一步的提高了效率。quicklist其实就是简单的双链表,但每个双链表节点中保存......