Redis-过期策略与淘汰策略
设置过期时间
expire key time(以秒为单位) -- 比较常用的方式
setex(String key,int seconds,String value) -- 字符串独有的方式
1. 三种过期策略
定时删除:
含义:在设置 key的过期时间 的同时,为该key创建一个定时器 ,让定时器在 key的 过期时间来临时,对key进行删除
优点:保证内存被尽快释放
缺点:若过期 key很多,删除这些 key会占用很多的 CPU时间,在 CPU时间紧张的情况下,CPU不能把所有的时间来做要紧的事,还需要花时间删除这些key。
定时器 的创建耗时,若为每一个设置过期时间的 key创建一个定时器(将会有大量的 定时器 产生),性能影响严重。
2. 惰性删除:
含义:key过期的时候不删除,每次从数据库 读取 key的时候去检查是否过期,若过期,则删除,返回null。
优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对 CPU时间的 占用比较少的,而且此时 的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)。
缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能会发生内存泄漏(无用的垃圾占用了大量的内存)
3. 定期删除:
优点:每隔一段时间执行一次删除 过期 key操作
通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用 --处理“定时删除”的缺点。
定期删除过期key -- 处理“惰性删除”的缺点
缺点:
在内存友好方面,不如 “定时删除”
在CPU时间友好方面,不如“惰性删除”
难点:
合理设置删除操作的执行时长和执行频率
Redis采用的过期策略
惰性删除 + 定期删除
RDB对过期key的处理
过期key对 RDB没有任何影响
从内存数据库持久化 数据到 RDB文件
持久化 key之前,会检查是否 过期,过期的key不进入 RDB文件
从RDB文件恢复数据到内存 数据库
数据载入数据库之前,会 对 key先进行过期检查,如果过期,不导入数据库
AOF 对过期 key的处理
过期 key对 AOF没有任何影响
从内存数据库持久化数据到 AOF文件:
当 key过期后,还没有被删除,此时进行执行持久化操作(该 key是不会进入 AOF文件的,因为没有发生修改命令)
当 key过期后,在发生删除 操作时,程序会向 AOF文件追加一条 del命令(在将来的以 AOF文件恢复数据的时候该过期的键就会被删掉
AOF重写
重写时,会先判断 key是否过期,已过期的key不会重写到 AOF文件
Redis的内存淘汰策略
Redis的内存淘汰策略是指在 Redis的用于缓存的内存 不足时,如何处理新写入且需要申请额外空间的数据。
noeviction:当内存不足容纳新写入数据时,新写入操作就会报错。
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
volatile-lru:当内存 不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除 某个key。
volatile-ttl:当内存 不足以容纳新写入数据时,在 设置了过期时间的键空间中,有更早过期时间的key优先移除。
Redis的内存 淘汰策略的选取并不会 影响过期的 key的处理,内存淘汰策略用于处理内存不足的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。