自己建网站教程,万网空间最多放几个网站,wordpress商家目录,杭州网站建设推广Redis 也会因为内存不足而产生错误#xff0c;也可能因为回收过久而导致系统长期的停顿#xff0c;因此掌握执行回收策略十分有必要。在 Redis 的配置文件中#xff0c;当 Redis 的内存达到规定的最大值时#xff0c;允许配置 6 种策略中的一种进行淘汰键值#xff0c;并且…Redis 也会因为内存不足而产生错误也可能因为回收过久而导致系统长期的停顿因此掌握执行回收策略十分有必要。在 Redis 的配置文件中当 Redis 的内存达到规定的最大值时允许配置 6 种策略中的一种进行淘汰键值并且将一些键值对进行回收让我们来看看它们的特点。
首先Redis 的配置文件放在 Redis 的安装目录下在 Windows 中是 redis.windows.conf在 Lunix/Unix 中则是 redis.conf。Redis 对其中的一个配置项——maxmemory-policy提供了这样的一段描述
# 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 - dont expire at all, just return an error on write operations进一步理解。
maxmemory-policy 说明
名称说明volatile-lru采用最近使用最少的淘汰策略Redis 将回收那些超时的仅仅是超时的键值对也就是它只淘汰那些超时的键值对。allkeys-lru采用淘汰最少使用的策略Redis 将对所有的不仅仅是超时的键值对采用最近使用最少的淘汰策略。volatile-random采用随机淘汰策略删除超时的仅仅是超时的键值对。allkeys-random采用随机淘汰策略删除所有的不仅仅是超时的键值对这个策略不常用。volatile-ttl采用删除存活时间最短的键值对策略。noeviction根本就不淘汰任何键值对当内存已满时如果做读操作例如 get 命令它将正常工作而做写操作它将返回错误。也就是说当 Redis 采用这个策略内存达到最大的时候它就只能读而不能写了。
Redis 在默认情况下会采用 noeviction 策略。换句话说如果内存已满则不再提供写入操作而只提供读取操作。显然这往往并不能满足我们的要求因为对于互联网系统而言常常会涉及数以百万甚至更多的用户所以往往需要设置回收策略。
这里需要指出的是LRU 算法或者 TTL 算法都是不是很精确算法而是一个近似的算法。Redis 不会通过对全部的键值对进行比较来确定最精确的时间值从而确定删除哪个键值对因为这将消耗太多的时间导致回收垃圾执行的时间太长造成服务停顿。
而在 Redis 的默认配置文件中存在着参数 maxmemory-samples它的默认值为 3假设采取了 volatile-ttl 算法让我们去了解这样的一个回收的过程假设当前有 5 个即将超时的键值对如下表所示。
volatile-ttl 样本删除方式 由于配置 maxmemory-samples 的值为 3如果 Redis 是按表中的顺序探测那么它只会取到样本 A1、A2、A3然后进行比较因为 A2 过期剩余秒数最少所以决定淘汰 A2因此 A2 是最先被删除的。
注意此时即将过期且剩余超时秒数最短的 A4 却还在内存中因为它不属于探测样本。这就是 Redis 中采用的近似算法。当设置 maxmemory-samples 越大则 Redis 删除的就越精确但是与此同时带来不利的是Redis 也就需要花更多的时间去计算和匹配更为精确的值。
回收超时策略的缺点是必须指明超时的键值对这会给程序开发带来一些设置超时的代码无疑增加了开发者的工作量。
对所有的键值对进行回收有可能把正在使用的键值对删掉增加了存储的不稳定性。对于垃圾回收的策略还需要注意的是回收的时间因为在 Redis 对垃圾的回收期间会造成系统缓慢。
因此控制其回收时间有一定好处只是这个时间不能过短或过长。过短则会造成回收次数过于频繁过长则导致系统单次垃圾回收停顿时间过长都不利于系统的稳定性。