关于过期有一个标识过期时间的,针对String类型的,有 setex(String key, int seconds, String value)--字符串独有的方式这个命令,其他的数据类型,则有expire key time(以秒为单位) 这个命令去设置过期时间。
redis 的过期策略有一下几种{这些知识网上一查一大堆,都整理的很好,但是自己整理一遍,记忆理解都会加深很多}
过期策略:
- 定时删除
在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除。
优点:这样做内存就能尽快被释放掉,
缺点:每一个key 创建一个定时器,大量的定时器会被创建。 - 惰性删除
- 含义:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
- 优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
- 缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)
定期删除
- 每隔一段时间执行一次删除过期key操作
- 通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点
- 定期删除过期key--处理"惰性删除"的缺点
- 优点:
- redis 是惰性删除和定期删除结合使用的。
内存淘汰策略:
最大内存设置:maxmemory ,redis 一共有六种淘汰策略,默认是volatile-lru
- volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key ;
- allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰;
- volatile-random:随机淘汰数据,只淘汰设定了有效期的key;
- allkeys-random:随机淘汰数据,所有的key都可以被淘汰;
- volatile-ttl:淘汰剩余有效期最短的key;
- no-enviction:不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误 。