Redis内存回收,过期策略和淘汰机制

本文包含三部分,分别介绍Redis内存回收,过期策略和淘汰机制。

一、Redis内存回收机制

Redis的内存回收主要两个部分:

(1)Redis过期策略

删除超过过期时间的Redis数据。

(2)Redis淘汰策略

当内存使用到达最大内存(maxmemory)上限时触发内存淘汰策略。

注意:Redis的过期策略和内存淘汰策略不是一回事,实际开发中不能混淆。

二、Redis过期策略

过期策略包含定时过期,惰性过期和定时过期三种:

(1)定时过期

设置过期时间的key会创建一个定时器,到过期时间就会立即清除。

优点:可以立即清除过期的数据,对内存友好;

缺点:占用大量的CPU资源处理过期的数据,影响Redis缓存的响应时间和吞吐量。

(2)惰性过期

只有当访问一个key时,才会判断该key是否已过期,过期则清除。

优点:可以最大节省CPU资源,但对内存非常不友好。

缺点:可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。【该问题在缓存设计不合理时会发生,应避免掉】

(3)定期过期

每隔一定的时间,会扫描一定数量的expires字典中的key,并清除其中已过期的key。是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

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

三、Redis淘汰策略

(1)简介

Redis的内存淘汰策略,是指当内存使用达到最大内存(maxmemory)时,需要使用缓存淘汰算法进行缓存数据淘汰。

(2)LRU算法

LRU算法(least RecentlyUsed),最近最少使用算法,也就是说默认删除最近最少使用的键。

注意:redis中并不会准确的删除所有键中最近最少使用的键,而是随机抽取3个键,删除这三个键中最近最少使用的键。

那么3这个数字也可以设置采样的大小,如果设置为10,那么效果会更好,不过也会耗费更多的CPU资源。对应位置是配置文件中的maxmeory-samples。

(3)缓存清理配置

maxmemory用来设置redis存放数据的最大的内存大小,一旦超出这个内存大小之后,就会立即使用LRU算法清理掉部分数据。

对于64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止;,但是对于32 bit的机器,有一个隐式的闲置就是3GB

(4)数据淘汰策略

当内存达到最大内存后,采取什么策略清理缓存数据。可通过:maxmemory-policy设置。

主要的淘汰策略,如下:

  • allkeys-lru:当内存大小不能容纳新写入数据时,在键空间中移除最近最少使用的键(key)。

  • allkeys-random:当内存大小不能容纳新写入数据时,在键空间中,随机移除某个键(key)。

  • noeviction:当内存大小不能容纳新写入数据时,新写入数据会报错。

  • volatile-random:当内存大小不能容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个键(key)。

  • volatile-ttl:当内存大小不能容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的键(key)优先移除。

  • volatile-lru:当内存大小不能容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的键(key)。

    注意:Redis默认使用LRU策略算法:allkeys-lru。

(5)Redis缓存清理的流程

     按照一个redis操作的流程,从客户端和服务端的执行内容,进行描述。

  • 客户端:执行缓存数据写入操作

  • redis server:接收到写入操作之后,检查最大内存(maxmemory)限制,如果超过了限制,那么就根据对应的policy清理掉部分缓存数据

  • redis server:执行写入操作。

  • 客户端:接收redis执行结果;

四、总结

redis的内存淘汰策略,用于解决内存不足时需要申请新内存的情况。过期策略用于处理过期的缓存数据。内存淘汰策略并不会影响过期的key的处理。

你可能感兴趣的:(Redis内存回收,过期策略和淘汰机制)