Redis过期删除和内存淘汰策略


我们知道很多时候服务器经常会用到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 优先移除。


上一篇 下一篇

评论

登录后可发表评论