1.key的生存时间到了,Redis会立即删除吗?

答:不会立即删除,分两种删除方式:

          定期删除:Redis每隔一段时间就会去查看Redis设置了过期时间的key,会在100ms的间隔中默认查看3个key。

          惰性删除:如果当你去查询一个已经过了生存时间的key时,Redis会先查看当前key的生存时间,是否已经到了,直接删除当前key,并且给用户返回一个空值。

2.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:(默认)在内存不足时,直接报错。

指定淘汰机制的方式:maxmemory-policy具体策略,

设置Redis的最大内存:maxmemory 字节大小

 

缓存的常见问题

一.缓存穿透问题

问题出现的原因:查询的数据库,Redis中没有,数据库中也没有

解决方法:

1.根据id查询时,如果id是自增的,将数据库中id的最大值放到Redis中,在查询数据库之前,直接比较一下id

2.如果id不是整型,可以将全部的id放到set集合中,在用户查询之前,去redis的set中查看一下是否有一个id

3.获取客户端的ip地址,可以将ip的访问添加限制,限制一定时间内能访问的次数

redis key为啥删不掉 redis删除key后会立刻清除吗_Redis

二.缓存击穿问题

问题:缓存中的热点数据,突然到期了,造成了大量的请求都去访问数据库,造成数据库宕机?

解决方法:

1.在访问缓存中没有的时候,直接添加一个redis的锁,让几个请求去访问数据库,避免数据库宕机

2.redis的热点数据的生存时间去掉

redis key为啥删不掉 redis删除key后会立刻清除吗_java_02

3.缓存雪崩问题

问题:当大量缓存同时到期时,最终大量请求的同时去访问数据,导致数据库宕机

解决方法:将缓存中的数据的生存时间,设置为30~60的一个随机时间

扩展:缓存预热:把数据库的部分数据放到redis中

redis key为啥删不掉 redis删除key后会立刻清除吗_缓存_03

4.缓存倾斜问题

问题:热点数据放在了一个Redis集点上,导致redis集点无法承受住大量的请求,最终Redis宕机

解释:一台redis服务器中存了很多的热点key,请求都会来访问你,例如redis集群,搭建了6台服务器,只有一台有大量请求,而其他服务器很闲,造成缓存倾斜

1.扩展主从架构,搭建大量的从节点,环节Redis的压力

2.可以在Tomcat中进行JVM缓存,在查询Redis之前,先去查询Tomcat中的缓存

redis key为啥删不掉 redis删除key后会立刻清除吗_redis_04