前言
Redis 是一个高性能的key-value数据库,支持五种数据类型。与 memcache 一样,为了保证效率,数据都是缓存在内存中。区别的是 Redis?会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
然而由于内存大小的限制,当?Redis 内存空间满了以后就需要处理继续存入的数据,这就是所谓的缓存淘汰策略。
缓存策略
缓存淘汰策略由参数?maxmemory-policy? 配置,Redis 3.0中一共有6种,策略?:
- volatile-ttl:在设置了过期时间的数据集里,淘汰离过期时间最近的 key;
- volatile-random:在设置了过期时间的数据集里,淘汰任意一个 key;
- volatile-lru:在设置了过期时间的数据集里,淘汰最近最不常使用的 key;
- allkeys-random:在所有数据集里,淘汰任意一个 key;
- allkeys-lru:在所有数据集里,淘汰最近最不常使用的 key;
- noeviction:返回报错。
Redis的最大容量通过设置 maxmemory? 参数实现,既可以在?redis.conf ?文件中设置 , 也可以在运行过程中通过?CONFIG SET?命令动态修改。
例如:要设置 100MB 的内存限制, 可以在?redis.conf ?文件中这样配置:
maxmemory 100mb
将?maxmemory ?设置为?0 , 则表示不进行内存限制。当然, 对 32 位系统来说有一个隐性的限制条件: 最多 3GB 内存。
适用场景
如果没有设置 expire 的key, 不满足先决条件(prerequisites),那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。
您需要根据系统的特征, 来选择合适的驱逐策略。 当然, 在运行过程中也可以通过命令动态设置驱逐策略, 并通过 INFO 命令监控缓存的 miss 和 hit, 来进行调优。
一般来说:
- 如果分为热数据与冷数据, 推荐使用 allkeys-lru 策略。 也就是, 其中一部分key经常被读写. 如果不确定具体的业务特征, 那么 allkeys-lru 是一个很好的选择;
- 如果需要循环读写所有的key, 或者各个key的访问频率差不多, 可以使用 allkeys-random 策略, 即读写所有元素的概率差不多;
- 假如要让 Redis 根据 TTL 来筛选需要删除的key, 请使用 volatile-ttl 策略。
- volatile-lru 和 volatile-random 策略主要应用场景是: 既有缓存,又有持久key的实例中。 一般来说, 像这类场景, 应该使用两个单独的 Redis 实例。
|