1, redis的生存时间到了, 是否会立即删除key
(1) 定期删除,
redis默认每隔100ms删除3个生存时间到期的key
(2) 惰性删除:
如果当一个key生存时间到期后还被查询, redis会删除它
2 redis的淘汰机制(maxmemory-policy)
在redis内存已满, 又写入新数据时, 就按淘汰机制
- noeviction:禁止驱逐数据。默认配置都是这个。当内存使用达到阀值的时候,所有引起申请内存的命令都会报错。
- volatile-lru:从设置了过期时间的数据集中挑选最近最少使用的数据淘汰。
- volatile-ttl:从已设置了过期时间的数据集中挑选即将要过期的数据淘汰。
- volatile-random:从已设置了过期时间的数据集中任意选择数据淘汰。
- allkeys-lru:从数据集中(不管过不过生存期)挑选最近最少使用的数据淘汰。
- allkeys-random:从数据集中任意选择数据淘汰。
3 缓存问题:
客户端经过tomcat查数据, 先看redis, 如果redis里有, 就直接返回数据, 如果没有, 要去mysql里查找, 然后将数据返回并存到redis里一份;如果再次查询该数据, 就不需要经过mysql, 直接从redis里读取就可以了.
缓存穿透:
问题:
mysql查询非常慢, 如果要查询的数据再redis里没有, 去mysql里查询也没有, 并且这种请求量非常大,会造成宕机.
应对策略:
-
- 根据id查询时, 如果id是自增的, 将id的最大值放到redis中, 如果查询的id大于redis存的最大值, 就不需要查询mysql数据库了 , 这样就减少了id太大的查询;
- 如果id不是整形, 可以将全部id放到set中, 用户查询之前, 先查set, 如果set里有, 就去mysql里查, 如果没有, 就不去查, 直接给用户响应.;
- 获取客户端的ip, 对客户端的访问添加限制次数, 如一分钟最多访问100次;
缓存击穿
问题: 当热点数据的声明值到期, redis中查不到, 同一时间段大量的请求去mysql里查询, 造成数据库宕机
解决方案:
在访问缓存没有的时候, 直接添加一把锁, 让几个请求去访问mysql数据库, 其他的不让,避免宕机
缓存雪崩
问题: redis中大量的缓存同时到期(百万级的访问量才会有), 导致大量的访问涌入mysql, 导致mysql宕机.
解决方案:
将缓存中的数据生存时间, 分开设置, 而不是都设置为同一时间, 比如缓存预热时,设置为30-60的一个随机时间,
大量的热点数据放到redis上, 访问量太大造成redis宕机.
方案: 扩展主从架构, 增加节点. 缓解redis压力 费钱
可以在tomcat中做jvm缓存, 在查询redis前先去查询tomcat的缓存.