redis笔记4 redis常见问题 (千峰教育)

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的缓存.

原文地址:https://www.cnblogs.com/dangdanghepingping/p/14304373.html