快牵着我的袜子

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、redis键的生存时间及过期时间设置

设置过期时间命令

1)expire<key> <ttl>:将键key的生存时间设置为ttl秒

2)pexpire<key> <ttl>:将键key的生存时间设置为ttl毫秒

3)expireat<key> <timestamp>:将键key的生存时间设置为timestamp所指定的秒数时间戳

4)pexpireat<key> <timestamp>:将键key的生存时间设置为timestamp所指定的毫秒数时间戳

前三个命令都是使用pexpireat命令实现。

移除过期时间命令

persist <key> 

计算并返回剩余生存时间

pttl <key>

过期时间存储地方

redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典

1)过期字典的键时一个指针,指向键空间中的某个对象(也即是某个数据库键)

2)过期字典的值是一个long long类型的整数,这个整数保存了键所指向的数据键键的过期时间--一个毫秒精度的UNIX时间戳。

 

二、redis过期键删除策略

1)定时删除:设置过期时间的同时,创建一个定时器,,让定时器在键的过期时间来临时,立即执行对键的删除操作。

好处:对内存友好,

缺点:对cpu时间不友好

总结:内存紧缺的时候可以考虑使用;而cpu紧张的时候考虑服务器响应时间和吞吐率的影响建议不使用

2)惰性删除:放任键过期不管,每次使用的时候判断是否过期,过期则删除,没有过期就返回。

好处:对cpu友好

缺点:对内存不友好

总结:如果存在大量的过期键未删除,且未被访问到,那么将导致变相的内存泄露--无用的垃圾数据占用大量的内存。

3)定期删除:每隔一段时间程序对数据库进行检查一次,删除里面的过期键,至于删除里面多少过期键,以及检查多少个数据库,由算法决定。

定期删除策略是前两种策略的一种整合和折中。

1)每隔一段时间执行一次删除过期键操作,并通过限制操作执行的时长和频率来减少对cpu时间的影响。

2)定期删除过期键也减少了过期键带来的内存浪费。

难点:

1)执行的时长

2)执行频率

 redis默认是每隔100ms就随机抽取一些设置了过期时间的key,如果过期就将它们删除,注意,不是遍历所有设置了过期时间的key,否则将占用大量的CPU资源。

 

 

总的来说:redis服务器实际采用的时惰性删除和定期删除两种策略。

三、RDB、AOF和复制功能对过期键的处理

3.1、RDB

3.1.1、生成RDB文件:在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中键进行检查,过期的键不会保存在新创建的RDB文件中

3.1.2、载入RDB文件:

  1)如果服务器以主服务器模式运行,那么载入RDB文件时,程序不会载入过期的键

  2)如果服务器以从服务器模式运行,那么载入RDB文件时,文件所有的键,无论过不过期都将载入数据库中。但是,因为主从服务器在进行数据同步的时候,从服务器的数据库会清空,所以载入过期键对从服务器也不会造成影响。

 

3.2、AOF

3.2.1 AOF文件写入:当服务器以AOF持久花运行时,如果数据库中的某个键已经过期,但是没有被惰性删除和定期删除,那么AOF文件不会因为这个过期键而产生任何影响。

  当过期键被惰性删除或者定期删除之后,程序会项AOF文件追加一条DEL命令来显地记录该键已经被删除。

3.2.2、AOF重写:和RDB一样,程序会对数据库中的键进行检查,过期的键不会保存到重写后的AOF文件中。

 

3.3、复制(主从复制)

当服务器运行在复制模式下,从服务器的过期键删除动作由主服务器控制。

1)主服务器删除过期键后,会显式的向从服务器发送一个DEL命令,告诉其删除过期键

2)从服务器在执行客户端发送的读命令时,即是碰到过期键也不会将其删除,而是继续像处理未过期的键一样来处理过期键,即返回过期键的值给客户端。一方面时为了保持主从数据的一致性,即过期删除操作统一在master实例中进行并向

下传递;另一方面从服务器仍需对数据集中的过期状态进行管理维护以便于在slave被提升为master会能像master一样独立的进行过期处理。

3)从服务器收到主服务器发送的DEL命令后,才会将过期键删除。

 

四、内存淘汰机制

当惰性删除没有生效,即长时间没有请求过期的key,而且定期删除也没有生效,即定期删除也没有删除key,那么内存也会越来越高,那么就应该采用内存淘汰机制。

六种内存淘汰机制(算法)

1)volatile-lru:从已设置过期时间的数据集中,挑选最近最少使用的数据淘汰(这个是最常用的)

2)volatile-ttl:从已设置过期时间的数据集中,挑选将要过期的数据淘汰

3)volatile-random:从已设置过期时间的数据集中随机选择数据淘汰

4)allkeys-lru:从数据集(所有键)中,挑选出最近最少使用的

5)allkeys-random:从数据集(所有键)中,随机选择数据淘汰

6)no-enviction(驱逐):禁止驱逐数据,当内存不足时,新写入会报错。

posted on 2020-09-09 20:36  快牵着我的袜子  阅读(246)  评论(0编辑  收藏  举报