我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了见到。这时我们经常会发现一些问题,例如: 数据过期了怎么还在占用内存?在 redis 写入的数据怎么没了?
【三种过期策略】
惰性删除为redis服务器内置策略
定时删除
· 含义:在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。
· 优点:保证内存被尽快释放
· 缺点:若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key。定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重
惰性删除
· 含义:设置该key 过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。
· 优点:删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步(如果此时还不删除的话,我们就会获取到了已经过期的key了)
· 缺点:若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存)
定期删除
· 含义:每隔一段时间,我们就对一些key进行检查,删除里面过期的key。
· 优点:通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点。定期删除过期key--处理"惰性删除"的缺点。
· 缺点:在内存友好方面,不如"定时删除"。在CPU时间友好方面,不如"惰性删除"
· 难点:合理设置删除操作的执行时长(每次删除执行多长时间)和执行频率(每隔多长时间做一次删除)(这个要根据服务器运行情况来定了)
【内存淘汰机制】
noeviction: 不移除任何key,只是返回一个写错误 ,默认选项,一般不会选用。
allkeys-lru:利用LRU算法移除任何key(LRU:最近使用 Least Recently Used )。通常使用该方式。
allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。
volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
登录后可发表评论