关于:Redis 的内存回收策略、Key 失效机制

来自Wikioe
Eijux讨论 | 贡献2021年5月11日 (二) 16:53的版本 (建立内容为“category:Redis == 关于 == 在生产环境我们偶尔会遇到 Redis 服务器内存不够的情况,那对于这种情况 Redis 的内存是如何回收…”的新页面)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索


关于

在生产环境我们偶尔会遇到 Redis 服务器内存不够的情况,那对于这种情况 Redis 的内存是如何回收处理的呢?另外对于带有过期时间的 Key Redis 又是如何处理的呢?

Redis 内存设置

如果要设置 Redis 的最大内存大小,依旧可以通过两个方式:

  1. 只需要在配置文件“redis.conf”中配置一行“maxmemory xxx”即可,
    Redis:配置文件设置内存大小.png
  2. 或者我们通过“config set”命令在运行时动态配置 Redis 的内存大小。

内存过期策略

Redis 提供了多种内存过期策略:

  1. volatile-lru”:在所有带有过期时间的 key 中使用 LRU 算法淘汰数据;
  2. alkeys-lru”:在所有的 key 中使用最近最少被使用 LRU 算法淘汰数据,保证新加入的数据正常;
  3. volatile-random”:在所有带有过期时间的 key 中随机淘汰数据;
  4. allkeys-random”:在所有的 key 中随机淘汰数据;
  5. volatile-ttl”:在所有带有过期时间的 key 中,淘汰会最早过期的数据;
  6. noeviction”:不回收,当达到最大内存的时候,在增加新数据的时候会返回 error,不会清除旧数据;【默认策略】
  • LRU:“Least Recently Used”,即“最近最少使用”。
  • “volatile-lru”,“volatile-random”,“volatile-ttl”这几种情况(根据过期时间淘汰),在 Redis 中没有带有过期 Key 的时候跟“noeviction”策略是一样的。

配置

在配置文件中我们使用“maxmemory-policy”来配置策略:

Redis:配置文件设置内存过期策略.png


淘汰策略是可以动态调整的,调整的时候是不需要重启的

原文是这样说的,我们可以根据自己 Redis 的模式来动态调整策略:

  “To pick the right eviction policy is important depending on the access pattern of your application, however you can reconfigure the policy at runtime while the application is running, and monitor the number of cache misses and hits using the Redis INFO output in order to tune your setup.”

策略的执行过程

过期策略按照以下步骤执行:

  1. 客户端运行命令,添加数据申请内存;
  2. Redis 检查内存的使用情况,如果已经超过的最大限制,就是根据配置的内存淘汰策略去淘汰相应的 key,从而保证新数据正常添加;
  3. 继续执行命令。

近似的 LRU 算法

Redis 中的 LRU 算法不是精确的 LRU 算法,而是一种经过采样的 LRU。

我们可以通过在配置文件中设置“maxmemory-samples 5”来设置采样的大小(默认值为 5,可以自行调整)。


官方提供的采用对比如下,我们可以看到当采用数设置为 10 的时候已经很接近真实的 LRU 算法了。

Redis:“近似的 LRU 算法”采样对比.png


在 Redis 3.x 以上的版本的中做过优化,目前的近似 LRU 算法以及提升了很大的效率,Redis 之所以不采样实际的 LRU 算法,是因为会耗费很多的内存,原文是这样说的:

The reason why Redis does not use a true LRU implementation is because it costs more memory.

Key 的过期策略