`
frank1998819
  • 浏览: 733379 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

八分钟了解缓存的常见问题?(转)

 
阅读更多
一、缓存一致性问题
当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。



二、缓存并发问题
缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题。那如何避免类似问题呢?我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据。



三、缓存穿透问题
缓存穿透在有些地方也称为“击穿”。很多朋友对缓存穿透的理解是:由于缓存故障或者缓存过期导致大量请求穿透到后端数据库服务器,从而对数据库造成巨大冲击。

这其实是一种误解。真正的缓存穿透应该是这样的:

在高并发场景下,如果某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而导致了大量请求达到数据库,而当该key对应的数据本身就是空的情况下,这就导致数据库中并发的去执行了很多不必要的查询操作,从而导致巨大冲击和压力。

可以通过下面的几种常用方式来避免缓存传统问题:

缓存空对象
对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。同时,也需要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。

单独过滤处理
对所有可能对应数据为空的key进行统一的存放,并在请求前做拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂,比较适合命中不高,但是更新不频繁的数据。

四、缓存颠簸问题
缓存的颠簸问题,有些地方可能被成为“缓存抖动”,可以看做是一种比“雪崩”更轻微的故障,但是也会在一段时间内对系统造成冲击和性能影响。一般是由于缓存节点故障导致。业内推荐的做法是通过一致性Hash算法来解决。

五、缓存的雪崩现象
缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。导致这种现象的原因有很多种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实都可能会导致缓存雪崩现象发生。这些问题也可能会被恶意攻击者所利用。还有一种情况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会导致雪崩。为了避免这种周期性失效,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。

从应用架构角度,我们可以通过限流、降级、熔断等手段来降低影响,也可以通过多级缓存来避免这种灾难。

此外,从整个研发体系流程的角度,应该加强压力测试,尽量模拟真实场景,尽早的暴露问题从而防范。

六、热点Key
缓存中的某些Key(可能对应用与某个促销商品)对应的value存储在集群中一台机器,使得所有流量涌向同一机器,成为系统的瓶颈,该问题的挑战在于它无法通过增加机器容量来解决。

解决方案

客户端热点key缓存:将热点key对应value并缓存在客户端本地,并且设置一个失效时间。对于每次读请求,将首先检查key是否存在于本地缓存中,如果存在则直接返回,如果不存在再去访问分布式缓存的机器。
服务端负载均衡:将热点key复制多个副本,然后存储到缓存集群的不同机器上。当通过热点key去查询数据时,通过某种hash算法随机选择一个副本机器访问缓存,将热点分散到了不同机器上。
七、缓存无底洞现象
该问题由 facebook 的工作人员提出的, facebook 在 2010 年左右,memcached 节点就已经达3000 个,缓存数千 G 内容。他们发现了一个问题—memcached 连接频率,效率下降了,于是加 memcached 节点,

添加了后,发现因为连接频率导致的问题,仍然存在,并没有好转,称之为”无底洞现象”。

目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来满足“高性能、高并发、高可用、可扩展”等要求。有些是在client端通过Hash取模(或一致性Hash)将值映射到不同的实例上,有些是在client端通过范围取值的方式映射的。当然,也有些是在服务端进行的。但是,每一次操作都可能需要和不同节点进行网络通信来完成,实例节点越多,则开销会越大,对性能影响就越大。

主要可以从如下几个方面避免和优化:

数据分布方式
有些业务数据可能适合Hash分布,而有些业务适合采用范围分布,这样能够从一定程度避免网络IO的开销。

IO优化
可以充分利用连接池,NIO等技术来尽可能降低连接开销,增强并发连接能力。

数据访问方式
一次性获取大的数据集,会比分多次去获取小数据集的网络IO开销更小。

当然,缓存无底洞现象并不常见。在绝大多数的公司里可能根本不会遇到。
分享到:
评论

相关推荐

    c++实现的常见缓存算法和LRU

    那么,了解常见的缓存淘汰算法的策略和原理就显得特别重要。 常见的缓存算法 LRU (Least recently used) 最近最少使用,如果数据最近被访问过,那么将来被访问的几率也更高。 LFU (Least frequently used) 最不...

    60道关于Redis的常见面试题.pdf

    你了解的分布式锁有哪些实现方式? - 6. Redis 的数据淘汰策略有哪些?分别是如何工作的? - 7. 什么是 Redis 事务?它是如何实现的?与传统数据库事务有何不同? - 8. 如何设置 Redis 的主从复制?主从复制有什么...

    Java常见面试问题.docx

    Shiro缓存用户权限了解一下 8.Svn和git的区别? https://blog.csdn.net/walle167/article/details/84235823 9.Quartz的定时调度是怎么实现的?定时调度流程? Wait、notify 实现job类,设置触发器 放到调度器中 ...

    Java后端知识+Java并发系统设计

    带着你了解了高并发系统设计...了解了缓存的定义,常见缓存的分类以及缓存的不足。 了解了缓存使用的几种策略,以及每种策略适用的使用场景是怎样的。 了解了消息队列在高并发系统设计中起到的作用,以及一些注意事项,

    2019蚂蚁金服Java必问面试题及答案(39).rar

    2、项目中的监控:那个监控指标常见的有哪些? 答:CPU、内存、IO 等等。建议下载个nmon工具,里面有各个指标。 数据库:Mysql(缓存命中、索引、单条SQL性能、数据库线程数、数据池连接数) 中间件:1.消息2、...

    详细介绍了PHP常见面试总结.docx绝对非常有帮助

    以下是一些可能出现在PHP面试中的常见问题总结: 1. **基础知识**:面试官可能会询问关于PHP基本语法、数据类型、控制结构、函数和数组的问题。 2. **面向对象编程(OOP)**:问题可能包括类和对象、继承、多态、...

    存储/缓存技术中的SSD固态硬盘寿命解读:比机械硬盘更可靠

     加拿大多伦多大学教授Bianca Schroeder,与谷歌工程师 Raghav Lagisetty及Arif Merchant花费6年时间,研究了大量品牌的SSD硬盘,包括企业级和消费级产品,最终对SSD的使用寿命得出了一些结论,下面一起来了解一下...

    Redis面试必备知识点:使用场景及应用示例详解

    在面试中,Redis也是一个常见的考点,因此了解Redis的使用场景及常用应用示例是必要的。 首先,Redis的使用场景主要包括缓存、数据共享等方面。在缓存方面,Redis可以用来缓存一些热点数据,减少数据库的压力,同时...

    现代体系结构上的UNIX系统--内核程序员的SMP和Caching技术 原书名: UNIX Systems for Modern Architectures

    第一部分“高速缓存存储系统”介绍了高速缓存体系结构、术语和概念,详细考察了4种常见的高速缓存实现——3种虚拟高速缓存的变体和物理高速缓存。第二部分“多处理机系统”讨论了调整单处理机内核的实现,使之适合于...

    java必了解的六大问题

    *第一阶段:Java基础,包括java语法,面向对象特征,常见API,集合框架; *第二阶段:java界面编程,包括AWT,事件机制,SWING,这个部分也可以跳过,用的时候再看都能来及; *第三阶段:java API:输入输出,...

    Spring常见面试题(35道)

    循环依赖问题,为什么用三级缓存,自动装配的方式,Spring Bean的生命周期,Spring启动阶段流程,Spring事务种类,声明式事务实现原理,SpringMVC 核心组件、工作流程,SpringBoot优点,自动装配原理以及启动原理,...

    .NET工程师笔试题高级

    9.请列出常见的缓存方式,并简要概述其优缺点。 10.谈谈对通信加密解密的理解。 11.CTS、CLS. CLR分别作何解释? 12.PDB是什么东西?在调试中它应该放在哪里? 13.C#中Params是什么含义?有何用途? 14.说说对...

    面试题-全网最新的MyBatis面试题及答案

    内容概要包括了MyBatis的基本概念、配置、映射文件、动态SQL、缓存机制等方面的知识点,以及对MyBatis的常见问题和解决方案的解释。 适用人群主要是即将参加面试的软件开发人员,特别是那些使用MyBatis作为持久层...

    FiddlerSetup.zip

    你是不是对那些发送给服务器端的cookie和那些你下载下来的被标记为可缓存的内容感到好奇? 无论你是从事什么开发,哪种语言,只要你想更深入的了解HTTP,这个工具就值得你去了解,它对前端开发工作是很有价值的。 ...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    redis缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级.doc RPC (Remote Procedure Call)即远程过程调用.doc Spring 面试问题 TOP 50(干货推荐收藏必备).doc springboot常见面试题.doc svn和git的区别及适用场景...

    JavaEE求职简历-姓名-JAVA开发工程师.docx

    7.熟悉MySQL、Oracle,熟练使用标准SQL操作数据库,了解常见SQL优化策略; 8.使用过Redis实现分布式下的数据缓存; 9.了解或使用过的企业级开发常用中间件与第三方库:Nginx、ActiveMQ、CXF、ThymenLeaf、Freemarke

    马士兵hibernate学习笔记(原版)

    3 常见的0/R框架(了解) 4 hibernate基础配置(重点) 5 ID生成策略(重点 AUTO) 6 Hibernate核心开发接口介绍(重点) ... 风格 1 先脉络,后细节 2 先操作,后原理 3 重Annotation,轻xml配置文件 .....

    演示了各种硬件效应,这些效应会以令人惊讶的方式降低应用程序性能,如果不了解低级 CPU 和操作系统架构,可能很难解释_C++

    该存储库演示了各种硬件效应,这些效应会以令人惊讶的方式降低应用程序性能,如果不了解低级 CPU 和操作系统架构,可能很难解释。对于每种效果,我都尝试创建一个尽可能小以便易于理解的概念验证程序。 这些影响...

    ***嵌入式系统固件揭秘***

    尽管本书关注的重点主要是固件仆发,...一些最常见的特点,同时还将讨论cPu获得指令的步骤及使用缓存所引入的好处 和缺陷。 至本章的最后(尽管你还不是一名合格的硬件设计师),你会对固件的硬件平 台有更好的现解。

    典型相关分析matlab实现代码-DSAlgo:常见问题解答DS使用C解决的问题

    61C加州大学伯克利分校计算机架构(机器结构)的构想演讲视频作业分配阅读本课程涵盖的主题包括:C和汇编语言编程,将高级程序转换为机器语言,计算机组织,缓存,性能评估,并行性,CPU设计,仓库规模的计算以及...

Global site tag (gtag.js) - Google Analytics