Code前端首页关于Code前端联系我们

Redis内存满了怎么办?答案是利用内存淘汰机制

terry 2年前 (2023-09-26) 阅读数 48 #数据库

如果过期数据太多,定时删除并不能彻底删除(每次删除后仍有超过25%的过期key被删除)。同时,这些密钥永远不会被客户端再次请求,也无法被删除。惰性删除,内存满了怎么办?

答案是使用记忆消除机制


故事从一个名为Redis帝国的三公九卿官方职位开始......

在Redis帝国中,整个帝国的国家法律、家庭法律和军事法律都登记在redis.conf中,它控制着整个帝国的运转。

公务员占有的国家领土资源大小的限制,是由一个叫“最大记忆”的司法官员设定的。有两种方法可以实现:

  • 运行时使用 CONFIG SET maxmemory 4gb 指定帝国官员土地资源最大为4GB;
  • 会在redis.conf“Code”中注册maxmemory 4gb法令,指定这个“Code”操作的使用。

需要注意的是,如果maxmemory为0,则64“空格”位没有限制,而

  • “空格”位则隐含了❝❝限制。

    Redis内存消除策略

    帝国官网资源限制已定。如果每年都选新人的话,就没有网站资源可以用了。我应该怎么办?如何选择一些公务员来消灭呢?

    Redis 4.0时代,总共有6种淘汰策略,后来又增加了2种新策略。

    一般来说,我们可以根据是否要淘汰分为两类:

    • 无淘汰策略、无驱逐
    • 其余7种策略根据不同规则进行淘汰。

    noeviction不退役策略

    默认情况下,超过maxmemory值的资源不会被淘汰,不允许新人加入。

    这是一个相关家族,皇帝和国家的亲戚,永久的贵宾。你好。

    随着官方人员的增加,资源容量迟早会满,因为不会被淘汰。满了之后,当“新人”想要进入时,Redis直接返回错误,命中

    秀,好任性。

    淘汰策略不同

    剩下的7种策略也可以根据淘汰候选集和淘汰间隔分为两类:

    • 有设定过期时间的没有设定过期时间的将不会被淘汰被淘汰。淘汰策略如下:
      • volatile-lru:淘汰最近在一线工作最少的人;
      • volatile-lfu:4.0后添加的新策略是淘汰在一线工作次数最少的人员;
      • volatile-random:随机淘汰,为新人腾出空间;
      • volatile-ttl:淘汰是设定公务员的任期,最接近任期的会先淘汰。
    • 消除所有类型的,无论他们是永久皇室VIP亲属还是设置了过期时间的人。
      • allkeys-lru:淘汰近期在一线工作最少的员工;
      • allkeys-lfu:消灭至少最近一直在一线工作的公务员;
      • allkeys-random:随机移除员工,为新员工腾出空间。

    故事到这里就结束了。那么“麻哥”就跟大家分享一下在实际Redis中如何选择正确的淘汰策略以及设置最佳的缓存大小。

    消除执行流程如下图所示:

    Redis 内存满了怎么办?答案是走内存淘汰机制

    • 客户端向服务器发送新命令;
    • 服务器接收客户端命令,Redis检查内存使用情况。如果大于maxmemory限制,则根据策略丢弃数据。
    • 运行新命令。

    allkeys-lru使用场景

    如果您的应用程序冷热数据差异比较明显,根据经验建议您使用该策略,并充分利用LRU算法来保留最后访问的数据数据。有限的内存提高了访问性能。

    allkeys-random使用场景

    如果冷热数据没有明显差异,所有数据分布请求都比较均衡,这个数据会被随机询问,那么使用allkeys-random策略让它随机选择数据进行淘汰。

    volatile-lru使用场景

    在业务场景中,有些数据是无法删除的,比如热门新闻、视频等。目前,我们没有为这些数据设置过期时间,这样数据就不会被删除,政策也会被移除。使用LRU算法淘汰有过期时间且最近被访问过的数据。

    需要注意的一点是,设置密钥过期时间会消耗一些内存,所以使用allkeyds-lru会提高内存效率。

    对于需要维护不可删除的数据以及所有数据都可以消除的业务系统,使用不同的Redis实例集群是一个更好的解决方案。

    对于部分数据无法删除的业务场景,可以使用volatile-lru策略,其他类型可以使用allkyes-lru或allkeys-random。

    Redis 的容量设置多少比较合适

    缓存越大越好。以最低的成本获得最高的效益,才是老板想要的。

    数据访问是本地化的。根据“28原则”:通常,20%的数据可以支持80%的访问请求。

    那么我们可以将缓存容量设置为总数据量的20%吗?

    当然不能那么绝对,这是一个理想的状态。因为可能存在一些个性化需求,不同用户访问的数据可能有很大差异,没有完全遵循“28原则”。

    要根据实际接入特点和成本进行综合评估。根据经验,建议将容量设置为总数据量的15%~30%。

    马哥,其他淘汰规则都比较简单,而 volatile-lru 和 volatile-lfu 则比较复杂。他们的算法是什么?

    volatile-lru 使用 LRU 算法来消除最近最少使用的数据。 volatile-lfu采用LFU算法,在LRU算法的基础上兼顾数据的时效性和访问频率。最少使用的密钥将被删除。

    至于具体的算法细节,我们下次再分解。

  • 版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门