首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis常见面试题之 - 内存淘汰算法

Redis 内存使用限制设置 一般来说,要开启 Redis 的内存使用限制才会触发内存淘汰机制,Redis 内存使用限制通过以下配置来设置: # 设置 Redis 最大使用内存大小为100M maxmemory...Redis 内存淘汰算法 而 Redis 的淘汰算法有多种,如下: 随机 TTL LRU(Least Recently Used,最近最少使用LFU(Least Frequently Used,最不经常使用...前面也说过,LFU 算法是通过访问 Key 的频率来进行淘汰的,下面我们介绍以下 RedisLFU 算法是怎么实现的。...RedisLFU 算法也是通过 robj 对象的 lru 字段来保存 Key 的访问频率的,LFU 算法把 lru 字段分为两部分,如下图: ?...所以 Redis 使用了一种比较复杂的算法了计算访问频率,算法如下: 获取一个 0 ~ 1 的浮点数随机数 r。

91620

Redis的数据淘汰策略解读

volatile-lfuRedis 4.0后新增的内存淘汰策略,淘汰所有设置了过期时间的键值中最少使用的键值。 在所有数据范围内进行淘汰: allkeys-random:随机淘汰任意键值。...allkeys-lru:淘汰整个键值中最久未使用的键值。 allkeys-lfuRedis 4.0后新增的内存淘汰策略,淘汰整个键值中最少使用的键值。...LFU(Least Frequently Used):LFU策略基于数据项被访问的频率来确定淘汰哪些数据。访问次数最少的数据项将被优先淘汰。...LFU的核心思想是,访问频次较高的数据项可能在未来还会被多次访问,因此应该保留在缓存中。 LRU侧重于数据项最近的访问时间,而LFU侧重于数据项的访问频率。 LRU易于实现,通常使用双向链表和哈希表。...而LFU的实现相对复杂,需要使用最小堆或哈希表等数据结构。 在某些情况下,LFU可能比LRU表现更好,因为它更加关注访问频率。然而,对于某些访问模式,LFU可能会导致命中率较低。

71510
您找到你想要的搜索结果了吗?
是的
没有找到

面试官:聊一聊Redis过期淘汰策略

为了不影响Redis的性能,通常会控制扫描的频率和数量。内存淘汰策略undefined当Redis的内存使用达到配置的上限时,需要进行内存淘汰。...为了有效平衡CPU和内存资源的使用Redis的定期删除策略会根据服务器的运行情况调整执行频率。...(最不经常使用使用LFU(Least Frequently Used,最不经常使用),从所有的键中选择某段时间之内使用频次最少的键值对清除LFU策略的实现相对复杂,因为它需要跟踪每个键的使用频率...在Redis中,可以通过设置maxmemory-policy为lfu来启用LFU内存淘汰策略。当Redis内存达到最大限制时,LFU策略会根据键的使用频率来淘汰那些最不经常被访问的键。...此外,LFU策略可能会引入额外的计算开销,因为需要维护和更新每个键的使用频率。选择合适的内存淘汰策略取决于具体的应用场景和业务需求。

42310

Redis高可用高性能缓存的应用系列03 - 缓存过期淘汰策略LRU、LFU

随机删除5.volatile-random:从过期键的集合中随机驱逐6.volatile-ttl:从配置了过期时间的键中,驱逐马上就要过期的键7.volatile-lfu:从配置了过期时间的键中驱逐使用频率最少得键...8.allkeys-lfu:从所有键中使用频率最少的键LRU根据最近被使用的时间,距离当前最远的数据优化被淘汰,当有新增key 或者是被访问时,元素会被追加在队尾,需要淘汰时从头部开始淘汰,这个是LRU...图片在Redis redisObject 中,维护了一个24位的时钟(有点类似于Cpu的频率),可以简单理解为Cpu对内存使用的时间戳,每个Key对应的也维护了同样24位的时间戳。...,但是没有考虑Key使用的次数,Redis4.0 以后,新增了LFU的淘汰策略,根据使用时间和次数最为淘汰的权重。...LFU把之前LRU的24bit拆分成两部分,16bit的时间钟和8it的访问频率,8bit比较小,在源码的evict文件中给出了数据。

45140

绝对能让你彻底明白的Redis的内存淘汰策略

redis的内存淘汰策略有以下6种 noeviction:当内存使用超过配置的时候会返回错误,不会驱逐任何键 allkeys-lru:加入键的时候,如果过限,首先通过LRU算法驱逐最久没有使用的键 volatile-lru...,从过期键的集合中随机驱逐 volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键 在redis 4.0以后,又增加了以下两种 volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键...allkeys-lfu:从所有键中驱逐使用频率最少的键 内存淘汰策略可以通过配置文件来修改,redis.conf对应的配置项是maxmemory-policy 修改对应的值就行,默认是noeviction...,而D被访问的频率比较低,所以我们更想让B保留,把D删除,所以我们接下来看另一种策略 LFU LFU(leastFrequently used 最不经常使用) 如果一个数据在最近一段时间内很少被访问到,...所以,当空间满时,最小频率访问的数据最先被淘汰 Redis使用redisObject中的24bit lru字段来存储lfu字段, 这24bit被分为两部分: 1:高16位用来记录访问时间(单位为分钟)

1.5K10

Redis 缓存淘汰策略

, allkeys-lru, allkeys-lfu 进行全局数据范围淘汰 noeviction 不进行数据淘汰 当 Redis 缓存使用超过 maxmemory,不进行数据淘汰,同时 Redis 不在提供写服务...一般不使用这个配置策略。...allkeys-lru 依据 LRU 算法筛选所有数据进行淘汰 allkeys-lfu 依据 LFU 算法筛选所有数据进行淘汰 LRU 算法 LRU : least recently used 最近最少使用...配置项 maxmemory-samples 用于配置候选集 N 的数据个数: config set maxmemory-samples 100 Redis 缓存淘汰策略最佳实践 数据访问频率差异大(冷热数据区分明显...)优先使用 allkeys-lru 策略 数据访问频率差异不大时(无明显冷热数据区分)推荐使用 allkeys-random 策略 业务有置顶需求(置顶新闻、视频)使用 volatile-lru 策略,

85730

Redis 中的过期删除策略和内存淘汰机制

LFU 除了 LRU 算法,Redis 在 4.0 版本引入了 LFU 算法,就是最不频繁使用(Least Frequently Used,LFU)算法。...也就是说 LFU 淘汰的时候会选择两个维度,先比较频率,选择访问频率最小的元素;如果频率相同,则按时间维度淘汰掉最久远的那个元素。...LUF 的实现可参见LFU实现详解 这看下 Redis 中对 LFU 算法的实现 ◆ 1、键值对的访问频率记录和更新 上面分析 LRU 的时候,聊到了 redisObject,Redis 在源码中对于每个键值对中的值...LFU 算法是根据访问频率来淘汰数据的,而不只是访问次数。如果访问间隔时间越长,那么访问频率就越低。...因为 Redis使用 lru 变量中的访问次数来表示访问频率,所以在每次更新键值对的访问频率时,就会通过 LFUDecrAndReturn 函数对访问次数进行衰减。

85520

Redis 4.0的了解以及使用

刚才的错误提示也给出了答案,使用redis.replicate_commands(),在执行redis.replicate_commands()之后,Redis就不再是把整个Lua脚本同步给slave和持久化...脚本修改如下: 再执行就可以实现随机写入了: 基于LFU的热点key发现机制 LFURedis 4.0新增的一类内存逐出策略,提供了更精确的内存淘汰算法,其本质是记录了一段时间内key的访问频率,同时也带来了额外的福利就是热点...LFU简单来讲就是用0-255来表示key的访问频率,值越大说明访问频率越高,并且这里对频率的计数采用的是基于对数的概率增长,LFU为255可以代表100W次的访问。...使用OBJECT FREQ命令即可获取指定key的访问频率,不过需要首先把内存逐出策略设置为allkeys-lfu或者volatile-lfu使用scan命令遍历所有key,再通过OBJECT FREQ...为了方便用户使用Redis自带的客户端redis-cli也提供了热点key发现功能,执行redis-cli时加上--hotkeys选项即可,示例如下: MEMORY内存分析命令 分析内存可以优化Redis

66830

Redis 内存管理

AOF 方式 当 redis 使用 AOF 方式持久化时,每次遇到过期的 key redis 会追加一条 DEL 命令到 AOF 文件,也就是说只要我们顺序载入执行 AOF 命令文件就会删除过期的键...算法 allkeys-lfu 使用近似 LFU 逐出任何键 volatile-lfu 使用过期集在密钥中使用近似 LFU 进行驱逐 allkeys-random 在所有 key 里随机回收 volatile-random...配置方式:maxmemory-samples 5 LFU 算法 LFU(Least Frequently Used)根据数据的历史访问频率来淘汰数据。...核心思想:如果数据过去被访问多次,那么将来被访问的频率也更高。 Redis 实现的是近似的实现,每次对 key 进行访问时,用基于概率的对数计数器来记录访问次数,同时这个计数器会随着时间推移而减小。...Morris counter 算法依据:https://en.wikipedia.org/wiki/Approximate_counting_algorithm 启用 LFU 算法后,可以使用热点数据分析功能

60820

Redis内存淘汰和过期删除策略原理分析

实际使用场景是多样化的,如何选择合适的淘汰策略? 淘汰策略原理 所谓数据淘汰是指在Redis内存使用达到一定阈值的时候,执行某种策略释放内存空间,以便于接收新的数据。...LFU, only keys with an expire set -> 对配置了过期时间的key,淘汰最近使用频率最少的数据。...allkeys-lfu(REDIS_MAXMEMORY_ALLKEYS_LFU): Evict any key using approximated LFU -> 对所有key,淘汰最近使用频率最少的数据...不同系统存在差异性-具体见⇑ 淘汰策略的选择 存在冷热数据区别,即意味着访问频率存在较大差异,4.0及以上版本建议选择allkeys-lfu策略,但要设置lfu-decay-time 计数衰减值,一般默认...另外关于LRU和LFU算法,Redis内部在数据结构和实现机制上都做了一定程度的适应性改造 过期策略原理分析 众所周知,在Redis的实际使用过程中,为了让可贵的内存得到更高效的利用,我们提倡给每一个

33220

别再搞混了!

定期删除策略的缺点: 内存清理方面没有定时删除效果好,同时没有惰性删除使用的系统资源少。 难以确定删除操作执行的时长和频率。...volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值; volatile-lfuRedis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中...,最少使用的键值; 在所有数据范围内进行淘汰: allkeys-random:随机淘汰任意键值; allkeys-lru:淘汰整个键值中最久未使用的键值; allkeys-lfuRedis 4.0 后新增的内存淘汰策略...LFU 全称是 Least Frequently Used 翻译为最近最不常用的,LFU 算法是根据数据访问次数来淘汰数据的,它的核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”。...:24; ... } robj; Redis 对象头中的 lru 字段,在 LRU 算法下和 LFU 算法下使用方式并不相同。

39930

内存耗尽后,Redis 会发生什么?

这种策略相对来说是上面两种策略的折中方案,需要注意的是这个定期的频率要结合实际情况掌控好,使用这种方案有一个缺陷就是可能会出现已经过期的键也被返回。...在 Redis 当中,其选择的是策略 2 和策略 3 的综合使用。...- LFU算法 - LFU 全称为:Least Frequently Used。即:最近最少频率使用,这个主要针对的是使用频率。...当我们采用 LFU 回收策略时,lru 属性的高 16 位用来记录访问时间(last decrement time:ldt,单位为分钟),低 8 位用来记录访问频率(logistic counter:logc...- 访问频次递增 - LFU 计数器每个键只有 8 位,它能表示的最大值是 255,所以 Redis 使用的是一种基于概率的对数器来实现 counter 的递增。

82620

Redis 过期时间与内存管理

http://www.redis.cn/commands/expire.html http://www.redis.cn/topics/lru-cache.html 内存管理 当 Redis 作为缓存使用时...内存淘汰 在 redis.conf 或 使用 CONFIG 命令配置 Redis的配置项: maxmemory 100mb maxmemory-policy [策略] 淘汰策略: LRU - 最近很少没碰...对最近很少使用(所有或有过期时间的)的key优先淘汰 allkeys-lru 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。...LFU - 没碰多少次 对使用频率最少(所有或有过期时间的)的key优先淘汰 allkeys-lfu 尝试回收回收使用频率最少的键(LFU),使得新添加的数据有空间存放。...volatile-lfu 尝试回收使用频率最少的键(LFU),但仅限于在过期集合的键,使得新添加的数据有空间存放。

40310

Redis技术知识总结之三——Redis数据淘汰机制

Redis 早起版本使用的数据淘汰策略是 LRU (Least Recently Used,最近最少使用) 策略,LRU 策略是基于最近访问时间进行排序、淘汰的。...后来加入了 LFU (Least Frequency Used,最近最低频率) 策略。 Redis 主要使用的还是 LRU 策略。 noeviction: 可以继续读请求,不可以进行写请求。...volatile-lfu: 对设置了过期时间的键进行 LFU 策略的过期筛选; allkeys-lfu: 对全部的键进行 LFU 策略的过期筛选; 3.2 LRU 策略 Redis 的数据都是由 key-value...但 Redis 的 LRU 并不是这样执行的,Redis 使用了一种近似 LRU 算法。对于所有 Redis 对象,对象头中包含一个 24bit 的信息,作为对象热度的标志。...ldt 不是对象被访问的时候被更新,而是在 Redis 触发淘汰逻辑时进行更新; logc (logistic counter,对数计数): 后 8 位记录频率信息,且以对数形式储存,计算单位是分钟。

69210

内存耗尽后Redis会发生什么

这种策略相对来说是上面两种策略的折中方案,需要注意的是这个定期的频率要结合实际情况掌控好,使用这种方案有一个缺陷就是可能会出现已经过期的键也被返回。...在 Redis 当中,其选择的是策略 2 和策略 3 的综合使用。...LFU 算法 LFU 全称为:Least Frequently Used。即:最近最少频率使用,这个主要针对的是使用频率。这个属性也是记录在redisObject 中的 lru 属性内。...当我们采用 LFU 回收策略时,lru 属性的高 16 位用来记录访问时间(last decrement time:ldt,单位为分钟),低 8 位用来记录访问频率(logistic counter:logc...访问频次递增 LFU 计数器每个键只有 8 位,它能表示的最大值是 255,所以 Redis 使用的是一种基于概率的对数器来实现 counter 的递增。

80410

动手实现 LRU 算法,以及 Caffeine 和 Redis 中的缓存淘汰策略

Redis 中的缓存淘汰策略 Redis 支持如下 8 中淘汰策略,其中最后两种 LFU 的是 4.0 版本之后新加的。...volatile-ttl:从配置了过期时间的键中驱逐马上就要过期的键 volatile-lfu:从所有配置了过期时间的键中驱逐使用频率最少的键 allkeys-lfu:从所有键中驱逐使用频率最少的键...maxmemory 1024M maxmemory-policy volatile-lru Redis 中的 LRU Redis使用的是近似LRU算法,它跟常规的LRU算法还不太一样,它并不维护队列,而是随机采样法淘汰数据...Redis 中的 LFU LFU 算法是 4.0 之后才加入进来的。...而后8位表示当前key对象的访问频率,8位只能代表255,但是redis并没有采用线性上升的方式,而是通过一个复杂的公式,通过配置两个参数来调整数据的递增速度。

73530

Redis之过期key的淘汰及缓存淘汰策略解读

redis.conf中的maxmemory 当redis使用内存达到了一个maxmemory的参数配置阈值的时候,那么redis就会根据配置的内存淘汰策略,把访问频率不高的key从内存里面移除掉,maxmemory...通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用(处理"定时删除"的缺点) 定期删除过期key(处理"惰性删除"的缺点)  过期key的集合 redis 会将每个设置了过期时间的 key...所以定时删除最关键的就在于执行时长和频率的设置,可在redis的配置文件中配置 缓存淘汰策略  当redis的内存占用过多的时候,此时会进行内存淘汰,redis6以后有如下一些策略: noeviction...allkeys-random:对所有key随机淘汰 volatile-lfu:对设置了过期时间的key使用lfu算法进行删除 allkeys-lfu:对所有key使用lfu算法进行删除 总结:volatile-xxx...LFU:最近最不常用页面置换算法,淘汰一定时期内被访问次数最少的页,看一定时间段内页面被使用频率,淘汰一定时期内被访问次数最少的页

27830

美团二面:内存耗尽后Redis会发生什么?

这种策略相对来说是上面两种策略的折中方案,需要注意的是这个定期的频率要结合实际情况掌控好,使用这种方案有一个缺陷就是可能会出现已经过期的键也被返回。...在 Redis 当中,其选择的是策略 2 和策略 3 的综合使用。...LFU 算法 LFU 全称为:Least Frequently Used。即:最近最少频率使用,这个主要针对的是使用频率。这个属性也是记录在redisObject 中的 lru 属性内。...当我们采用 LFU 回收策略时,lru 属性的高 16 位用来记录访问时间(last decrement time:ldt,单位为分钟),低 8 位用来记录访问频率(logistic counter:logc...访问频次递增 LFU 计数器每个键只有 8 位,它能表示的最大值是 255,所以 Redis 使用的是一种基于概率的对数器来实现 counter 的递增。

70530

Redis有哪几种内存淘汰策略?

当内存达到上限时,会优先淘汰最近最少使用的数据。这个策略适用于访问模式较为平稳的场景。2.2 LFU(Least Frequently Used)LFU策略根据数据的访问频率来进行淘汰。...Redis内存淘汰策略与LinkedHashMap排序方式的联系Redis的LRU和LFU策略与LinkedHashMap的访问顺序有着紧密的联系。...当Redis使用LRU策略时,可以通过设置maxmemory-policy为allkeys-lru,让Redis按照数据的访问顺序进行淘汰。...类似地,使用maxmemory-policy为allkeys-lfu可以让Redis按照数据的访问频率进行淘汰。通过Java中的LinkedHashMap,我们可以实现类似Redis中的LRU策略。...结论本文介绍了Redis常用的内存淘汰策略,包括LRU、LFU和Random策略。同时,通过Java中的LinkedHashMap,我们解释了其排序方式和与Redis内存淘汰策略的联系。

23130

Redis的过期策略和内存淘汰策略最全总结与分析

文章前言 提到内存管理,我们就需要考虑Redis的内存过期策略和内存淘汰机制。该文章便从这两方面入手,分享一些在Redis内存方面相关的基础知识。 文章中使用的示例版本为Redis5.0版本。...volatile-lfu:当内存不足以容纳新写入数据时,在过期密集的键中,使用LFU算法进行删除key。 allkeys-lfu:当内存不足以容纳新写入数据时,使用LFU算法移除所有的key。...#volatile lfu->在具有expire集的密钥中使用近似的lfu进行逐出。 # allkeys-lfu -> Evict any key using approximated LFU....#allkeys lfu->使用近似的lfu逐出任何键。...# LRU means Least Recently Used #LRU表示最近最少使用 # LFU means Least Frequently Used #LFU表示使用频率最低 # Both LRU

1.7K6017
领券