Redis 过时时间与内存管理

内存管理

当 Redis 做为缓存使用时(此时缓存仅做为热点数据提升服务的访问性能),须要考虑内存的限制,以及如何随着业务的增加,仅保留热点数据。html

file

过时时间

Redis 全部的数据结构均可以设置过时时间,时间到了,Redis 会自动删除相应的对象。
须要注意的:redis

  • 过时expire是以对象为单位,好比一个 hash 结构的过时是整个 hash 对象的过时,而不是其中的某个子 key。
  • 若是一个字符串已经设置了过时时间,而后你调用了 set 方法修改了它,它的过时时间会消失。
127.0.0.1:6379> set  k1 aaa
OK
127.0.0.1:6379> expire k1 600
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 597
127.0.0.1:6379> set k1  bbb
OK
127.0.0.1:6379> ttl k1
(integer) -1...

淘汰过时的 Keys

Redis keys过时有两种方式:被动和主动方式。算法

  • 被动

当一些客户端尝试访问它时,key会被发现并主动的过时。shell

  • 主动

固然,这样是不够的,由于有些过时的keys,永远不会访问他们。缓存

不管如何,这些keys应该过时,因此定时随机测试设置keys的过时时间。全部这些过时的keys将会从密钥空间删除。数据结构

具体就是Redis每秒10次作的事情:dom

  • 1.测试随机的20个keys进行相关过时检测。
  • 2.删除全部已通过期的keys。
  • 3.若是有多于25%的keys过时,重复步奏1.
    这是一个平凡的几率算法,基本上的假设是,咱们的样本是这个密钥控件,

而且咱们不断重复过时检测,直到过时的keys的百分百低于25%,这意味着,在任何给定的时刻,最多会清除1/4的过时keys。性能

内存淘汰

redis.conf 或 使用 CONFIG 命令配置 Redis的配置项:测试

maxmemory 100mb
maxmemory-policy [策略]

淘汰策略:.net

  • LRU - 最近不多没碰

对最近不多使用(全部或有过时时间的)的key优先淘汰

  • allkeys-lru 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。
  • volatile-lru 尝试回收最少使用的键(LRU),但仅限于在过时集合的键,使得新添加的数据有空间存放。
  • LFU - 没碰多少次

对使用频率最少(全部或有过时时间的)的key优先淘汰

  • allkeys-lfu 尝试回收回收使用频率最少的键(LFU),使得新添加的数据有空间存放。

  • volatile-lfu 尝试回收使用频率最少的键(LFU),但仅限于在过时集合的键,使得新添加的数据有空间存放。

  • volatile-ttl 对有过时时间的key中ttl最小的部分优先淘汰

  • noeviction 返回错误

  • allkeys-random: 回收随机的键使得新添加的数据有空间存放。

  • volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过时集合的键。

近似LRU算法

Redis的LRU算法并不是完整的实现。这意味着Redis并没办法选择最佳候选来进行回收,也就是最久未被访问的键。

相反它会尝试运行一个近似LRU的算法,经过对少许keys进行取样,而后回收其中一个最好的key(被访问时间较早的)。

Redis LRU有个很重要的点,你经过调整每次回收时检查的采样数量,以实现调整算法的精度。这个参数能够经过如下的配置指令调整:

maxmemory-samples 5

@SvenAugustus (https://my.oschina.net/langxSpirit)

相关文章
相关标签/搜索