diff --git a/Middleware.md b/Middleware.md index 314e5f9..9849d65 100644 --- a/Middleware.md +++ b/Middleware.md @@ -368,8 +368,6 @@ expires字典会保存所有设置了过期时间的key的过期时间数据, ## 内存淘汰策略 -Redis达到最大内存限制时(`maxmemory`),Redis根据配置文件redis.conf中配置的 `maxmemory-policy` 的策略,来决定具体的行为。 - ```properties # 配置最大内存限制 maxmemory 1000mb @@ -377,16 +375,33 @@ maxmemory 1000mb maxmemory-policy volatile-lru ``` -支持的淘汰策略包括: +当达到内存使用上限超过`maxmemory`时,可在配置文件`redis.conf`中指定 `maxmemory-policy` 的清理缓存: + +- `volatile-lru`:从已设置过期时间的数据集中挑选**最近最少使用**的数据淘汰(淘汰**最长时间**没有被使用) +- `volatile-lfu`:从已设置过期时间的数据集中挑选某段时间内**最近最不经常**的数据淘汰(淘汰一段时间内**使用次数**最少) +- `volatile-ttl`:从已设置过期时间的数据集中挑选**将要过期**的数据淘汰 +- `volatile-random`:从已设置过期时间的数据集中**任意选择**数据淘汰 +- `allkeys-lru`:从所有数据集中挑选**最近最少使用**的数据淘汰 +- `allkeys-lfu`:从所有数据集中选择某段时间内内**最近最不经常**的数据淘汰 +- `allkeys-random`:从所有数据集中**任意选择数**据淘汰 +- `noenviction(驱逐)`:当达到最大内存时直接返回错误,不覆盖或逐出任何数据 + + + +**Redis为什么要有淘汰机制?** + +Redis淘汰机制的存在是为了更好的使用内存,用一定的缓存丢失来换取内存的使用效率。 + +**Redis的过期策略?** + +Redis有两种过期策略,定期删除和惰性删除 + +- - **定期删除**:Redis每个100ms随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。 + - **惰性删除**:在获取某个key的时候,Redis检查一下,如果该key设置了过期时间则判断该过期时间是否已经过期,如果过期了就直接删掉并不返回任何东西。 + +**Redis的内存淘汰机制?** -- **volatile-lru**:从已设置过期时间的数据集中挑选**最近最少使用**的数据淘汰(淘汰**最长时间**没有被使用) -- **volatile-lfu**:从已设置过期时间的数据集中挑选某段时间内**最近最不经常**的数据淘汰(淘汰一段时间内**使用次数**最少) -- **volatile-ttl**:从已设置过期时间的数据集中挑选**将要过期**的数据淘汰 -- **volatile-random**:从已设置过期时间的数据集中**任意选择**数据淘汰 -- **allkeys-lru**:从所有数据集中挑选**最近最少使用**的数据淘汰 -- **allkeys-lfu**:从所有数据集中选择某段时间内内**最近最不经常**的数据淘汰 -- **allkeys-random**:从所有数据集中**任意选择数**据淘汰 -- **noenviction(驱逐)**: 不删除策略,达到最大内存限制时,如果需要更多内存,直接返回错误信息 +当Redis内存快耗尽时,Redis会启动内存淘汰机制,将部分key清掉以腾出内存。 diff --git a/Solution.md b/Solution.md index b987f1f..a25b3ce 100644 --- a/Solution.md +++ b/Solution.md @@ -3417,6 +3417,12 @@ API经济是基于API所产生经济活动的总和,在当今发展阶段主 ![最近最少使用算法(LRU)](images/Solution/最近最少使用算法(LRU).png) +一个缓存被访问后,近期再被访问的可能性很大。可以记录每个缓存记录的最近访问时间,最近未被访问时间最长的数据会被首先淘汰。 + +优点:实现简单,能适应访问热点 +缺点:对偶发的访问敏感,影响命中率 +簿记开销:时间 `O(1)`,空间 `O(N)` + ### 自适应缓存替换算法(ARC) @@ -3431,6 +3437,14 @@ FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存 ![先进先出算法(FIFO)](images/Solution/先进先出算法(FIFO).png) +越早进入缓存的数据,其不再被访问的可能性越大。因此在淘汰缓存时,应选择在内存中停留时间最长的缓存记录。使用队列即可实现该策略: + +![缓存淘汰策略-FIFO](images/Solution/缓存淘汰策略-FIFO.png) + +优点:实现简单,适合线性访问的场景 +缺点:无法适应特定的访问热点,缓存的命中率差 +簿记开销:时间 `O(1)`,空间 `O(N)` + ### 最近最常使用算法(MRU) diff --git a/images/Solution/缓存淘汰策略-FIFO.png b/images/Solution/缓存淘汰策略-FIFO.png new file mode 100644 index 0000000..0037df8 Binary files /dev/null and b/images/Solution/缓存淘汰策略-FIFO.png differ