从零学习redis(9)--- LRU算法缓存

redis 刘宇帅 5年前 阅读量: 1021

redis 是内存性 key-value 数据库,所以 redis 的存储数据的大小受内存的限制,redis 默认是不会删除 key 的(过期的可以除外),当内存使用完的时候,新的写入操作就会返回错误。但是 redis 支持配置回收策略来实现数据过期,Redis 只支持 LRU 回收算法(memcache也是默认算法)。

maxmemory

maxmemory 用来配置 Redis 存储数据的内存大小限制,如果我们要使用 redis 实现 LRU 算法,并限制数据的多少可以通过这个配置来实现。
示例

maxmemory 1g  # 限制 1G 内存大小

设置maxmemory为0代表没有内存限制。对于64位的系统这是个默认值,对于32位的系统默认内存限制为3GB。

maxmemory-policy

maxmemory-policy 用来配置内存回收策略。
可用策略:

  1. noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)
  2. allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
  3. volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。
  4. allkeys-random: 回收随机的键使得新添加的数据有空间存放。
  5. volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。
  6. volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

具体选择哪种回收策略可以根据具体的业务场景做决定。

maxmemory-samples

Redis的LRU算法并非完整的实现。这意味着Redis并没办法选择最佳候选来进行回收,也就是最久未被访问的键。相反它会尝试运行一个近似LRU的算法,通过对少量keys进行取样,然后回收其中一个最好的key(被访问时间较早的)。
不过从Redis 3.0算法已经改进为回收键的候选池子。这改善了算法的性能,使得更加近似真是的LRU算法的行为。
Redis LRU有个很重要的点,你通过调整每次回收时检查的采样数量,以实现调整算法的精度。这个参数可以通过以下的配置指令调整:

maxmemory-samples 5

Redis为什么不使用真实的LRU实现是因为这需要太多的内存。不过近似的LRU算法对于应用而言应该是等价的。

提示

功能待开通!


暂无评论~