【二十二】redis之内存淘汰策略和过期策略

一、内存淘汰策略

1.场景

redis的数据会在内存里面,并且有配置设置redis最多能占用多少内存,那就一定存在一个情况:当redis能占用的内存已满,但redis还需要再存新的数据在内存中,那怎么办?

这个就是内存淘汰策略解决的问题

2.配置redis最大占用内存

1.通过配置文件设置

redis.conf配置文件中添加以下配置,设置Redis最大占用内存大小为多少,比如

maxmemory 100mb

 2.通过命令修改

设置Redis最大占用内存大小为100M

127.0.0.1:6379> config set maxmemory 100mb

获取配置的Redis能使用的最大内存大小

127.0.0.1:6379> config get maxmemory

如果设置为0表示没有限制 

3.redis支持的内存淘汰策略

在配置文件redis.conf中

# maxmemory <bytes>
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# The default is:
# maxmemory-policy noeviction
 

redis3.0开始支持6种策略

1. volatile-lru

volatile表示:从设置了过期时间的数据集中根据某个算法(LRU)选出数据来淘汰。

lru表示:使用LRU(最近最少使用)算法进行淘汰

连起来就是:从设置过期时间的数据集(键值对过期时间的表,即 redisDb.expires)中挑选出最近最少使用的数据淘汰。

注意:没有设置过期时间的key不会被淘汰。

特点:在增加内存空间的同时保证需要持久化的数据不会丢失。

2. volatile-ttl

volatile表示:从设置了过期时间的数据集中根据某个算法(ttl)选出数据来淘汰。

ttl表示:过期时间,即使越快过期的约先被淘汰。

注意:没有设置过期时间的key不会被淘汰。

特点:在增加内存空间的同时保证需要持久化的数据不会丢失。

3. volatile-random

volatile表示:从设置了过期时间的数据集中根据某个算法(random)选出数据来淘汰。

random表示:随机。从设置了过期时间的数据集中随机选出数据来淘汰

注意:没有设置过期时间的key不会被淘汰。

特点:在增加内存空间的同时保证需要持久化的数据不会丢失。

4. allkeys-lru

allkey表示:从所有的数据集中根据某个算法(lru)选出数据来淘汰。

lru表示:使用LRU(最近最少使用)算法进行淘汰

5. allkeys-random

allkey表示:从所有的数据集中根据某个算法(random)选出数据来淘汰。

random表示:随机。从所有的数据集中随机选出数据来淘汰

6. no-enviction

默认的淘汰策略

no表示:不淘汰

此时,当内存不足以容纳新入数据时,新写入操作就会报错(DEL请求和部分特殊请求除外)

二、key过期策略

Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理

Redis中同时使用了惰性过期定期过期

常见的过期策略有以下三种:

1.定时过期

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

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

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

2.惰性过期

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

优点:不过多占用CPU资源去做过期处理

缺点:该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

3.定期过期

首先:redis中,每个库(0-15)都有一个expires字典,它会保存所有设置了过期时间的key的过期时间数据。

定期过期是说的:每隔一定的时间,会扫描一定数量的库(比如0-15号库其中几个库)的expires字典中一定数量的key,并清除其中已过期的key。

该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值