文章目录
- 前言
- 过期策略:定期删除+惰性删除
- redis中的key和数据过期后,为什么内存空间还没有释放呢?
- 定期删除
- 惰性删除
- 如果内存空间将要满的时候该怎么办呢?
- 设置过期时间的key中
- 所有的key中
- 小结
前言
小咸儿的项目中使用redis来做缓存,从而减轻数据库的压力,但是redis中的key和数据过期后,为什么内存空间还没有释放呢?如果内存空间将要满的时候该怎么办呢?接下来小咸儿就来解释一下该如何解决这两个问题。
过期策略:定期删除+惰性删除
redis中的key和数据过期后,为什么内存空间还没有释放呢?
既然提到redis的过期策略,那么该如何解决这个问题就有点苗头了。先来一张统领全局的图
定期删除
redis默认每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
问题:因为是随机抽取,定期删除可能导致很多过期key到了时间并没有被删除掉,这时候该怎么办呢?惰性删除该上场了。
惰性删除
在你获取某个key时,redis会检查一下,是否设置了过期时间?设置了过期时间是否过期了?如果过期了就删除,不会给你返回任何东西。
问题:实际上,这仍然有问题:比如定期删除漏掉了很多过期key,然后也没及时查询,也就没走惰性删除,这时就会有大量过期的key堆积在内存中,导致redis内存快耗尽了,怎么办?
如果内存空间将要满的时候该怎么办呢?
出现这种情况,就应该淘汰策略上场了,淘汰策略从设置过期时间中的key和从所有的key方面分为两类。
设置过期时间的key中
▪ volatile-lru:设置了过期时间的键空间中,移除最近最少未使用的key。
▪ volatile-ttl:设置了过期时间的键空间中,移除即将过期的key。
▪ volatile-random:设置了过期时间的键空间中,随机移除某个key
所有的key中
▪ noeviction:永不过期,不淘汰,写入新数据时,会报错。
▪ 键空间中,移除最近最少未使用的key。
▪ allkeys-random:键空间中,随机移除某个key
黑色背景 |
小结
有关redis的内容,不仅要知其然还有知其所以然。
感谢您的阅读~~