Redis入门学习笔记(七)redis过期策略和内存淘汰

一.前言

随着Redis越来越被广泛运用,在实际使用过程中,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降,因为内存满了,只能使用磁盘。对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。此时如何删除掉无用数据释放空间,为存储新数据腾出空间就变得尤为重要了。

如何解决?

  • 扩大内存
  • 建立缓存过期策略
  • 建立内存淘汰机制
  • 集群

扩大内存和集群就不说了,这都是通过物理方式来改善问题的。主要来看看过期策略和内存淘汰

二.过期策略

我们都知道,Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,例如我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效。
如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,redis是怎么对这批key进行删除的?

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

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

三.内存淘汰

Redis在生产环境中,采用配置参数maxmemory 的方式来限制内存大小。当实际存储内存超出maxmemory 参数值时,开发者们可以通过这几种方法——Redis内存淘汰策略,来决定如何腾出新空间继续支持读写工作。那么是如何执行内存淘汰的呢?

  • 客户端会发起需要更多内存的申请,例如需要更多的内存空间来储存key
  • Redis需要先检查内存使用情况
  • 如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key。
  • 成功执行淘汰任务。

Redis入门学习笔记(七)redis过期策略和内存淘汰_第1张图片
Redis提供了6种内存淘汰策略

volatile-lru
设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。这种策略是用的最多的。

allkeys-lru
当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。这意味着没有设置过期时间的 key 也会被淘汰。这种策略没人敢用。

volatile-random
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。

allkeys-random
当内存不足以容纳新写入数据时,淘汰的策略是随机的 key。

volatile-ttl
当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。

noeviction
不会继续服务写请求 (除了DEL 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。

四.小结

Redis的内存淘汰策略的选取并不会影响过期的key的处理。只有在内存不足以容纳新数据的写入时,才会需要申请额外空间的数据;过期策略用于处理过期的缓存数据。

参考资料
https://www.jianshu.com/p/8aa619933ebb
https://msd.misuland.com/pd/3223833238703183556

你可能感兴趣的:(redis)