当前位置:首页 > 数码 > Redis内存治理与淘汰战略 (redis内存淘汰策略配置)

Redis内存治理与淘汰战略 (redis内存淘汰策略配置)

admin3个月前 (04-16)数码23

欢迎到来写代码那些事!在的环球里,内存治理是一门关键的艺术。本教程将带你深化了解Redis内存淘汰战略,教你如何在数据存储和性能之间找到最佳平衡点。


目录:


1.内存淘汰的意义与应战

在这一节中,咱们将讨论为什么Redis须要内存淘汰战略以及面临的应战。咱们会引入内存淘汰的概念,解释为什么在Redis中须要找到适宜的数据淘汰形式。

内存淘汰的意义

在现代运行中,数据量不时增长,须要高速的数据存储和访问。但是,内存资源有限,如何优雅地治理数据成为一个应战。这时,内存淘汰战略的产生变得至关关键。

为什么Redis须要内存淘汰战略

Redis是一种基于内存的数据库,将数据存储在内存中以成功高速读写。但是,随着数据不时写入,内存会变得弛缓。为了坚持高性能,Redis须要一种机制来选择哪些数据可以留在内存中,哪些须要被淘汰。

内存淘汰带来的应战与疑问

在制订内存淘汰战略时,须要掂量多个起因,如数据的访问频率、数据的关键性等。不失当的战略或许造成罕用数据被移除,影响性能,或许关键数据不可被保管。因此,Redis须要一套智能的内存淘汰机制来处置这些应战。


2.经常出现的内存淘汰战略与特点

在这一节,咱们将引见几种经常出现的Redis内存淘汰战略,包含LRU、LFU、随机等。咱们会剖析每种战略的特点,以及它们在不同场景下的实用性。

经常出现的内存淘汰战略

在处置内存资源有限的状况下,Redis驳回了多种内存淘汰战略来选择哪些数据会被移除。其中,最经常出现的战略包含LRU(LeastRecentlyUsed,最近起码经常使用)、LFU(LeastFrequentlyUsed,最不经常经常使用)以及随机淘汰。

LRU、LFU、随机等战略的特点与区别

这些战略各有特点,实用于不同的业务场景。

如何依据业务场景选用适宜的淘汰战略

代码示例:

#设置LRU战略CONFIGSETmaxmemory-policy"allkeys-lru"#设置LFU战略CONFIGSETmaxmemory-policy"allkeys-lfu"#设置随机淘汰战略CONFIGSETmaxmemory-policy"allkeys-random"

依据业务需求和数据特点,选用适宜的内存淘汰战略,能够更好地平衡数据存储和性能需求。

针对上述的随机LRU算法,Redis官网给出了一张测试准确性的数据图:


3.LRU算法:最近起码经常使用战略

这一节将深化讨论LRU(LeastRecentlyUsed)算法,它是一种基于期间的内存淘汰战略。咱们会经过代码示例展示LRU算法的成功,以及如何在Redis中性能和运行LRU战略。

LRU算法的原理与特点

LRU(LeastRecentlyUsed,最近起码经常使用)算法是一种经常出现的内存淘汰战略,它依据数据的访问期间来选择哪些数据会被淘汰。LRU算法的外围现实是:最久未被访问的数据,被以为是最不罕用的数据,应该被优先淘汰。

如何在Redis中性能和经常使用LRU战略

在Redis中,可以经过修正maxmemory-policy性能项来启用LRU战略。自动状况下,Redis经常使用的就是LRU战略。你可以依据须要修正该性能项来经常使用其他内存淘汰战略。

Redis#设置LRU战略CONFIGSETmaxmemory-policy"allkeys-lru"

LRU算法的代码成功与注释示例

以下是一个便捷的LRU算法的/target=_blankclass=infotextkey>Python成功示例,协助你更好地理解其上班原理。

fromcollectionsimportOrderedDictclassLRUCache:def__init__(self,capacity):self.capacity=capacityself.cache=OrderedDict()defget(self,key):ifkeynotinself.cache:return-1else:#更新访问期间value=self.cache.pop(key)self.cache[key]=valuereturnvaluedefput(self,key,value):ifkeyinself.cache:#更新访问期间self.cache.pop(key)eliflen(self.cache)>=self.capacity:#淘汰最久未经常使用的数据self.cache.popitem(last=False)self.cache[key]=value#创立一个容量为3的LRU缓存cache=LRUCache(3)#减多数据cache.put(1,"A")cache.put(2,"B")cache.put(3,"C")#查问数据print(cache.get(2))#输入"B"#减少新数据,触发淘汰cache.put(4,"D")#查问数据print(cache.get(1))#输入-1,数据已被淘汰

在上述代码中,咱们经常使用了OrderedDict来成功LRU算法,保障了数据的访问期间顺序。经过注释,你可以明晰地看到LRU算法的成功细节。

4.LFU算法:最不经常经常使用战略

在本节中,咱们将深化钻研LFU(LeastFrequentlyUsed)算法,它是一种基于经常使用频率的内存淘汰战略。咱们将经过案例展示LFU算法的运行,以及如何在Redis中运行LFU战略。

LFU算法的原理与特点

LFU(LeastFrequentlyUsed,最不经常经常使用)算法是一种基于数据访问频率的内存淘汰战略。它以为,被访问频率最低的数据应该被优先淘汰。LFU算法的外围现实是:经常使用频率越低的数据,被以为是最不罕用的数据,应该被优先淘汰。

如何在Redis中性能和经常使用LFU战略

在Redis中,你可以经过修正maxmemory-policy性能项来启用LFU战略。这将使Redis依据数据的经常使用频率来选择淘汰顺序。

#设置LFU战略CONFIGSETmaxmemory-policy"allkeys-lfu"

LFU算法的案例与代码成功示例

以下是一个经常使用LFU算法的Python代码示例,协助你更好地理解其上班原理。

importheapqfromcollectionsimportdefaultdictclassLFUCache:def__init__(self,capacity):self.capacity=capacityself.cache={}#存储数据的字典self.freq_counter=defaultdict(int)#存储数据访问频率的字典self.heap=[]#存储(频率,键)的最小堆defget(self,key):ifkeyinself.cache:self.freq_counter[key]+=1#更新堆中的频率信息heapq.heush(self.heap,(self.freq_counter[key],key))returnself.cache[key]else:return-1defput(self,key,value):ifself.capacity<=0:returnifkeyinself.cache:#更新已存在的数据self.cache[key]=valueself.freq_counter[key]+=1heapq.heappush(self.heap,(self.freq_counter[key],key))else:iflen(self.cache)>=self.capacity:#淘汰频率最低的数据whileself.heap:freq,k=heapq.heappop(self.heap)ifself.freq_counter[k]==freq:delself.cache[k]delself.freq_counter[k]break#减少新数据self.cache[key]=valueself.freq_counter[key]=1heapq.heappush(self.heap,(1,key))#创立一个容量为3的LFU缓存cache=LFUCache(3)#减多数据cache.put(1,"A")cache.put(2,"B")cache.put(3,"C")#查问数据print(cache.get(2))#输入"B"#减少新数据,触发淘汰cache.put(4,"D")#查问数据print(cache.get(1))#输入-1,数据已被淘汰

在上述代码中,咱们经常使用堆和字典来成功LFU算法,保障了依照数据访问频率启动淘汰。经过这个例子,你可以更好地理解LFU算法的成功形式。


5.经常出现战略运行场景与最佳通常

在最后一节中,咱们将讨论如何依据业务场景选用战略。咱们会讨论如何应用Redis提供的API,编写自己的淘汰战略函数,并分享一些最佳通常。

淘汰战略

有以下可用的战略:

依据运行程序的访问形式选用正确的驱逐战略很关键,但是您可以在运转运行程序时在运转时从新性能该战略,并经常使用REDIS信息输入来监督您的设置,并监督经常使用REDIS信息输入的缓存数量和命中次数

通常,依据阅历规律:

当您希冀在恳求的受欢迎水平中发行幂律时,请经常使用 allkeys-lru 战略。也就是说,您宿愿将一局部元素访问的频率远远超越其他局部。假设您不确定,这是一个很好的选用。

假设您具备延续扫描一切密钥的环状访问,或许当您希冀发行版平均时,请经常使用 Allkeys-mandom

假设您想能够经过在创立缓存对象时经常使用不同的TTL值,请经常使用 volatile-ttl 向Redis提供无关到期的好候选者的揭示。

当您要经常使用一个实例启动缓存和具备一组耐久键时, volatile-lru volatile-random 战略关键是有用的。但是,通常是一个更好的主意来处置两个REDIS实例以处置此类疑问。

还值得留意的是,将有效期的值设置为关键老本内存,因此经常使用诸如 allkeys-lru 之类的战略是更有效的,由于不须要在内存压力下驱逐键的到期性能

如何自定义淘汰战略函数

在某些场景下,通用的内存淘汰战略或许不可满足业务需求。幸运的是,Redis准许你自定义淘汰战略函数,从而更好地顺应特定需求。

应用Redis提供的API成功自定义淘汰

经过应用Redis提供的SortedSet(有序汇合)数据结构,你可以成功自己的淘汰战略。以评分机制为例,你可以在每个数据项上设置一个分数,依据分数来选择淘汰顺序。

#自定义淘汰战略:依据评分启动淘汰ZADDmycache10"data1"ZADDmycache20"data2"ZADDmycache5"data3"#淘汰分数较低的数据ZREMRANGEBYRANKmycache00

实践名目中的最佳通常与阅历分享

经过自定义淘汰战略,你可以更好地满足复杂业务需求,提升数据治理,并在实践名目中取得更好的性能和成果。


总结:

经过本教程,你曾经片面了解了Redis内存淘汰战略的关键性和运行。从LRU到LFU,从经常出现战略到自定义战略,你把握了在数据存储和性能之间寻觅平衡的关键技巧。

Redis内存淘汰战略在数据治理和性能提升中具备关键意义,协助你充沛应用内存资源,提高运行的性能和牢靠性。愿你在实践名目中能够灵敏运行这些常识,为你的Redis运行注入新的生机和效率。


redis内存满了,会宕机吗?

接下来一起探讨下,Redis的内存淘汰策略。

redis的配置文件不一定使用的是安装目录下面的文件,启动redis服务的时候是可以传一个参数指定redis的配置文件的

既然可以设置Redis最大占用内存大小,那么配置的内存就有用完的时候。那在内存用完的时候,还继续往Redis里面添加数据不就没内存可用了吗?

实际上Redis定义了几种策略用来处理这种情况: noeviction(默认策略) :对于写请求不再提供服务,直接返回错误(DEL请求和部分特殊请求除外) allkeys-lru :从所有key中使用LRU算法进行淘汰 volatile-lru :从设置了过期时间的key中使用LRU算法进行淘汰 allkeys-random :从所有key中随机淘汰数据 volatile-random :从设置了过期时间的key中随机淘汰 volatile-ttl :在设置了过期时间的key中,根据key的过期时间进行淘汰,越早过期的越优先被淘汰

上面说到了Redis可使用最大内存使用完了,是可以使用LRU算法进行内存淘汰的,那么什么是LRU算法呢?

Redis过期删除策略和内存淘汰策略

Redis可以用使用 expire 指令设置过期时间,在Redis内部,每当我们设置一个键的过期时间时,Redis就会将该键带上过期时间存放到一个过期字典中。当我们查询一个键时,Redis便首先检查该键是否存在过期字典中,如果存在,那就获取其过期时间。然后将过期时间和当前系统时间进行比对,比系统时间大,那就没有过期;反之判定该键过期。

那对于过期数据,一般有三种方式进行处理:

Redis的过期删除策略: 惰性删除 和 定期删除 两种策略配合使用。

spring-boot-starter-data-redis 包中提供了监听过期的类,对于key过期,需要得到通知,做业务处理的,可以做此监听。

springboot整合Redis参考, SpringBoot整合Redis -() 在整合Redis的基础上,在新加监听配置

监听配置类

监听类

将Redis用作缓存时,如果内存空间用满,就会自动驱逐老的数据。

Redis中有6种淘汰策略:

文件中配置策略,有2个地方:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Redis

“Redis内存治理与淘汰战略 (redis内存淘汰策略配置)” 的相关文章

Redis数据删除后-内存占用为何居高不下 (redis数据类型)

Redis数据删除后-内存占用为何居高不下 (redis数据类型)

作为面试经验丰富的开发人员,肯定会遇到过这样的问题:做了数据删除操作,为什么使用 top 命令时,仍然显示 Redis 占用了大量内存? 答案 这是因为当数据删除后,Re...

一站式-满足您的所有-解决方案-需求-Redis-Redis (一站式满足您的资金需求让您用款无忧)

一站式-满足您的所有-解决方案-需求-Redis-Redis (一站式满足您的资金需求让您用款无忧)

Introduction Redis is an efficient in-memory database designed to store data invarious formats, s...

安装并配置-Kubernetes-集群 (安装并配置mysql的实验总结)

安装并配置-Kubernetes-集群 (安装并配置mysql的实验总结)

日常开发中,基于自然支持散布式锁,大家在线上散布式名目中都经常使用过Redis锁。本文重要针对日常开发中加锁环节中某些意外场景启动解说与剖析。本文解说示例代码都在名目目录下 RedisLo...

排查与处置指南-Redis大Key危害 (排查与处置指的是什么)

排查与处置指南-Redis大Key危害 (排查与处置指的是什么)

这是一位同窗往年秋招参与得物一面遇到的疑问,完整面经如下: 这个疑问在面试中还是比拟容易遇到的,尤其是在调查性能优化相关常识点的时刻。 通常状况下,问了bigkey(大Key)还会继续...

Redis-使用哈希槽而非一致性哈希的原因 (redis淘汰策略有哪些)

Redis-使用哈希槽而非一致性哈希的原因 (redis淘汰策略有哪些)

引言 在分布式系统中,数据分片和负载均衡是至关重要的。哈希槽和一致性哈希两种方法都可以实现这些目标,但它们各有优缺点。本文将讨论为什么在某些情况下使用哈希槽而不是一致性哈希。 哈希槽 哈希...

Redis-全面了解数据耐久性和复原机制-深度解析-耐久化 (redis淘汰策略有哪些)

Redis-全面了解数据耐久性和复原机制-深度解析-耐久化 (redis淘汰策略有哪些)

我们都知道在关于的开发或许面试的环节中,很容易就会遇到这个关于Redis耐久化的疑问,而我们在面试的时刻,经常会有小同伴只能说出这个Redis耐久化的两种形式,后续或许还会对比一些区别,然而关于怎...

解锁你的海量数据摸索之旅-Redis-全文搜查-的弱小新配置 (解锁海量任务)

解锁你的海量数据摸索之旅-Redis-全文搜查-的弱小新配置 (解锁海量任务)

在2021年我就了解到earch这个名目,并曾经把它用于我的开源名目newbee-mall-pro中。 就我的经常使用体验来说,便捷场景下,用来平替Elasticsearch的经常使用场景曾...