为啥redis那么快?缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

redis为啥那么快?

     内存数据库的工作模式:这种方式速度会快很多,而且不占用我们的硬盘容量。官方提供的数据是达到100000+的QPS(每秒内查询次数)

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

缓存降级: 服务出现问题(响应慢或不响应)或非核心服务影响到核心服务,仍然需要保证核心服务可用,系统会根据一些关键数据自动降级,也可以配置自动降级
    以参考日志级别设置预案:

                  (1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

                 (2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
                 (3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;

                 (4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。
  服务降级的目的:是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,
         Redis出现问题,不去数据库查询,而是直接返回默认值给用户。


    缓存雪崩  :  原缓存失效,新缓存未到期(缓存采用了相同的过期时间,在同一时刻出现大面积缓存过期,所有原本应该访问的缓存请求全都查询数据库了,对数据库CPU和内存造成巨大压力,严重
会造成数据库宕机,从而形成一系列连锁反应,造成系统崩溃)
                  解决方案:加锁,或者队列的方式保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上   或者将缓存失效时间分散开来

    缓存穿透 : 用户查询数据,在数据库没有,自然缓存中也不会有,这样就导致用户查询的时候缓存中没有,每次都要查询数据库,返回空,相当于两次无效查询
                  解决方案: 布隆过滤器  将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力

    缓存更新:常见的策略(1、定期清理缓存 (缺点:需要维护大量的key,比较麻烦)
                                         2、当用户的请求过来时判断这个请求所用到的缓存是否过期,过期就去更新 (缺点:每次用户请求都需要判断缓存是否失效,逻辑相对复杂))

redis做点赞功能

         选择redis的原因是支持更多的数据类型   (hash,set,zset)
         批量存入到redis      (选择hash   存储的是一个点赞对象,这样可以对应数据库的一行记录,很方便)    峰值较小的时候用定时将缓存中的数据写入数据库      缓存清空
       优点:性能高,缓解数据库读写压力
       缺点:开发复杂,不能保证数据的安全性  

 

 

能坚持别人不能坚持的,才能拥有别人不能拥有的。

你可能感兴趣的:(web框架篇)