图片来源pexels

中生代技术

链接技术大咖,分享技术干货

接力技术,链接价值

-----------------------------------------------------

链接5000+CTO, 推送技术干货文章

缓存的使用,是一个逐渐演进的过程。

问一下你自己,最直接的使用缓存的原因是什么?

无它,唯快而已!

追溯一下自己最开始使用缓存的场景,一些数据库里存储的不变的配置信息,服务启动时,直接加载到本地公共模块,方便其它功能模块共享使用。这便是最基本,最简单的本地缓存应用。

一、服务与缓存

所谓的服务,简而言之,一层应用 + 一层数据,应用从数据层获取数据然后加工输出。

数据层,通常我们指的是持久化介质上的持久化存储。它有多种形式的,可以是文件,或者数据库。

数据存储在持久化介质上,而应用运行与内存中。内存和持久化介质是两个有着量级速度差别的不同介质,由此,应用和数据之间便有了“矛盾”。

有了这“矛盾”的引子,便有了对缓存的迫切需求。

我们说的缓存,必然要是存放于内存中的,这样它便能距离应用更近,更快的给出应用所需要的数据,以获得更快的服务响应。

当然,并不是缓存完全隔绝持久层数据。缓存,伴随而生的一个词叫做命中率

当我们查询的数据存在于缓存中的时候,我们称之为“命中”,此时,所需数据可以直接由缓存提供。

而对于未“命中”的数据,则需要穿过缓存层,进一步去持久化数据层获取。此种情景,我们称之为缓存穿透

数据获取之后,在返回给应用之前,我们需要重新填充缓存,以供下一次“命中”查询。

当然,上述我们所述只是指“读”查询情景。

当应用发生数据操作变更,我们则需要将变更同时更新到持久层及缓冲层。此时,我们又会面临另外一个问题,“先”与“后”的问题。

“先”与“后”的问题,我们也称之为缓存一致性问题。

如果先更新缓存,则可能面临持久层更新失败,产生缓存脏数据的问题。

然则,假如先更新持久层,我们又不得不面对从持久层更新成功之后到缓存更新之前这个间期,缓存对外提供旧数据的窘境。

缓存一致性问题,尤其在高并发环境,需要根据特定场景进行更精妙的控制。

比如,并发修改的一致性锁;比如,异步刷新的延迟刷新等等。

二、缓存与更新

上面我们提到了缓存更新一致性的问题,从实际应用情景来讲,可以细分为强一致性需求,弱一致性需求及最终一致性需求。

1、强一致性需求

比如,交易状态信息,已下单、支付中,已支付等应用,需要我们主动及时进行关联更新并保证事务层面的一致性。

应景而生的许多包括分布式事务等理论也为我们解决实际问题提供了很好的践行方案。

2、弱一致性需求

一些涉及不太重要的信息更新,能够容忍短时间(比如,几分钟)内持久层数据和缓存数据不一致的场景。比如不外显的描述信息,统计性的计数缓存信息等。通常可以采取异步处理的方式。

一些一段短时间内(几秒,几分钟)输出固定信息的场景。比如每隔30s更新热点信息,票价信息等。可以通过设置缓存超时自动剔除的方式进行处理。

3、最终一致性需求

保障数据状态的最终一致性。

三、缓存的粒度

所谓粒度,也即缓存信息块层级,大小。选择何种粒度的缓存,取决于我们应用的整体架构,数据存储规划及具体的应用场景。

拿用户信息来举例,是缓存活跃信息?还是相对静态的信息?是按单属性层级来缓存?还是按整个对象信息?

不同的数据粒度,也决定着我们存储缓存的形式:整个对象的二进制序列化数据?更透明直观的json字符串?属性与值的一一映射?

每种形式都有各自的使用优缺点,开发者可以从应用、存储及维护成本各方面进行全面性评估选择。

四、缓存穿透的危害

第一小节,我们提到过关于缓存穿透发生的原因:缓存未命中。那为什么会未命中呢?

1、数据暂时不存在于缓存中

所谓暂时,可以指数据初始尚未加载到缓存,lazy load 按需按时实时加载应用;

也可以是缓存数据被我们特定的缓存过期策略自动或主动过期,通常使用的过期策略包括元素数量限制,内存占用限制及生存时间限制。

其实,无论是初始未加载还是缓存过期,删除,这些都属于我们假定的正常应用场景,再次我们不予过多评论。

2、数据从来不存在

当一个查询不存在数据的请求到来,其必然会穿过缓存,达到持久化存储层。

持久化存储的响应能力是有限的,当这种请求达到一定的量级,服务可能就要面临着宕机的危险。

至此,我们对于缓存的作用认知,也需要进一步延伸:降低下层负载,保护后端资源

造成这种缓存穿透的原因可以简单的分为内外两方面诱因:内部的应用逻辑问题及外部恶意攻击、爬虫干扰等。

内部问题容易解决,内观可预知,良性优化即可;

反而是外部的不可预料,可能需要更谨慎的进行多面的防御性处理。

其实,不论内部还是外部,在缓存层面需要处理的就只有一件事:有效拦截穿透

到此,通常惯性的思维第一步,就是把造成缓存穿透的数据放置到缓存中,无论其是否存在在于持久化存储中。

比如对于正常的已删除的用户数据,做缓存层面的软删除处理,以状态信息做标注(我存在,其实我不存在!????)。就可以很好的解决此类问题造成的穿透压力。

但是,我们有也个清楚的认知就,就是真正能够造成危害的是那些非正常的入侵数据。比如,穷尽遍历的差别数据,一一存入缓存,唯一的结果就是缓存资源的溢满用尽。这是一种相当恐怖的场景。

针对此种“大数据”型攻击,布隆过滤拦截或许可以成为一个不错的选择。

五、也谈缓存雪崩

上面一节中我们谈到了缓存的承载保护功能,一面快速响应,一面背负保护持久层数据。

在某些以读为主的服务中,缓存几近承载近乎90%以上的请求。

但是,如果缓存由于某些原因一时不能提供正常服务时,所有的请求就会穿透到持久存储层,造成存储层极端宕机情况发生。

那么,我们应该如何应对这种情况呢?

1、高可用

缓存的高可用是应对缓存雪崩的首要保障:主从,读写分离,动态扩容,一致性均衡,异地容灾等。

实际应用如Redis的哨兵模式,集群部署等。

2、服务治理之限流、熔断降级

服务治理的目的是什么?服务的稳定性。

限流即对异常流量的控制;熔断、降级标的核心服务资源的保护。

笔者在 轻量级熔断降级框架 alibaba sentinel 应用 介绍过当下流行的几种流控框架的使用。

缓存、持久化数据存储都是资源,或者我们可以从对缓存的流控及对持久化数据存储的熔断、降级保护来着手应对缓存雪崩的情景发生。

3、缓存元素的集中过期导致缓存失效

对于设置了过期时间的缓存元素,如果发生元素同时过期,则会有瞬间的外部请求直接到达持久存储层。

在实际的缓存应用中,需要采取一定的措施,实现缓存元素过期时间的均匀分布。

作者:WindWant

cnblogs.com/niejunlei/p/12914336.html

推荐阅读

知道创宇总监姚昌林:敏捷开发-如何打破研发交付过程中的“墙” 2020-08-28

微博技术专家陈波:百亿级访问量的应用如何做缓存架构设计 2020-08-27

天弘基金首席架构师李鑫:微服务接口限流的算法及架构实现 2020-08-25

一文讲清K8s如何改变美团的云基础设施 2020-08-21

蚂蚁科技 Service Mesh 落地实践与挑战 | GIAC 实录 2020-08-18

飞天茅台超卖P0事故:请慎用Redis分布式锁! 2020-08-17

   END     #接力技术,链接价值#点分享点点赞点在看

缓存,确实很香,却也很受伤!相关推荐

  1. 一道很简单却也很容易入坑的java面试题

    直接上题:以下代码将打印出 public static void main (String[] args) { String classFile = "com.jd.". repl ...

  2. 微服务很香--麻辣味,但要慢慢消化

    前言 微服务在编程圈火的是不行不行的啦,可能还有很多小伙伴还没有进行微服务实操,但这个词,要说没听过.没看过,那小伙伴一定是假Programmer. 虽然微服务很火,但不能盲目使用:先不说涉及技术和工 ...

  3. 电子垃圾也很香 篇一:垃圾佬捡个路由器1:选择与刷机

    电子垃圾也很香 篇一:垃圾佬捡个路由器1:选择与刷机 前言 最近丈母娘总是抱怨家里的路由器不好用,总是动不动就断网.丈母娘的需求必须得满足啊,目前丈母娘家用的是tp的wr740n垃圾路由器,立马着手准 ...

  4. 某程序员感慨:996虽然辛苦,但发钱时真的很香,网友:真香定律

    996是近日被热议的话题,有人反对996,有人认为996是必经阶段,还有的人认为只要钱给够了,996不在话下,根本不是问题.一名阿里员工就吐露了自己的心声,在论坛上感慨了一番自己的经历,称996虽然痛 ...

  5. springboot研究九:lettuce连接池很香,撸撸它的源代码

    个人公众号:jinjunzhu 目录 springboot中lettuce配置 lettuce初始化 使用netty创建连接 管理连接 actuator健康检查获取连接 释放不掉的连接 共享连接 总结 ...

  6. Windows 的这款工具,有时让我觉得 Mac 不是很香

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  7. 截取小数点_五年级上册系列| 小数点位置变化名师微课+课本+学案,暑假预科,很香!...

    点击蓝字关注我们 李艳玲工作室微课展播[总142期] 主讲教师:徐素平 电子课本 学 案 小数乘法 [学习目标] 1.熟练掌握小数点的移动引起小数大小变化的规律,并能举一反三,灵活运用. 2.自主探索 ...

  8. 洛克人html5,《洛克人Zero/Zx合集》:跳票冷饭,与预期有差但依旧很香

    前言 洛克人系列,卡普空旗下经典IP之一,一直都是以高难度著称,相信很多90后玩家的童年都有游玩洛克人的经历.从18年发布的洛克人11,整个系列发展有30余年,洛克人元组系列.X系列的合集早已上线St ...

  9. 当时来美团我确实很犹豫:阿里很好,团购很乱。

    当时来美团我确实很犹豫:阿里很好,团购很乱. 当时拉手网创始人吴波找过我,猎头也猎过我几次.美团网创始人王兴也找我聊.我从来不相信自己是一个运气很好的人,我从来不相信,可以突然碰到一个机会不劳而获就怎 ...

  10. 运营电商平台系统,功能强大真的很香!

    消费者进入到电商系统后,浏览商品到下单结算等一系列的操作都离不开系统功能的支持,从电商平台的管理.运营.推广.营销.转化来看,功能模块作为基础支持,运营者始终认为策略才是核心,但是电商平台系统的功能强 ...

最新文章

  1. Label控件属性AssociatedControlID
  2. AIX 操作系统中AIO、DIO、CIO 的相关概念介绍 (一)
  3. Html引入百度富文本编辑器ueditor
  4. WebService入门讲解
  5. SAP Data Hub里的Constant Generator
  6. 【51单片机快速入门指南】4.1: I2C 与 AT24C02 (EEPROM) 的跨页连续读写
  7. 这是波士顿动力机器狗「他爸」?美军80年代机器狗「考古」,身高3米,人机联合操作...
  8. 如何查看单元测试的结果 以及异常处理
  9. 350网店模板一键安装模版与淘宝传统装修的对比
  10. 个人博客搭建教程——基于WordPress
  11. 网课答案查询单页源码+免费题库API接口
  12. tas5782m功率调试
  13. 计蒜客习题:农场看守
  14. LTE-5G学习笔记17--COMP技术讲解
  15. python安装百度aip_Python人工智能-基于百度AI接口
  16. 我们上语文英语音乐计算机和美术英语,语文、英语、数学、是什么意思
  17. vmware linux访问windowsxp下的文件
  18. android content
  19. 使用 FreeBSD 的原因
  20. Flutter采坑实录

热门文章

  1. 是按压还是触摸_一文读懂,选联想还是华为?Matebook 14锐龙版和YOGA 14s、小新Pro13怎么选?...
  2. 无法嵌入互操作类型 请改用适用的接口_可微编程-自上而下的产品形态 4 Python互操作性...
  3. c++ 宏 win linux_服务器端开发经验总结 Linux C语言
  4. ftp服务器在线浏览,ftp服务器PDF文件在线查看的实现方法
  5. js怎么获取扫码枪条码_生产扫码计件解决方案
  6. 【线性代数本质】1:向量究竟是什么
  7. 3-3:常见任务和主要工具之网络
  8. shell获取命令结果返回行数(行个数)
  9. order by + 数字的用意
  10. jdk监控与故障处理工具