2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?
答案2023-07-01:
缓存淘汰算法(过期策略)
当Redis的内存超出物理内存限制时,内存中的数据就会频繁地与磁盘进行交换,这个过程叫做交换(swap)。由于交换的高开销,Redis的性能会急剧下降。对于访问频率较高的Redis实例来说,这样低效的存取效率几乎等同于不可用。
maxmemory
在生产环境中,我们严禁Redis发生交换行为。为了限制Redis的最大内存使用量,Redis提供了一个配置参数maxmemory,用于设置期望的最大内存大小。
当实际内存超出maxmemory限制时,Redis提供了几种可选策略(maxmemory-policy),供用户自行选择如何释放空间以便继续提供读写服务。
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算法的实现通常涉及两个数据结构:字典和链表。字典用于以键值对的形式存储数据,而链表用于维护键的访问顺序。链表中的元素按照最近访问的时间顺序排列,最近访问的元素位于链表的头部,而不常使用的元素位于尾部。当缓存空间已满时,将会踢掉链表尾部的元素。
链表尾部的元素是不被频繁访问的,因此在空间满时会被移除。而链表头部的元素是最近被访问过的,暂时不会被移除。
近似 LRU 算法
Redis使用的是近似LRU算法,与LRU算法有一些不同。由于LRU算法需要消耗大量的额外内存并需要对数据结构进行较大改造,所以Redis选择使用近似LRU算法。
近似LRU算法在现有数据结构的基础上采用了随机采样法来淘汰元素,能够达到非常接近LRU算法的效果。为了实现近似LRU算法,Redis为每个键增加了一个额外的小字段,该字段的长度为24个比特,表示最后一次访问该键的时间戳。
当Redis执行写操作时,如果发现内存超出maxmemory限制,它会执行一次LRU淘汰算法。该算法非常简单:随机选择5个键(可配置为maxmemory-samples数),然后淘汰最旧的键。如果淘汰后仍然超出maxmemory,Redis将继续随机采样淘汰,直到内存低于maxmemory为止。
maxmemory-policy的配置决定了采样的方式。若为"allkeys",则从所有键的字典中进行随机采样;若为"volatile",则从带有过期时间的键字典中随机采样。每次采样的键数量由maxmemory-samples配置确定,默认为5。
采样数量越大,近似LRU算法的效果越接近严格的LRU算法。
此外,Redis 3.0引入了淘汰池的概念,新的算法会维护一个候选池(大小为16)。池中的数据按访问时间排序,首次随机选取的键将放入池中。随后的每次随机选取只有在访问时间小于池中最小时间时,才会放入池中,直到池满为止。当池满时,如果有新的键需要放入,将移除最后访问时间最大(最近被访问)的键。这进一步提升了近似LRU算法的效果。
2023-07-01:redis过期策略都有哪些?LRU 算法知道吗?的更多相关文章
- redis 的过期策略都有哪些?内存淘汰机制都有哪些?
面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 r ...
- redis的过期策略都有哪些?
1.面试题 redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2.面试官心里分析 1)老师啊,我往redis里写的数据怎么没了? 之前有同学问过我,说我们生产环境的redi ...
- 4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?
作者:中华石杉 面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当 ...
- redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?
redis的过期策略都有哪些? 设置过期时间: set key 的时候,使用expire time,就是过期时间.指定这个key比如说只能存活一个小时?10分钟?指定缓存到期就会失效. redis的过 ...
- 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透
前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...
- 面试系列14 redis的过期策略都有哪些
(1)设置过期时间 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时?10分钟?这个很有用,我们自己可以指定缓存到期就失效. 如果假设你 ...
- Redis过期策略
一.设置过期时间 expire key time(以秒为单位) -- 这是最常用的方式 setex(String key, int seconds, String value) -- 字符串独有的方式 ...
- 了解Redis过期策略及实现原理
我们在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期. 当我们设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的. redis设置过期时间 ...
- Redis过期策略(转)
1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, String value)--字符串独有的方式 具体的 ...
- 第九章 Redis过期策略
注:本文主要参考自<Redis设计与实现> 1.设置过期时间 expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, ...
随机推荐
- Java代理之jdk动态代理+应用场景实战
本文将先介绍jdk动态代理的基本用法,并对其原理和注意事项予以说明.之后将以两个最常见的应用场景为例,进行代码实操.这两个应用场景分别是拦截器和声明性接口,它们在许多开发框架中广泛使用.比如在spri ...
- Kubernetes客户端认证(二)—— 基于ServiceAccount的JWTToken认证
1.概述 在 Kubernetes 官方手册中给出了 "用户" 的概念,Kubernetes 集群中存在的用户包括 "普通用户" 与 "Service ...
- ORA-12560: TNS: 协议适配器错误 windows
1.监听服务没有起起来.windows平台个一如下操作:开始-程序-管理工具-服务,打开服务面板,启动oraclehome92TNSlistener服务. 2.database instance没有起 ...
- DRF的限流组件(源码分析)
DRF限流组件(源码分析) 限流,限制用户访问频率,例如:用户1分钟最多访问100次 或者 短信验证码一天每天可以发送50次, 防止盗刷. 对于匿名用户,使用用户IP作为唯一标识. 对于登录用户,使用 ...
- Portainer安装
个人博客地址: https://note.raokun.top 拥抱ChatGPT,国内访问网站:https://www.playchat.top Portainer是一个可视化的容器镜像的图形管理工 ...
- Hugging News #0428: HuggingChat 来啦
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- P1014 [NOIP1999 普及组] Cantor 表
题目链接:https://www.luogu.com.cn/problem/P1014 有理数可枚举 In 1873 Cantor proved the rational numbers counta ...
- SqliLabs 第二关 ,数字型注入!!!
首先打开网页,进行注入点的测试 输入?id=1 and 1=1发现1=2的时候出现了报错,说明服务器接收了我们的指令,并且进行了反馈,说明了有注入点的存在,然后对注入点进行测试 然后输入order b ...
- 大米cms爆破后台及支付逻辑漏洞
又找到个网站挖洞,我来康康. 大米手机是个什么鬼手机??看一下吧 这个支付页面好熟悉,可能存在支付逻辑漏洞,咱们用burp改个包看看. 先支付一个看看 把包里那个=1改成0试试~ 证实确实存在支付逻辑 ...
- 2022-02-12:k8s安装es,yaml如何写?
2022-02-12:k8s安装es,yaml如何写? yaml如下: apiVersion: v1 kind: Service metadata: labels: app: elasticsearc ...