精华内容
下载资源
问答
  • 常见的缓存策略

    2020-04-01 14:51:29
    一. 为什么要使用缓存? 二. 什么样的数据适合缓存? 三. 常见的缓存策略有哪些? 四. 缓存的主要问题和解决办法有哪些?

    一. 为什么要使用缓存?

    如果说要对一个站点或者应用程序进行优化,那么我们最先想到的优化方式应该是使用缓存,使用缓存是最快也是效果最明显的方式。
    优点:
    1.减轻数据库压力(核心)
    2.提高用户体验
    3.增强系统的并发能力
    缺点:
    1.数据不一致(延迟更新)
    2.使用不当容易引发其他问题

    二. 什么样的数据适合缓存?

    1.数据量不是很大
    2.访问频率高
    3.数据不经常更新

    三. 常见的缓存策略有哪些?

    1.Cache-Aside

    一种比较简单实用的方式,可能是最常用的策略。
    在这里插入图片描述
    1.首先,应用程序先确定数据是否保留在缓存中;
    2.如果数据在缓存中,也即 Cache hit (缓存命中)。数据直接从缓存中读取并返回给客户端应用程序;
    3.如果数据不在缓存中,也即 Cache miss(缓存未命中)。应用程序会从数据库中读取该数据,并将数据存储在缓存中,然后将其返回给客户端。
    4.如果需要要更新某个数据,也是先去更新数据库中的数据,更新完成之后,则通过指令让缓存Cache中的数据失效。
    该策略特别适合“读多”的应用场景。可以在一定程度上抵抗缓存故障。如果缓存服务发生故障,系统仍然可以通过直接访问数据库进行操作。
    这种策略并不能保证数据存储和缓存之间的一致性,也会有可能产生脏数据,但是概率很小,属于极端情况。(假如同时有2个请求A和请求B并发执行。A是首次访问缓存中没有数据,就会去数据库中读数据,读到了数据准备写入缓存中,在A把数据写入缓存之前,B更新了数据库,并且设置了缓存失效。然后A才开始把数据写回缓存中,那么最终就会导致,缓存中的数据与数据库的数据不一致,造成了脏数据)通常都是要给缓存加上一个过期的时间,如果必须考虑删除缓存失败的问题,可以使用消息队列实现重试机制(从消息队列取出这些key再次进行删除,失败再次加入到消息队列中,超过一定次数以上则人工介入)–越搞越复杂。
    因为首次请求数据需要先把数据加载到缓存中,开发人员可以通过手动触发查询操作来对数据进行“预热”。

    2.Read/Write-Through

    这个模式其实就是由缓存服务完成数据同步的工作。
    1.应用要读数据和更新数据都直接访问缓存服务
    2.缓存服务同步的将数据更新到数据库
    这个模式出现脏数据的概率就比较低,但是就强依赖缓存了,对缓存服务的稳定性有较大要求,另外,增加新缓存节点时还会有初始状态空数据问题。

    3.Write-Behind

    这个模式就是 Read/Write Through 模式 的一个变种。区别就是 Read/Write Through 模式的缓存写数据库的时候是同步的,而 Write Behind 模式 的缓存操作数据库是异步的。
    1.应用要读数据和更新数据都直接访问缓存服务
    2.缓存服务异步的将数据更新到数据库(通过异步任务)
    这个模式的特点就是速度很快,效率会非常高,但是数据的一致性比较差,还可能会有数据的丢失情况,实现逻辑也较为复杂。

    以上就是目前三种主流的缓存更新策略,另外还有Refrsh-Ahead模式等由于使用的不是很常见就不详细介绍了。

    参考链接:https://www.jianshu.com/p/22c7e9ab5d15

    四. 缓存的主要问题和解决办法有哪些?

    1.缓存穿透

    描述:
    缓存穿透是指用户请求的数据在缓存和数据库中都不存在。例如恶意攻击者发起id为“-1”的数据或id为特别大不存在的数据,如果不加以校验,请求会透过缓存直接去访问数据库,导致数据库压力过大。

    解决办法:
    1.id做基础校验
    2.缓存和数据库都查不到数据时,缓存内容为null或者其他默认值,并设置较短的过期时间(根据项目情况合理设置,时间不宜过长)。
    3.限流

    2.缓存击穿

    描述:
    缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

    解决办法:
    1.缓存预热。
    2.使用互斥锁(mutex key)
    3.让热点数据“永不过期”(配合其他策略在项目容错允许的范围内保证数据一致,也可通过一个后台的异步线程进行缓存的构建)
    4.限流+降级

    3.缓存雪崩

    描述:
    缓存雪崩是指缓存中的大批量key同一时段过期,而该时段内查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发同一个key。

    解决办法:
    1.缓存预热。
    2.将缓存失效时间分散开(随机时长+基础时长)。
    3.让热点数据“永不过期”(配合其他策略在项目容错允许的范围内保证数据一致,也可通过一个后台的异步线程进行缓存的构建)
    4.限流+降级

    参考文档地址:
    链接: https://blog.csdn.net/kongtiao5/article/details/82771694.

    展开全文
  • 对于缓存,大家应该都不会感到陌生,但是关于缓存算法有哪些,大家可能不会太清楚,这里我大概介绍下。 缓存的设计目的就是为了我们访问方便,减少访问时间,大体上有这四种策略: 一:基于时间的策略。当缓存未...

           对于缓存,大家应该都不会感到陌生,但是关于缓存算法有哪些,大家可能不会太清楚,这里我大概介绍下。

    缓存的设计目的就是为了我们访问方便,减少访问时间,大体上有这四种策略:

           一:基于时间的策略。当缓存未满的时候,一直向缓存区添加,当缓存区满的时候,再有数据进来,就需要将以访问过的数据清除掉。

                                       清除的就是那些访问时间久的数据。说白了就是访问时间距离现在越远的将首先被淘汰。

           二:基于频率的策略。当缓冲区满的时候,按照访问频率将数据进行排序,将那些访问频率较少的数据淘汰掉。

           三:基于时间和频率的策略。当缓冲区满的时候,兼顾访问时间和访问频率来选择要淘汰那些数据,具体的协调比例可以自定义,根据不同的环境来合理确定。

           四:基于未来的策略。当缓冲区满的时候,根据访问频率和其他的一些历史经验,来推断未来哪些数据可能不再使用,然后淘汰这些数据。

    这就是设计缓存算法所遵循的基本策略,各有优缺点,我们应该根据自己的环境来是定的选择,甚至可以结合起来使用。

    以上就是我的见解,欢迎读者补充!

    转载于:https://www.cnblogs.com/guozhenqiang/p/5621714.html

    展开全文
  • 一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。 二、缓存并发问题 缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,可能多个请求并发的...

    一、缓存一致性问题

    当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。

    这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。

     

    高并发场景下的缓存有哪些常见的问题?

     

    二、缓存并发问题

    缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。

    此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题。那如何避免类似问题呢?

    我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据。

     

    高并发场景下的缓存有哪些常见的问题?

     

     

    三、缓存穿透问题

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

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

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

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

    1、缓存空对象

    对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。

    同时,也需要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。

    2、单独过滤处理

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

     

    高并发场景下的缓存有哪些常见的问题?

     

     

    四、缓存颠簸问题

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

    五、缓存的雪崩现象

    缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。

    导致这种现象的原因有很多种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实都可能会导致缓存雪崩现象发生。这些问题也可能会被恶意攻击者所利用。

    还有一种情况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会导致雪崩。为了避免这种周期性失效,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。

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

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

    高并发场景下的缓存有哪些常见的问题?

     

     

    六、缓存无底洞现象

    该问题由 facebook 的工作人员提出的, facebook 在 2010 年左右,memcached 节点就已经达3000 个,缓存数千 G 内容。

    他们发现了一个问题---memcached 连接频率,效率下降了,于是加 memcached 节点,添加了后,发现因为连接频率导致的问题,仍然存在,并没有好转,称之为”无底洞现象”。

    高并发场景下的缓存有哪些常见的问题?

     

     

    目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来满足“高性能、高并发、高可用、可扩展”等要求。

    有些是在client端通过Hash取模(或一致性Hash)将值映射到不同的实例上,有些是在client端通过范围取值的方式映射的。当然,也有些是在服务端进行的。

    但是,每一次操作都可能需要和不同节点进行网络通信来完成,实例节点越多,则开销会越大,对性能影响就越大。

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

    1、数据分布方式

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

    2、IO优化

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

    3、数据访问方式

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

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

     

    免费分享Java技术资料,需要的朋友可以关注我后私信我

    高并发场景下的缓存有哪些常见的问题?

    展开全文
  • 一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。 二、缓存并发问题 缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,可能多个请求并发的去从...

    一、缓存一致性问题
    当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。

    这就比较依赖缓存的过期和更新策略。一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。

    这里写图片描述

    二、缓存并发问题
    缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。但是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库造成极大的冲击,甚至导致 “雪崩”现象。

    此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会导致一致性的问题。那如何避免类似问题呢?

    我们会想到类似“锁”的机制,在缓存更新或者过期的情况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其他的请求只需要牺牲一定的等待时间,即可直接从缓存中继续获取数据。

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

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

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

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

    1、缓存空对象

    对查询结果为空的对象也进行缓存,如果是集合,可以缓存一个空的集合(非null),如果是缓存单个对象,可以通过字段标识来区分。这样避免请求穿透到后端数据库。

    同时,也需要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。

    2、单独过滤处理

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

    这里写图片描述

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

    五、缓存的雪崩现象
    缓存雪崩就是指由于缓存的原因,导致大量请求到达后端数据库,从而导致数据库崩溃,整个系统崩溃,发生灾难。

    导致这种现象的原因有很多种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实都可能会导致缓存雪崩现象发生。这些问题也可能会被恶意攻击者所利用。

    还有一种情况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会导致雪崩。为了避免这种周期性失效,可以通过设置不同的过期时间,来错开缓存过期,从而避免缓存集中失效。

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

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

    这里写图片描述

    六、缓存无底洞现象
    该问题由 facebook 的工作人员提出的, facebook 在 2010 年左右,memcached 节点就已经达3000 个,缓存数千 G 内容。

    他们发现了一个问题—memcached 连接频率,效率下降了,于是加 memcached 节点,添加了后,发现因为连接频率导致的问题,仍然存在,并没有好转,称之为”无底洞现象”。

    这里写图片描述

    目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来满足“高性能、高并发、高可用、可扩展”等要求。

    有些是在client端通过Hash取模(或一致性Hash)将值映射到不同的实例上,有些是在client端通过范围取值的方式映射的。当然,也有些是在服务端进行的。

    但是,每一次操作都可能需要和不同节点进行网络通信来完成,实例节点越多,则开销会越大,对性能影响就越大。

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

    1、数据分布方式

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

    2、IO优化

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

    3、数据访问方式

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

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

    展开全文
  • 一般会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。 缓存并发问题 缓存过期后将尝试从后端数据库获取数据,这是一个看似合理的流程。 但是,在高并发场景下,可能多个请求并发的去从数据库...
  • 缓存常见的分类:前端缓存、网络传输缓存、服务端缓存和数据库缓存等。 网络传输缓常见的有CDN缓存和负载均衡缓存。 缓存在实际场景中容易出现的问题 1.缓存穿透 缓存穿透:指业务请求穿过了缓存层,落到持久...
  • 缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,...常见的策略有三种:先进先出策略FIFO(First In,First Out)、最少使用策略LRU(Least Frequently Used)、最近最少使用策略LRU(Lea...
  • 缓存

    2019-11-14 08:39:51
    常见的缓存策略有哪些,如何做到缓存(比如redis)与DB里的数据一致性,你们项目中用到了 什么缓存系统,如何设计的。 如何防止缓存击穿和雪崩。 缓存数据过期后的更新如何设计。 redis的list结构相关的操作。 Redis的...
  • Redis 过期策略有哪些

    万次阅读 2019-05-28 22:32:57
    redis 的过期策略有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 常见的有两个问题: • 往 redis 写入的数据怎么没了? 可能有同学会遇到,在生产环境的 redis 经常会丢掉一些数据,写进去了,过一会儿...
  • 缓存相关知识

    2019-08-06 09:29:00
    一、常见的缓存策略有哪些 由于不同系统的数据访问模式不同,同一种缓存策略很难在不同的数据访问模式下取得满意的性能 缓存策略的分类: 1)、基于公平原则 FIFO(先进先出 queue) 2)、基于访问的时间 LRU ...
  • 先聊聊缓存过期策略有哪些? 定时删除 这是最常见也是应用最多策略,使用这个策略,每个设置过期时间key都需要创建一个对应定时器,到过期时间就立即被清除。这种方式需要耗费大量CPU资源去处理过期数据...
  • 常见的有两个问题: 往 redis 写入的数据怎么没了? 可能同学会遇到,在生产环境的 redis 经常会丢掉一些数据,写进去了,过一会儿可能就没了。我的天,同学,你问这个问题就说明 redis 你就没用对啊。redis 是...
  • redis 过期策略有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码时候,想当然认为写进 redis 数据就一定会...
  • Redis 过期策略有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码时候,想当然认为写进 Redis 数据就一定会...
  • 常见的有两个问题: 往 redis 写入的数据怎么没了? 啥叫缓存?用内存当缓存。内存是无限的吗,内存是很宝贵而且是有限的,磁盘是廉价而且是大量的。可能一台机器就几十个 G 的内存,但是可以几个 T 的硬盘空间...
  • 缓存大小是有限的,当缓存被用满时,应该决定哪些数据被清理出去,哪些数据保留,这就需要缓存淘汰策略,常见的策略有三种: 先进先出策略FIFO(First In,First Out); 最少使用策略LFU(Least Frequently Used); 最近...
  • http常见的header有哪些? 见知识点-http headers 什么是Restful API? 见知识点-http methods 描述一下http的缓存机制(重要) 见知识点http缓存 知识点 状态码 状态码分类 1xx 服务器收到请求 2xx 请求成功 3...
  • 常见的有两个问题: 往 redis 写入的数据怎么没了? 在生产环境的 redis 经常会丢掉一些数据,写进去了,过一会儿可能就没了。这个问题就说明 redis 你就没用对啊。redis 是缓存,你给当存储了是吧? 啥叫缓存?用...
  • 三种常见缓存方式 python实现

    千次阅读 2019-11-03 23:28:38
    常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU(Least Recently Used)。 先进先出策略 FIFO(First In,First Out) 使用定长...
  • 阅读目录 代码 数据库 缓存 ...案例一:商家与控制区关系刷新job...add by zhj: 我个人感觉性能优化分析影响性能因素有哪些,然后按影响力大小进行排序,然后进行排序。 然后进一步分析每个因素为何会影响...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 230
精华内容 92
关键字:

常见的缓存策略有哪些