我们在使用Redis的时候,经常会给某一个key设置存活时间或者过期时间,过期之后,key将不可用,当然也可以不设置,让它永不过期,永远可用。
那么对于那些设置了过期时间的key,Redis内部是怎么判断又是怎么处理的呢?
今天,我们就来看一下Redis内部的清洁工:Redis过期机制。
为Redis的KEY设置存活时间:
expire/pexpire命令:
expire name 10 (秒) | pexpire name 10000 (毫秒)
设置名为name的key在10秒钟后过期,成功返回1,失败返回0。
expireat/pexpireat命令:
expireat name 1584429920 (秒)| pexpireat name 1584429920000 (毫秒)
设置名为name的key在时间戳为1584429920时过期。
persist命令:persist name
移除名为name的key的过期时间,使得name永不过期。
ttl/pttl命令:ttl name (秒)| pttl name (毫秒)
查看名为name的key的剩余过期时间。
Redis设置存活或者过期时间是以Key为单位的,比如hash结构,只能设置整个hash表的存活或者过期时间。
三种过期策略:
1、定时删除:在设置key过期时间的同时,为该key创建一个定时器,key过期时进行删除。
优点:内存释放及时。
缺点:若key很多,定时器创建耗时;维护大量定时器;删除开销很大;严重影响cpu性能。
2、定期删除:每隔一段时间执行一次过期key的删除。
优点:
限制了删除时长和频率,减少删除操作对cpu的占用。-- 定时删除的缺点
定期删除了过期的key。--懒汉式删除的缺点
缺点:
内存占用和cpu耗时方面都介于定时和懒汉式之间。
需要设置标志位,以便下次删除时,从上次结束的位置遍历。
3、懒汉式删除:key过期时不删除,当访问key时才去检查key是否过期,过期了则删除,返回null。
优点:只在key取值时进行删除操作,只删除当前key且非删不可,对cpu占用少。
缺点:大量key过期且没有取值时,会造成无用内存占用。
合理设置删除操作的执行时长和执行频率,才能提高cpu利用率,发挥最大性能。
Redis采用的过期策略:定期删除+懒汉式删除
可通过redis.conf配置
hz 10 /*即1秒执行10次定期删除,100ms一次*/
maxmemory 200000000000 /*最大分配内存,超过时,会执行删除操作*/
1、懒汉式删除流程:
(1)在进行get等操作时,先检查key是否过期。
(2)若过期,先删除key,再进行操作。
(3)若没过期,直接进行操作。
2、定期删除流程:
(1)遍历每个数据库,redis.conf中database配置,默认为16。
(2)检查每个库中指定个数的key,默认20,即以下循环20次。
(3)如果当前库没有key设置过期时间,进入下一个库。
(4)随机获取一个key,检查是否过期,若过期则删除。
(5)判断定期操作是否超时,如果超时则退出定期删除。
3、RDB对过期key的处理:
(1)持久化之前,会检查key是否过期,过期的key不会写入rdb文件。
(2)恢复数据库之前,会检查key是否过期,过期key不会导入。
4、AOF对过期key的处理:
(1)持久化时,若key过期还没删除,没有操作命令不会写aof文件。
(2)持久化时,若key过期且正在删除,向aof文件追加一条del命令。
(3)AOF重写时,先判断key是否过期,过期key不会写入aof文件。
PS:如有任何问题或疑问,请留言告诉我。
领取专属 10元无门槛券
私享最新 技术干货