专栏首页服务端技术杂谈分布式缓存有哪些坑

分布式缓存有哪些坑

在toC的系统之中,解决高并发场景下低延迟的问题,缓存是很重要的解决手段。多级缓存,数据异构,数据预处理都是相关的高性能方法论,那么使用分布式缓存会有哪些坑呢?

主要有如下三个坑需要填:

1. 缓存一致性

2. 缓存击穿

3. 缓存雪崩

缓存一致性

我们在引入缓存之后,首先要解决的就是数据源和缓存之间的缓存一致性问题,关于缓存写入有几种常用的方案:

- cache aside pattern

- cache through

- write through

等。

其实在一致性角度讨论也存在多个视角,session一致性,因果一致性,线性一致性等。

在我们真实场景中往往采用的解决方案是,数据写入db,监听binlog,数据格式化处理,通过mq异构到cache服务。这样的好处是不需要维护db和cache的两个分布式事务,使用db的acid机制保障了事务性,通过mq的持久性和重试解决了cache维护的事务性,这样在整个数据写入和缓存维护过程中只需要关注一个事务就可以了(cache维护的事务性)。

缓存击穿

击穿的意思是请求来了之后,我们在应用层没有拦住请求(cache miss了),以至于请求穿透到db层,如果存在大量缓存击穿,对于db压力会很大,如果db扛不住会导致雪崩的问题。所以缓存击穿解决是系统稳定性需要考虑的,也是高流量c端服务在使用缓存时首先需要想到的一个问题。

穿透的流量有两种:

1. 真实流量,但是由于cache失效导致了cache miss

2. 异常流量,爬虫或是恶意攻击,导致大量cache miss

针对于第一种情况,可以通过监控手段观察缓存命中和miss的情况,适当维护缓存,保障一定的命中率。还可以在cache miss之后放一个空。也可以采用“双key解决方案”,请求来了之后通过redis的setnx修改cache_time的时间,同时去db获取元数据,并发请求来了之后发现cache_time没有过期,会获取cache_data的数据(不管数据新老与否)。

针对于第二种情况,一般的方案就是“布隆过滤器”了,可以在单机缓存构造一个布隆过滤器,也可以基于redis实现一个分布式的布隆过滤器。

缓存雪崩

缓存雪崩是指由于大量的热数据设置了相同或接近的过期时间,导致缓存在某一时刻密集失效,大量请求全部转发到 DB,或者是某个冷数据瞬间涌入大量访问,这些查询在缓存 MISS 后,并发的将请求透传到 DB,DB 瞬时压力过载从而拒绝服务。

目前常见的预防缓存雪崩的解决方案,主要是通过对 key 的 TTL 时间加随机数,打散 key 的淘汰时间来尽量规避,但是不能彻底规避。

本文分享自微信公众号 - 春哥叨叨(chungedaodao),作者:春哥大魔王

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 当我们谈论秒杀时我们要做什么?

    “秒杀”系统的建设需要整个系统从前到后全栈的协同配合,其中包含了基础技术部维护的多个服务,比如CDN、高防IP、容器平台、缓存、数据库、中间件、全链路压测、监控...

    春哥大魔王
  • map/reduce的先祖归并排序

    归并排序是利用分治的思想进行排序的策略。 分:通过递归将一个大的数据集进行递归分割,直到只有两个元素进行比较。 治:将分的阶段的分割单元进行合并。 分 ? 可以...

    春哥大魔王
  • CPU内存结构

    由于CPU频率太快了,为解决直接读取内存的数据上的延迟,在CPU和内存之间,存在3级缓存。

    春哥大魔王
  • 【DB笔试面试576】在Oracle中,简述Oracle中的游标。

    在介绍游标之前先介绍一下Oracle数据库中库缓存(Library Cache)的作用及其组成结构。库缓存是SGA中共享池(Shared Pool)中的一块内存...

    小麦苗DBA宝典
  • Asp.net mvc 知多少(九)

    本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想...

    圣杰
  • 面试官问的hibernate和mybatis常见面试题

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和myb...

    好好学java
  • Shiro实战(六) - 权限缓存

    Shiro提供了类似于Spring的Cache抽象,即Shiro本身不实现Cache,但是对Cache进行了又抽象,方便更换不同的底层Cache实现。

    JavaEdge
  • 高并发场景下缓存的常见问题

    作者介绍: 丁浪,非著名架构师。关注高并发、高可用的架构设计,对系统服务化、分库分表、性能调优等方面有深入研究和丰富实践经验。热衷于技术研究和分享。 声明:版权...

    架构师小秘圈
  • 让Python程序轻松加速的方法

    最近,我读了一篇有趣的文章,文中介绍了一些未充分使用的Python特性的。在文章中,作者提到,从Python 3.2开始,标准库附带了一个内置的装饰器 func...

    博文视点Broadview
  • 架构设计 | 缓存管理模式,监控和内存回收策略

    在业务系统中,查询时最容易出现性能问题的模块,查询面对的数据量大,筛选条件复杂,所以在系统架构中引入缓存层,则是非常必要的,用来缓存热点数据,达到快速响应的目的...

    知了一笑

扫码关注云+社区

领取腾讯云代金券