专栏首页龙首琴剑庐Redis 过期时间与内存管理

Redis 过期时间与内存管理

内存管理

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

过期时间

Redis 所有的数据结构都可以设置过期时间,时间到了,Redis 会自动删除相应的对象。 需要注意的:

  • <font color='blue'>过期expire是以对象为单位,比如一个 hash 结构的过期是整个 hash 对象的过期,而不是其中的某个子 key。</font>
  • <font color='red'>如果一个字符串已经设置了过期时间,然后你调用了 set 方法修改了它,它的过期时间会消失。</font>
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会被发现并主动的过期。

  • 主动

当然,这样是不够的,因为有些过期的keys,永远不会访问他们。

无论如何,这些keys应该过期,所以定时随机测试设置keys的过期时间。所有这些过期的keys将会从密钥空间删除。

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

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

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

内存淘汰

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

maxmemory 100mb
maxmemory-policy [策略]

淘汰策略:

  • 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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RocketMQ之Pull Consumer负载均衡拉取正确姿势?

    consume offset 是基于topic 以及 消费组 consumer group的,意思是什么?

    斯武丶风晴
  • Java可变参数列表

    1、接受的传入参数情况 如public void test(String ...args){...}  1)不使用参数,如test() 2)使用一个或多个参数,...

    斯武丶风晴
  • JVM运行时数据区(<=JDK7 and JDK8+)

    是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。

    斯武丶风晴
  • 订单自动过期实现方案

    这个太简单了,就是在查询的时候判断是否失效,如果失效了就给他设置失效状态。但是弊端也很明显,每次查询都要对未失效的订单做判断,如果用户不查询,订单就不失效,那么...

    Mshu
  • 技术 | 看Deepmind机器人尬舞,边玩边学人工智能

    镁客网
  • Django上传图片

    py3study
  • [Tensorflow] 使用SSD-MobileNet训练模型

    因为Android Demo里的模型是已经训练好的,模型保存的label都是固定的,所以我们在使用的时候会发现还有很多东西它识别不出来。那么我们就需要用它来训练...

    wOw
  • Linux 软件管理

    rpm {-i|--install}[install-options] PACKAGE_FILE...

    羊羽shine
  • 自定义动画函数JQuery实现

    skylark
  • 【NLP实战】文本分类之NBSVM算法

    朴素贝叶斯(Naive Bayes, NB)和支持向量机(Support Vector Machines, SVM)的变体常被用作文本分类的基线方法,但它们的性...

    yuquanle

扫码关注云+社区

领取腾讯云代金券