目录
一、key的生存时间
Key生存时间到了,Redis是否会立即删除?
不会立即删除。
定期删除:Redis每隔一段时间就会去查看Redis设置了过期时间的key,会在100ms的间隔中默认查看3个key。
惰性删除:如果当你去查询一个已经过了生存时间的key时,Redis会先查看当前key的生存时间,是否已经到期,到期则直接删除当前key,并且给用户返回一个空值。
二、Redis的淘汰机制
当redis内存不足时,再继续往redis中添加数据,这时会根据设置的规则触发淘汰机制。淘汰机制主要有以下几种:
volatile-lru:在内存不足时,Redis会在设置过了生存时间的key中干掉一个最近最少使用的key。
allkeys-lru:在内存不足时,Redis会在全部的key中干掉一个最近最少使用的key。
volatile-lfu:在内存不足时,Redis会在设置过了生存时间的key中干掉一个最近最少频次使用的key。
allkeys-lfu:在内存不足时,Redis会在全部的key中干掉一个最近最少频次使用的key。
volatile-random:在内存不足时,Redis会在设置过了生存时间的key中随机干掉一个。
- allkeys-random:在内存不足时,Redis会在全部的key中随机干掉一个。
- volatile-ttl:在内存不足时,Redis会在设置过了生存时间的key中干掉一个剩余生存时间最少的key。
- noeviction:(redis默认的淘汰机制)在内存不足时,直接报错。
LRU,即:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的。
LFU,即:最不经常使用淘汰算法(Least Frequently Used)。LFU是淘汰一段时间内,使用次数最少的。
random,随机淘汰算法
三、redis 缓存常见问题
缓存穿透:
什么是缓存穿透?
缓存穿透就是当用户需要查询的数据,redis缓存中不存在,并且我们的数据库中也不存在。当查询redis中没有的数据时,每次请求都会进到数据库,这样就造成了缓存穿透。
如何避免?
1.当发现有用户查询的数据redis中没有,数据库中也没有时,对用户的ip进行限制
2.如果是通过整型的自增主键去查找,那么可以将数据库表中id的最大值存到redis中,用户每次访问都去redis中比较一下id
3.如果主键为非整型,那么可以将所有的主键存到redis的set集合中,用户每次访问都去redis中查询主键是否存在
缓存击穿:
什么是缓存击穿?
缓存击穿就是redis中缓存的热点数据突然到期,这时大量的用户都会去访问数据库,严重可能导致数据库宕机
如何避免?
1.在访问redis中没有数据时,对用户进行限流(加锁)。避免大量请求访问数据库
2.也可以将热点数据的生存时间去掉
缓存雪崩:
什么是缓存雪崩?
缓存雪崩就是redis中大量的热点数据同时到期,大量的用户都会去访问数据库,严重可能导致数据库宕机
如何避免?
可以给热点数据设置一个随机的生存时间(可以使30~60之间),避免大量数据同时到期
缓存倾斜:
什么是缓存倾斜?
缓存倾斜就是一台redis中热点数据过多,导致redis压力过大而宕机,同样的这时会又去到数据库
如何避免?
可以搭建redis的主从架构、配置多个从节点来分担压力
如有错误,请指正。。。谢谢!