zoukankan      html  css  js  c++  java
  • 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的缓存.

  • 相关阅读:
    目录(爬虫)
    目录(自动化开发)
    目录(Python基础)
    目录(Django开发)
    C#Revit二次开发之-一键切换构件连接顺序 SwitchJoinOrder
    Revit常用的元素过滤方法
    C#之txt的数据写入
    惰性加载
    python mysql and ORM
    Python之常用模块学习(二)
  • 原文地址:https://www.cnblogs.com/dangdanghepingping/p/14304373.html
Copyright © 2011-2022 走看看