redis内存淘汰机制

先天高手 先天高手     2022-08-03     219

关键词:

Redis内存淘汰指的是用户存储的一些键被可以被Redis主动地从实例中删除,从而产生读miss的情况,那么Redis为什么要有这种功能?这就是我们需要探究的设计初衷。Redis最常见的两种应用场景为缓存和持久存储,首先要明确的一个问题是内存淘汰策略更适合于那种场景?是持久存储还是缓存?

内存的淘汰机制的初衷是为了更好地使用内存,用一定的缓存miss来换取内存的使用效率。

 

作为Redis用户,我如何使用Redis提供的这个特性呢?看看下面配置

 

# maxmemory <bytes>

 

我们可以通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能,至于这个值有什么意义,我们可以通过了解内存淘汰的过程来理解它的意义:

 

1.      客户端发起了需要申请更多内存的命令(如set)。

 

2.      Redis检查内存使用情况,如果已使用的内存大于maxmemory则开始根据用户配置的不同淘汰策略来淘汰内存(key),从而换取一定的内存。

 

3.      如果上面都没问题,则这个命令执行成功。

 

maxmemory为0的时候表示我们对Redis的内存使用没有限制。

 

Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:

 

·         noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。

 

·         allkeys-lru:在主键空间中,优先移除最近未使用的key。

 

·         volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。

 

·         allkeys-random:在主键空间中,随机移除某个key。

 

·         volatile-random:在设置了过期时间的键空间中,随机移除某个key。

 

·         volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

 

这里补充一下主键空间和设置了过期时间的键空间,举个例子,假设我们有一批键存储在Redis中,则有那么一个哈希表用于存储这批键及其值,如果这批键中有一部分设置了过期时间,那么这批键还会被存储到另外一个哈希表中,这个哈希表中的值对应的是键被设置的过期时间。设置了过期时间的键空间为主键空间的子集。

 

我们了解了Redis大概提供了这么几种淘汰策略,那么如何选择呢?淘汰策略的选择可以通过下面的配置指定:

 

# maxmemory-policy noeviction

 

但是这个值填什么呢?为解决这个问题,我们需要了解我们的应用请求对于Redis中存储的数据集的访问方式以及我们的诉求是什么。同时Redis也支持Runtime修改淘汰策略,这使得我们不需要重启Redis实例而实时的调整内存淘汰策略。

 

下面看看几种策略的适用场景:

 

·         allkeys-lru:如果我们的应用对缓存的访问符合幂律分布(也就是存在相对热点数据),或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择allkeys-lru策略。

 

·         allkeys-random:如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

 

·         volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。

 

另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存。

redis过期策略和内存淘汰机制(代码片段)

...性删除为什么要采用定期删除+惰性删除2种策略呢?redis内存淘汰机制常见的删除策略1.定时删除:在设置键的过期时间的同时,创建一个timer,让定时器在键的过期时间到达时,立即执行对键的删除操作。(主动删除)对内存友... 查看详情

redis的过期策略以及内存淘汰机制(代码片段)

...删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.定期删除+惰性删除是如何工作的... 查看详情

聊聊redis内存淘汰策略(代码片段)

...edis五种数据结构底层实现》这一期咱们一起来看看Redis的内存淘汰策略~为什么要有内存淘汰机制  大家都知道Redis中的键会设置过期时间,当到达过期时间时会通过一定策略清除对应key,但是redis内存是由上限的,当达到内存上... 查看详情

redis的过期策略都有哪些?内存淘汰机制都有哪些?

redis过期策略redis过期策略是:定期删除+惰性删除。所谓定期删除,指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。假设redis里放了10w个key,都设置了过期时间,你每隔几百毫... 查看详情

redis_06_redis内存回收机制(代码片段)

...f09;:定时删除惰性删除定期删除三、淘汰策略3.1最大内存设置3.2淘汰策略四、尾声一、前言问题:redis为什么需要内存回收机制?回答: 查看详情

缓存机制

...象。对缓存机制的理解(java)缓存淘汰算法--LRU算法Redis内存回收:LRU算法两种常见的缓存淘汰算法LFU&LRULRU原理和Redis实现——一个今日头条的面试题探究redis 查看详情

redis内存淘汰策略

参考技术A当Redis内存超过最大允许的内存之后,Redis就会触发内存淘汰策略(阈值可配置)以双向链表存放被访问的key,每次被访问到的就会放入表头,表尾就是最少被访问的。LRU算法需要一个双向链表来记录数据的最近被访问顺... 查看详情

你说,redis如何实现键值自动清理?(代码片段)

...础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制。大家都知道,Redis缓存使用的是内存资源,虽然缓存服务器会配置比较高的内存资源,但如果对于Redis中的缓存数据我们不管不顾,内存资源... 查看详情

redis过期策略/内存淘汰机制/对过期key的处理

...后大佬文章目录Redis过期策略惰性删除流程定期删除流程内存淘汰机制RDB对过期key的处理AOF对过期key的处理本文内容:Redis过期策略Redis采用的过期策略惰性删除+定期删除惰性删除流程在进行get或setnx等操作时,先检查k... 查看详情

面试官:redis过期删除策略和内存淘汰策略有什么区别?(代码片段)

...#xff1a;https://xiaolincoding.com大家好,我是小林。Redis的「内存淘汰策略」和「过期删除策略」,很多小伙伴容易混淆,这两个机制虽然都是做删除的操作,但是触发的条件和使用的策略都是不同的。今天就跟大家理一... 查看详情

redis缓存过期机制

...删除所以,虽然key过期了,但是没被清理的话,还是会占内存的。二、内存淘汰管理机制MemoryManagement  当内存占满之后,redis提供缓存淘汰机制。  redis.conf:maxmemory<bytes>*noeviction:旧缓存永不过期,新缓存设置... 查看详情

redis缓存何以一枝独秀?——聊聊redis的数据过期数据淘汰以及数据持久化的实现机制(代码片段)

...设定,支持多种不同的数据淘汰策略等等。此外为了解决内存型组件数据可靠性问题,还提供了一系列的数据持久化方案。本篇文章中,我们就一起聊一聊这方面内容。数据过期能力为了节约内存的使用量,保证有限的内存空间... 查看详情

redis淘汰策略

Redis淘汰策略Redis的内存回收主要围绕Redis过期策略、Redis淘汰策略策略名称策略说明Redis过期策略删除过期时间的key值Redis淘汰策略内存使用到达maxmemory上限时触发内存淘汰数据Redis过期策略通常有以下三种:定时过期为每个... 查看详情

redis的内存淘汰策略(代码片段)

简单介绍了Redis的内存淘汰策略。Redis的maxmemory参数用于指定Redis能使用的最大内存,既可以在redis.conf配置文件中设置(单位Byte),也可以在运行过程中通过CONFIGSET命令动态修改。将maxmemory设置为0,或者没有... 查看详情

redis提供6种数据淘汰策略(代码片段)

淘汰策略的原因在redis中,允许用户设置最大使用内存大小server.maxmemory,在内存限定的情况下是很有用的。譬如,在一台8G机子上部署了4个redis服务点,每一个服务点分配1.5G的内存大小,减少内存紧张的情况,由此获取更为稳健... 查看详情

redis个人笔记

要干嘛?redis存在内存中,内存是有大小的。满了怎么办?过期策略:redis里面有过期的数据扔掉淘汰策略:redis淘汰机制过期策略:设置过期时间,不见了怎么办。ttlkey可以查询它的有效时间redis用了被动过期(惰性过期)和定... 查看详情

redis内存回收

...时器主动淘汰2.惰性过期被动淘汰3getCommandexpireIfNeed()设置内存上线setmemory上线activeExpireCycle()redis使用了惰性过期+定期过期达到了最大内存上线后根据内存淘汰规则#volatile-lru->removethekeywithanexpiresetusinganLRUalgor 查看详情

redis内存满了怎么办,redis导致系统内存爆满(代码片段)

...改配置文件Redis长期使用,不设置过期时间,导致内存爆满,可以修改Redis的配置文件redis.conf文件中,配置参数maxmemory的大小。一般的项目maxmemory设置为3~5G即可,也可以根据自己服务器内存大小进行配置。maxme... 查看详情