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来删除。这样就有可能删除不完,需要惰性删除配合。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++如何做字符串分割(5种方法)

    C++如何做字符串分割(5种方法)1、用strtok函数进行字符串分割原型:char*strtok(char*str,constchar*delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include<string.h>#include<stdio.h&

    2022年4月29日
    642
  • trunk链路的配置命令_链路聚合配置

    trunk链路的配置命令_链路聚合配置实验环境使用之前用过的GNS3、WireShark和CRT进入GNS3页面,点击左侧图标菜单栏,拖入2台路由器到拓扑操作台,再点击PC图标,选择VPC,拖入拓扑操作台,配置两台路由器(更改名称、更改图标、添加二层业务单板、添加磁盘容量为128Mb)—————-配置环境————-1、接下来用网线把PC和路由器连接起来将PC1连到SW1的f1/0将PC2连…

    2025年6月30日
    2
  • arcgis附图制作_怎么制作图片的浮雕效果

    arcgis附图制作_怎么制作图片的浮雕效果ArcGIS制作地图时可以制作出很多很炫的效果,比如地图阴影、地图晕渲效果、浮雕效果、三维效果等等。本实验讲解在ArcGIS中制作浮雕效果地图,效果如下所示:1.加载矢量数据加载实验数据包data44.rar中的秦安县乡镇矢量数据:2.缓冲区分析点击【地理处理】下拉菜单,点击【缓冲区】。输入要素选择秦安县乡镇数据,选择输出要素路径,线性单位输入-0.4,单位为千米,侧类型选择两侧,融合类型选择ALL,点击确定。缓冲区效果:3.欧氏距离分析欧氏距离工具用于计算每个像元到最近.

    2025年9月15日
    6
  • linux服务器 抓包命令 tcpdump

    linux服务器 抓包命令 tcpdumptcpdump-iany-s0-w/home/tcp.pcap单独总结tcpdump抓包的常用命令主要语法过滤主机/IP:  tcpdump-ieth1host172.16.7.206 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据    过滤端口:  tcpdump-ieth1dstport1234 抓取所有经…

    2022年8月20日
    12
  • 添加员工功能400报错

    添加员工功能400报错真的心酸,找了两个多小时的bug,各方面数据数据都比对过了,还把源码复制过来直接用,就是找不到问题一直报错400,最后发现是配置文件的问题,在添加员工日期时没有采用一致格式,需要进行配置。…

    2022年5月13日
    41
  • 可变长子网掩码划分例题_最小生成树是什么

    可变长子网掩码划分例题_最小生成树是什么北极的某区域共有 n 座村庄,每座村庄的坐标用一对整数 (x,y) 表示。为了加强联系,决定在村庄之间建立通讯网络,使每两座村庄之间都可以直接或间接通讯。通讯工具可以是无线电收发机,也可以是卫星设备。无线电收发机有多种不同型号,不同型号的无线电收发机有一个不同的参数 d,两座村庄之间的距离如果不超过 d,就可以用该型号的无线电收发机直接通讯,d 值越大的型号价格越贵。现在要先选择某一种型号的无线电收发机,然后统一给所有村庄配备,数量不限,但型号都是 相同的。配备卫星设备的两座村庄无论相距多远都可以直

    2022年8月9日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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