redis 键的过期策略

    我们使用redis作为缓存服务器的时候有时候会希望我们写入的数据过一段时间自动失效.redis为此提供了键过期的功能,我们可以为我们保存在redis中的数据设置一个过期时间,等时间一到我们保存在redis中的数据就自动失效了.我们这里简略的说一下redis键过期的相关知.

 

1.键过期的命令

  1.1 expire,pexpire

    expire和pexpire用于设置redis的键在一定时间之后过期,其中expire只能精确到秒,pexpire可以精确到毫秒

    用法:expire keyName timeout

 

  1.2 expireat,pexpireat

    expireat和pexpireat用于设置键在未来某个时间点过期,expireat只能精确到秒,pexpireat可以精确到毫秒,时间点为一个timestamp时间戳

    用法:expireat keyname timestamp

  1.3 persist

    persist命令用于把一个设置了过期时间的key的过期时间取消.

    用法:persist keyname

  1.4 ttl  

    ttl命令用于查看一个键的过期时间,如果该键设置了过期时间则该命令返回键的过期时间,如果没有设置过期时间则返回-1,如果键不存在则返回-2.

    用法:ttl keyname

 

2.过期键的存储

                                                   

 

  redis把所有的键值对都保存在一个大的字典表(dict)中,如果键设置了过期时间,redis为了方便管理,也会把所有的带有过期时间的键都保存在一个过期时间字典表中.在保存的时候,键值对只会保存一份,两个字典表中的指针指向了同一个键值对,这样即不会浪费太多的空间,redis也可以很方便的管理所有带有过期时间的key,为后续的主动删除提供遍历.

 

 

3.删除过期键的策略

  对于带有过期时间的key,当key过期了之后怎么删除过期的key一般有三种方法.定时删除,定期删除,惰性删除.

     1.定时删除

      即为每一个过期的key配置一个定时任务,定时任务的执行时间为key的过期时间,当key过期时定时任务会删除key

      优点:

        定时删除可以保证每个key已过期就被删除,没有延迟,保证了过期的key不会继续在内存中占用空间

      缺点:

        需要为每个key设置一个定时任务,会占用大量的系统资源,对于单线程的redis这个几乎无法忍受.

     2.惰性删除

      不主动删除过期的key,只有在使用的时候才会校验key是否过期了,如果key过期了就会删除,若key没有过期则执行操作

      优点:

        惰性删除由于不用主动执行任务删除key,所有占用的系统资源最少,

      缺点:

        由于系统不会主动删除的key,会使过期的key继续保存在内存中,导致浪费大量的内存空间

     3.定期删除

      定期删除就是每隔一段时间执行一次删除定时任务的,删除过期的key

      优点:

        由于定期删除即不会造成很大的空间浪费也不会耗费太多的系统资源

      缺点:

        由于时定时执行,所有一些过期的key总是会被延迟删除

    4.redis的键删除策略

      redis采用了定期删除+惰性删除组合删除的策略,redis会定时执行定时任务删除过期的key,并且每次在操作key的时候都会校验一下是否过期了.

      redis定期删除的时间可以通过相关配置参数进行配置.

      因为 Redis 在扫描过期键时,一般会循环扫描多次,如果请求进来,且正好服务器正在进行过期键扫描,那么需要等待 25 毫秒,如果客户端设置的超时时间小于 25 毫秒,那就会导致链接因为超时而关闭,就会造成异常,这些现象还不能从慢查询日志(之前分享过慢查询日志的文章 Redis慢查询日志)中查询到,因为慢查询只记录逻辑处理过程,不包括等待时间。所以我们在设置过期时间时,一定要避免同时大批量键过期的现象,所以如果有这种情况,最好给过期时间加个随机范围,缓解大量键同时过期,造成客户端等待超时的现象.

      redis在执行惰性删除的时候会先判断是否需要惰性删除,如果需要惰性删除则只需要先进行逻辑删除,这样可以快速返回,执行其他命令,然后由后续的后台的任务执行真正的删除.因为redis时单线程的服务,这样可以提高命令执行的效率.

      为了防止执行删除过期key的任务占用过多是运行时间,所有redis并没有在一次执行删除任务时删除所有的过期的key,而是采用了一种简单的贪心策略进行的.1、从过期字典中随机 20 个 key;2、删除这 20 个 key 中已经过期的 key;3、如果过期的 key 比率超过 1/4,那就重复步骤 1;同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。

 

4.从库的删除策略

  reids的从库不会执行定时删除过期键的任务,而是主库在执行完删除过期键的任务之后直接在aof文件中增加一条del命令,这样从库只需要执行del命令就可以了

 

5.过期键的相关配置

  1.hz

    这个参数决定了redis删除过期key任务执行的频率,即每秒执行多少次任务,使用1000/hz就可以得出多久执行一次定时任务.

posted on 2022-04-02 01:57  monkeydai  阅读(481)  评论(0编辑  收藏  举报

导航