zoukankan      html  css  js  c++  java
  • redis学习(九) 缓存

    redis学习(九) 缓存



    缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。


    缓存的优点:

    加速读写;降低后端负载



    缓存的缺点:

    数据不一致性;代码维护成本;运维成本



    使用场景:

    开销大的复杂计算,如SQL的联表操作,分组计算;加速请求响应



    缓存更新策略



    缓存中的数据通常都是有生命周期的,需要在指定时间后被删除或更新,这样可以保证缓存空间在一个可控的范围。



    但是缓存中的数据会和数据源中的真实数据有一段时间窗口的不一致,需要利用某些策略进行更新。

    通常考虑两个因素,数据一致性和维护成本。



    LRU/LFU/FIFO算法剔除

    一致性,开发人员只能绝对使用那种算法,不能绝对那些数据被剔除,所以数据的一致性是最差的,维护成本低。



    超时剔除

    一致性,一段时间窗口内(取决于过期时间长短)存在一致性问题,即缓存数据和真实数据源的数据不一致。维护成本也低。



    主动更新

    一致性最高,但如果主动更新发生了问题,那么这条数据很可能很长时间不会更新,所以建议结合超时剔除一起使用效果会更好;维护成本高。



    结论:

    低一致性业务建议配置最大内存和淘汰策略的方式使用。
    高一致性业务可以结合使用超时剔除和主动更新,这样即使主动更新出了问题,也能保证数据过期时间后删除脏数据。



    缓存穿透优化

    缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层。



    造成缓存穿透的基本原因有两个。第一,自身业务代码或者数据出现问题,第二,一些恶意攻击、爬虫等造成大量空命中。


    优化:

    缓存空对象,但是占据了缓存空间

    使用布隆过滤器拦截,维护复杂



    无底洞优化

    当一个集群的节点超过了一定的数量后,性能不会随着节点数增加,反而出现性能下降的源头。

    这是因为节点数量越多,需要的网络开销就越高。


    优化:命令串行化,串性IO,并行IO,hash_tag实现



    雪崩优化

    由于缓存层承载着大量请求,有效地保护了存储层,但是如果缓存层由于某些原因不能提供服务,于是所有的请
    求都会达到存储层,存储层的调用量会暴增,造成存储层也会级联宕机的情况。



    原因有:缓存层的缓存时间超时失效

    提供缓存的服务可用性,比如做二层缓存;依赖组件,比如服务降级,服务拒绝。



    热点key键优化

    开发人员使用“缓存+过期时间”的策略既可以加速数据读写,又保证数据的定期更新,这种模式基本能够满足绝大部分需求。

    但是有两个问题如果同时出现,可能就会对应用造成致命的危害:

    • 当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。
    • 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的SQL、多次IO、多个依赖等。
    • 在缓存失效的瞬间,有大量线程来重建缓存(如图11-16所示),造成后端负载加大,甚至可能会让应用崩溃。


    优化目标:

    减少缓存重建次数,数据尽可能一致。


    手段:


    互斥锁,只允许一个线程进行缓存的重建,其他线程等待获取数据。



    永远不过期,从缓存层面来看,确实没有设置过期时间,所以不会出现热点key过期后产生的问题,也就是“物理”不过期。从功能层面来看,为每个value设置一个逻辑过期时间,当发现超过逻辑过期时间后,会使用单独的线程去构建缓存,但是会出现数据不一致问题。

  • 相关阅读:
    such用法
    divorce用法
    towel用法
    go for用法
    catch on用法
    incredibly用法
    mess用法
    dentist用法
    steer clear of用法
    incredible
  • 原文地址:https://www.cnblogs.com/lin7155/p/14385993.html
Copyright © 2011-2022 走看看