zoukankan      html  css  js  c++  java
  • Redis—过期策略以及内存淘汰机制

    过期策略

    一、场景应用

    问题:比如你redis只能存5G数据,可是你写了10G,那会删5G的数据。怎么删的,这个问题思考过么?还有,你的数据已经设置了过期时间,但是时间到了,内存占用率还是比较高,有思考过原因么?

    回答:redis采用的是定期删除+惰性删除策略。过期策略:定期删除+惰性删除

    二、什么是定期删除,什么是惰性删除

    定期删除:redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果有过期就删除。注意这里是随机抽取的。为什么要随机呢?你想一想假如 redis 存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载。

    惰性删除:定期删除可能导致很多过期的 key 到了时间并没有被删除掉。这时就要使用到惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且过期了,是的话就删除。

    三、为什么不用定时删除策略?

    定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求上,而不是删除key上,因此没有采用这一策略。

    四、定期删除+惰性删除是如何工作的呢?

    定期删除,redis默认每隔100ms就检查是否有过期的key,如果有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。

    五、定期删除+惰性删除存在的问题:

    如果定期删除没删除key,然后你也没即时去请求key,也就是说惰性删除也没生效。这时,如果大量过期的key堆积在内存中,redis的内存会越来越高,导致redis的内存块耗尽。那么就应该采用内存淘汰机制。

    内存淘汰机制

    一、内存数据淘汰策略的配置:在redis.conf中有一行配置:

    # maxmemory-policy volatile-lru

    二、配置解释

    1、noeviction:当内存不足以容纳新写入数据时,不进行移除,新写入操作会报错。应该没人用吧。

    2、allkeys-lru:当内存不足以容纳新写入数据时,在所有的键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。

    3、allkeys-random:当内存不足以容纳新写入数据时,在所有的键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。

    4、volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐。

    5、volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐。

    6、volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除即将过期的key进行淘汰,即更早过期时间的key优先移除。不推荐。

    ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

  • 相关阅读:
    Different AG groups have the exactly same group_id value if the group names are same and the ‘CLUSTER_TYPE = EXTERNAL/NONE’
    An example of polybase for Oracle
    use azure data studio to create external table for oracle
    Missing MSI and MSP files
    You may fail to backup log or restore log after TDE certification/key rotation.
    Password is required when adding a database to AG group if the database has a master key
    Use KTPASS instead of adden to configure mssql.keytab
    ardunio+舵机
    android webview 全屏100%显示图片
    glide 长方形图片显示圆角问题
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/13998330.html
Copyright © 2011-2022 走看看