redis过期策略六种(java的内存回收机制)

Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位作为秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制。大家都知道,Redis缓存使用的是内存资源,虽然缓存服务器会配置比较高的内存资源,但如果对于Redis中的缓存数据我们不管不顾,内存资源总有耗尽的时候,这时缓存服务器就无法再对外提供服务了。我们要用有限的服务器资源支撑…

大家好,又见面了,我是你们的朋友全栈君。

Redis缓存作为提高系统性能最好的方式相信大家对其一定不陌生,各位作为秃头老码农不仅需要掌握Redis的基础用法还得了解Redis的相关原理,比如Redis过期策略和内存淘汰机制。

大家都知道,Redis缓存使用的是内存资源,虽然缓存服务器会配置比较高的内存资源,但如果对于Redis中的缓存数据我们不管不顾,内存资源总有耗尽的时候,这时缓存服务器就无法再对外提供服务了。我们要用有限的服务器资源支撑更多的业务服务,就必须要让那些访问频率不高的缓存删除掉,为新的缓存腾出内存空间。

Redis主要通过两种方式相互配合来实现键值的清理,即:过期策略和内存淘汰机制。

内存淘汰策略

当 Redis 节点分配的内存使用到达最大值以后,为了继续提供服务,Redis 会启动内存淘汰策略,在Redis4.0之前主要是以下六种淘汰策略:

noeviction:不淘汰任何数据,当内存不足时,执行缓存新增操作会报错,这种策略下可以保证数据不丢失,它也是 Redis 默认的内存淘汰策略。

allkeys-lru:淘汰整个键值中最久未使用的键值,这也就是我们常说的LRU算法。

allkeys-random:随机淘汰任意键值。

volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值。

volatile-random:随机淘汰设置了过期时间的任意键值。

volatile-ttl:优先淘汰设置了过期时间中更早过期的键值。

通过上面的内存淘汰策略可以看出,以 allkeys- 开头的表示从所有key中进行数据淘汰,而以 volatile- 开头的会从设置了过期时间的key中进行数据淘汰。

而在Redis4.0版本中又新增了2种淘汰策略:

allkeys-lfu,淘汰整个键值中最少使用的键值,这也就是我们常说的LRU算法。

volatile-lfu,淘汰所有设置了过期时间的键值中最少使用的键值。

LRU(Least Recently Used,最近最少使用),根据最近被使用的时间,离当前最远的数据优先被淘汰;

LFU(Least Frequently Used,最不经常使用),在一段时间内,缓存数据被使用次数最少的会被淘汰。

大家可以在 redis.conf 配置文件中修改配置项 maxmemory-policy ,将其修改成需要设置的类型即可。

缓存过期策略

内存淘汰策略是当内存不够用时才会触发的一种机制,是缓存服务层面的操作,而过期策略定义的是具体缓存数据何时失效。我们在使用Redis的时候经常会给redis的key设置一个过期时间如:EXPIRE key 30,过期策略就是指当 Redis 中缓存的 key 过期了,Redis 如何处理。

对于已经过期的数据,Redis将使用两种策略搭配使用来删除这些过期的键值,分别是惰性删除,定期删除。

惰性删除

惰性删除 是指 Redis 服务器不主动删除过期的键值,而是在客户端要获取某个键值时,Redis会先去检测一下这个key是否已经过期,如果没有过期则返回给客户端,如果已经过期了,那么Redis会删除这个key并返回null给客户端。

惰性删除可以解决一些过期了,但没被定期删除随机抽取到的key。但有些过期的key既没有被随机抽取,也没有被客户端访问,就会一直保留在数据库,占用内存,长期下去可能会导致内存耗尽。所以Redis提供了内存淘汰机制来解决这个问题。

惰性删除的优点是不会浪费太多的系统资源,只是在每次访问时才检查键值是否过期。缺点是像上面说的删除过期键不及时,造成了一定的空间浪费。

定期删除

定期删除 是指 Redis 服务器每隔一段时间会检查一下缓存数据库,看看是否有过期键可以被清除。默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”即可,默认的值为“hz 10”。

因为key太多,如果全盘扫描所有的key会非常耗性能,所以定期删除是随机抽取一些key来删除。这样就有可能删除不完,需要惰性删除配合。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126305.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • android ListView 嵌套 ListView

    android ListView 嵌套 ListView实现的效果是这个样子的看上去效果还是不错,不过现在有个刷新问题一直没能解决,刷新的时候里面的adapter进行刷新的时候总是会让里面的listview消失掉,应该是父listview先刷新完后,子listview还未刷新完成,导致测量的高度不对,就会消失,像当前组已关闭这种,现在这个问题还没有想到办法解决的,试过比较多的方法,添加接口让子listview刷新完成后再去更新父…

  • nvidia卸载程序失败_英伟达显卡驱动安装失败怎么办?[通俗易懂]

    nvidia卸载程序失败_英伟达显卡驱动安装失败怎么办?[通俗易懂]一般用户重新安装系统或者更新显卡驱动后,安装光盘中的英伟达显卡驱动,安装后却提示“NVIDIA安装程序失败”,遇到这样的问题,很多用户会选择重启后重新安装一次,不过都不能解决安装电脑显卡驱动安装失败的故障,下面华海电脑网小编给大家几个解决方法:安装显卡驱动安装失败注意:一定要你显卡型号对应驱动,否则不可能成功的,推荐使用“驱动精灵”或者“驱动人生”自动搜索对应显卡驱动下载并且安装。英伟达显卡驱动安…

  • 在线名片设计_diy名片代码在线生成

    在线名片设计_diy名片代码在线生成小小名片,看似简单,它要经过以下八道工序才能到你手中。其间你还得参与名片制作的前期工作,你要对名片印刷方式、印刷难易、印刷用纸选择;你还得提供名片的具体内容,设计大致思路;大多数时间你还得要校稿,特别是要求较高的复杂的名片,商家都有如此请求。名片后期加工也较复杂,需要专业设备和熟练的操作人员。以往,我们得亲自前往名片印刷店印刷,一盒名片也许要去好多趟,好在有了互联网,现在简单了。你大可一边喝着咖啡…

    2022年10月25日
  • 爬虫系列,(3),达盖尔图片抓取

    爬虫系列,(3),达盖尔图片抓取importreimportrequestsfrombs4importBeautifulSoup#第一步得到代理defproxy():withopen(r’ip_proxies\有效ip.txt’,’r’,encoding=’utf-8′)asf:r=f.readlines()foripinr:…

  • vue 正则表达式验证_vue表单自定义验证

    vue 正则表达式验证_vue表单自定义验证首先需要自己写正则表达式,正则学得不好就不乱指点了=>方法1如果你是单独建的js文件先引入正则表达式文件才进行下一步或者直接在组件内写正则2data({constregExpID=(rule,value,callback)=>{//regExpID自定义类名if(value===”){//value验证的值不要更改会自动匹配你所需要验证的值ca…

    2022年10月22日
  • Linux安装pycharm(照着做就行)[通俗易懂]

    Linux安装pycharm(照着做就行)[通俗易懂]pycharm是Python语言的图形化开发工具。因为如果在Linux环境下的Pythonshell中直接进行编程,其无法保存与修改,在大型项目当中这是很不方便的而pycharm的安装,刚好就解决了这些问题。进入pycharm官网https://www.jetbrains.com/pycharm/download/#section=windows//复制到浏览器的搜索框打开这个网页是这样的在这里选择Linux的社区版,这是免费的,即community你会下载到pychar

    2022年10月19日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号