《Redis学习笔记2-使用 Redis 作为 LRU 缓存》要点:
本文介绍了Redis学习笔记2-使用 Redis 作为 LRU 缓存,希望对您有用。如果有疑问,可以联系我们。
当 Redis 作为缓存使用时,当你添加新的数据时,有时候很方便使 Redis 自动回收老的数据.LRU 实际上是被唯一支持的数据移除办法.Redis 的 maxmemory 指令,用于限制内存使用到一个固定的容量,也包含深入探讨 Redis 使用的 LRU 算法,一个近似准确的 LRU.
maxmemory 配置指令是用来配置 Redis 为数据集使用指定的内存容量大小.可以使用 redis.conf 文件来设置配置指令,或者之后在运行时使用 CONFIG SET 命令.
例如,为了配置内存限制为 100MB,可以在 redis.conf 文件中使用以下指令
设置 maxmemory 为 0,表现没有内存限制.这是 64 位系统的默认行为,32 位的系统则使用 3G 大小作为隐式的内存限制.
当指定的内存容量到达时,必要选择不同的行为,即策略.Redis 可以只为命令返回错误,这样将占用更多的内存,或者每次添加新数据时,回收掉一些旧的数据以避免内存限制.
当 maxmemory 限制到达的时候,Redis 将采取的准确行为是由 maxmemory-policy 配置指令配置的.
以下策略可用:
当没有满足前提条件的话,volatile-lru,volatile-random 和 volatile-ttl 策略就表示得和 noeviction 一样了.
选择正确的回收策略是很重要的,取决于你的应用程序的拜访模式,但是,你可以在程序运行时重新配置策略,使用 INFO 输出来监控缓存命中和错过的次数,以调优你的设置.
一般经验规则:
当你想使用单个实例来实现缓存和持久化一些键,allkeys-lru 和 volatile-random 策略会很有用.但是,通常最好是运行两个 Redis 实例来解决这个问题.
另外值得注意的是,为键设置过期时间需要消耗内存,所以使用像 allkeys-lru 这样的策略会更高效,因为在内存压力下没有需要为键的回收设置过期时间.
理解回收的过程是这么运作的非常的重要:
通过检查,然后回收键以返回到限制以下,来连续不断的穿越内存限制的界限.
如果一个命令导致大量的内存被占用 (像一个很大的集合交集保留到一个新的键),一会功夫内存限制就会被这个明显的内存量所超越.
Redis 的 LRU 算法不是一个精确的实现.这意味着 Redis 不能选择最佳候选键来回收,也就是最久钱被拜访的那些键.相反,会尝试运营一个近似的 LRU 算法,通过采样一小部分键,然后在采样键中回收最适合(拥有最久拜访时间)的那个.
Redis 的 LRU 算法有一点很重要,你可以调整算法的精度,通过改变每次回收时检查的采样数量.这个参数可以通过如下配置指令
Redis 没有使用真实的 LRU 实现的原因,是因为这会消耗更多的内存.然而,近似值对使用 Redis 的应用来说基本上也是等价的.为 Redis 使用的 LRU 近似值和真实 LRU 之间的比拟.
Redis 服务被填充了指定数量的键.键被从头拜访到尾,所以第一个键是 LRU 算法的最佳候选回收键.然后,再新添加 50% 的键,强制一般的旧键被回收.
在理论的 LRU 实现中,我们期待看到的是,在旧键中第一半会过期.而 Redis 的 LRU 算法则只是概率性的过期这些旧键.
你可以看到,同样采用 5 个采样,Redis 3.0 表现得比 Redis 2.8 要好,Redis 2.8 中最近被拜访的对象之间的对象仍然被保留.在 Redis 3.0 中使用 10 为采样大小,近似值已经非常接近理论性能.
注意,LRU 只是一个预言指定键在未来如何被拜访的模式.另外,如果你的数据拜访模式非常接近幂律,大多数的拜访都将集中在一个集合中,LRU 近似算法将能处理得很好.
在模拟实验的过程中,我们发现使用幂律拜访模式,真实的 LRU 算法和 Redis 的近似算法之间的差异非常小,或者根本就没有.
然而,你可以提高采样大小到 10,这会消耗额外的 CPU,来更加近似于真实的 LRU 算法,看看这会不会使你的缓存错失率有差异.
使用 CONFIG SET maxmemory-samples 命令在生产环境上试验各种分歧的采样大小值是很简单的.
《Redis学习笔记2-使用 Redis 作为 LRU 缓存》是否对您有启发,欢迎查看更多与《Redis学习笔记2-使用 Redis 作为 LRU 缓存》相关教程,学精学透。维易PHP学院为您提供精彩教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/9256.html