Redis 缓存过期(maxmemory) 配置/算法 详解

LRU(Least Recently Used) 最近最少使用算法是众多置换算法中的一种。

Redis中有一个 maxmemory 概念,主要是为了将使用的内存限定在一个固定的大小。Redis 用到的 LRU 算法,是一种近似的LRU算法.

  1. 设置 maxmemory

maxmemory 是为了限定 Redis 最大内存使用量。有多种方法设定它的大小。其中一种方法是通过 CONFIG SET 设定,如下:

127.0.0.1:6379> CONFIG GET maxmemory

1) "maxmemory"

2) "0"

127.0.0.1:6379> CONFIG SET maxmemory 100MB

OK

127.0.0.1:6379> CONFIG GET maxmemory

1) "maxmemory"

2) "104857600"

另一种方法是修改配置文件 redis.conf:

maxmemory 100mb

注意,在 64bit 系统下,maxmemory 设置为 0 表示不限制 Redis 内存使用,在 32bit 系统下,maxmemory 隐式不能超过 3GB。

当 Redis 内存使用达到指定的限制时,就需要选择一个置换的策略。

  1. 置换策略

当 Redis 内存使用达到 maxmemory 时,需要选择设置好的 maxmemory-policy 进行对老数据的置换。

下面是可以选择的置换策略:

  • noeviction: 不进行置换,表示即使内存达到上限也不进行置换,所有能引起内存增加的命令都会返回error

  • allkeys-lru: 优先删除掉最近最不经常使用的key,用以保存新数据

  • volatile-lru: 只从设置失效(expire set)的key中选择最近最不经常使用的key进行删除,用以保存新数据

  • allkeys-random: 随机从all-keys中选择一些key进行删除,用以保存新数据

  • volatile-random: 只从设置失效(expire set)的key中,选择一些key进行删除,用以保存新数据

  • volatile-ttl: 只从设置失效(expire set)的key中,选出存活时间(TTL)最短的key进行删除,用以保存新数据

设置 maxmemory-policy 的方法 和 设置 maxmemory 方法类似,通过 redis.conf 或是通过 CONFIG SET 动态修改。

如果没有匹配到可以删除的 key,那么 volatile-lru、volatile-random 和 volatile-ttl 策略和 noeviction 替换策略一样——不对任何 key 进行置换。

选择合适的置换策略是很重要的,这主要取决于你的应用的访问模式,当然你也可以动态的修改置换策略,并通过用 Redis 命令——INFO 去输出 cache 的命中率情况,进而可以对置换策略进行调优。

一般来说,有这样一些常用的经验:

  • 在所有的 key 都是最近最经常使用,那么就需要选择 allkeys-lru 进行置换最近最不经常使用的 key,如果你不确定使用哪种策略,那么推荐使用 allkeys-lru

  • 如果所有的 key 的访问概率都是差不多的,那么可以选用 allkeys-random 策略去置换数据

  • 如果对数据有足够的了解,能够为 key 指定 hint(通过expire/ttl指定),那么可以选择 volatile-ttl 进行置换

volatile-lru 和 volatile-random 经常在一个Redis实例既做cache又做持久化的情况下用到,然而,更好的选择使用两个Redis实例来解决这个问题。

设置是失效时间 expire 会占用一些内存,而采用 allkeys-lru 就没有必要设置失效时间,进而更有效的利用内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值