首页 > 互联资讯 > 建站教程  > 

redis,程序的缓存替换机制是如何搭建的?

「Redis的过期策略和内存淘汰策略」

过期策略通常有以下三种:

定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量; 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存; 定期过期:每隔一定的时间,会随机扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果;

expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。

Redis中同时使用了惰性过期和定期过期两种过期策略

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据

内存淘汰策略有如下几种:

noeviction:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就返回error,然后啥也不干allkeys-lru:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,淘汰一些最近未使用的keyvolatile-lru:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置了过期时间的key,淘汰一些最近未使用的keyallkeys-random:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,随机淘汰一些keyvolatile-random:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置了过期时间的key,随机淘汰一些keyvolatile-ttl:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置了过期时间的key,淘汰一些即将过期的keyvolatile-lfu:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会淘汰一些设置了过期时间的,并且最少使用的keyallkeys-lfu:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,淘汰一些最少使用的key

我们在选择使用淘汰策略的时候可以根据访问key的方式来选择不同的淘汰策略

当我们redis中的key基本上都有用到,也就是说每个key都有周期性访问到,那就可以选择使用random策略当我们redis中的key部分是我们经常访问的,部分是非经常访问的就可以考虑使用LRU和LFU策略当我们想根据时间长久淘汰超时数据时,就选用ttl我们根据我们的需要是否有要长久保存的key来选择volatile或者是all,如果有需要长久保存的key,则使用volatile,否则可以使用all全表扫描

Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据,过期策略用于处理过期的缓存数据

欢迎大家关注我的微信公众号:渝言家,我会不定期跟大家聊聊代码、架构、技术管理、行业和产品等话题。同时我多年来收集了不少编程开发、技术架构、技术管理相关的资料,大家关注后可以发送“技术资料”获取,希望能够帮助到大家,点击下方可以直达:

这套课程资料目录如下:

redis,程序的缓存替换机制是如何搭建的?由讯客互联建站教程栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“redis,程序的缓存替换机制是如何搭建的?