通过EXPIRE key seconds 命令来设置数据的过期时间.返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间.在key上设置了过期时间后key将在指定的秒数后被自动删除.被指定了过期时间的key在Redis中被称为是不稳定的.
Redis key过期的方式有三种:
惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key(无法保证冷数据被及时删掉)
定期删除:Redis会定期主动淘汰一批已过期的key(随机抽取一批key检查)
内存淘汰机制:当前已用内存超过maxmemory限定时,触发主动清理策略?
①.、如果没有设置有效期,即使内存用完,redis 自动回收机制也是看设置了有效期的,不会动没有设定有效期的,如果清理后内存还是满的,就不再接受写操作.
由以上可以看出,对没设置expire的数据,产生影响的是allkeys-lru机制,allkeys-random.
所以redis没设置expire的数据是否会删除,是由你自己选择的删除机制决定的.
在Redis服务器占用内存达到maxmemory最大的情况下,当再想增加内存占用时,会按maxmemory-policy删除机制将老的数据删除.这里简单说一下volatile-lru,Redis会按LRU算法删除设置了过期时间但还没有过期的key,而对于没有设置过期时间的key,Redis是永远保留的.当然,如果你不想删除没有过期的key,那可以使用noeviction机制.?
===================================================================
redis如何删除过期数据?
setGenericCommand?是一个实现?set,setnx,setex?的通用函数,参数设置不同而已.
再看?setGenericCommand?:
仅关注?dict?和?expires?,分别来存?key-value?和它的超时,也就是说如果一个?key-value?是有超时的,那么它会存在?dict?里,同时也存到?expires?里,类似这样的形式:dict[key]:value,expires[key]:timeout.
当然?key-value?没有超时,?expires?里就不存在这个?key?.?剩下?setKey?和?setExpire?两个函数无非是插数据到两个字典里,这里不再详述.
那么?redis?是如何删除过期?key?的呢.
通过查看?dbDelete?的调用者,?首先注意到这一个函数,是用来删除过期?key?的.
再看看哪些函数调用了?expireIfNeeded?,有?lookupKeyRead?,?lookupKeyWrite?,dbRandomKey?,?existsCommand?,?keysCommand?.通过这些函数命名可以看出,只要访问了某一个?key?,顺带做的事情就是尝试查看过期并删除,这就保证了用户不可能访问到过期的?key?.但是如果有大量的?key?过期,并且没有被访问到,那么就浪费了许多内存.?Redis?是如何处理这个问题的呢.
dbDelete?的调用者里还发现这样一个函数:
最后在?dbDelete?的调用者里还发现这样一个函数:
这个函数太长就不再详述了,注释部分说明只有在配置文件中设置了最大内存时候才会调用这个函数,而设置这个参数的意义是,你把?redis?当做一个内存?cache?而不是?key-value?数据库.