1、为什么要使用缓存

    越靠近CPU的存储容量越小但访问速度越快。

CPU寄存器-->CPU高速缓存-->内存-->硬盘

  • CPU寄存器(几十到几百字节):位于CPU执行单元中。寄存器是访问速度最快的存储器。典型的访问时间是一纳秒以内
  • CPU高速缓存(Cache):位于CPU内核中。Cache通常分为两级Cache:一级Cache(几十到几百KB)靠近CPU执行单元;二级Cache(几百KB到几MB)靠近物理内存。典型的访问时间是几纳秒到几十纳秒
  • 内存(几GB到几十GB):位于CPU外的存储芯片,通过内存管理模块及数据总线与CPU相连。典型的访问时间是一百多纳秒
  • 硬盘(几百GB到几TB):位于设备总线上,并不直接和CPU相连,CPU通过设备总线的控制器访问硬盘。典型的访问时间是几毫秒

CPU寄存器、CPU高速缓存、内存都是非持久存储设备,而且容量受限,大多数软件处理的数据是需要保存到硬盘上的,但处理数据时又需要将数据从硬盘读取到内存中,为了解决硬盘速度慢的“瓶颈”问题,可以模仿CPU高速缓存的设计思路,将读多写少、一致性要求较低的数据在内存中也保存一份,也就是把数据缓存起来。

2、缓存的实现方案

  • 本地缓存:缓存位于应用软件进程内,最简单的可以通过一个Map来同步存储数据库中的某些热点数据,需要读取的时候直接从Map中读取。专业的缓存组件Google的Guava、Terracotta的Ehcache,可以提供缓存淘汰、缓存同步等管理功能。
  • 集群缓存:单机的话,本地缓存就可以解决问题。但是大多数生产环境中应用软件是要多节点部署形成集群的,这时缓存也要同步的形成缓存集群,以避免缓存数据在多个节点之间的不一致。Ehcache就可以组件集群,它会同步各节点的缓存数据。
  • 分布式缓存:集群缓存可以解决多个缓存节点的数据同步问题,但是当节点过多时(一般不超过四个)会造成内存及网络资源的浪费,这个时候采用分布式缓存,也就是缓存和应用程序不在一个进程内。比如:Redis、memcached就是这样的缓存中间件。

3、常见的缓存问题

(1)双写不一致

       数据库和缓存双写,就必然会存在不一致的问题。如果对数据有强一致性要求,不能放缓存。即使做其他补充方案,也只能保证最终一致性。

  • 基本的缓存不一致问题

先删除缓存,再更新数据库。

  • 高并发下的缓存不一致问题

如:1号线程删除缓存,更新;2号从数据库读取数据,放入缓存;1号提交事务,这个时候缓存里边放的是旧数据。

解决办法:①数据写请求串行化(即:四个操作都放在一个队列中由独立线程取操作)

② 对缓存和数据库的更新加锁

(2)缓存并发竞争

客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本出错;或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了。

解决方案:写数据时采用CAS类的乐观锁方案加锁。

(3)缓存雪崩

是指在某一个时间段,缓存集中过期失效或者缓存系统出现故障,而导致数据读取请求全部压在了数据源层。

解决方案:

  • 高可用:主从+哨兵,避免全盘奔溃。
  • 缓存架构:本地ehcache缓存+hystrix限流&降级、分散缓存过期时间,避免MySQL被打死。
  • 缓存持久:Redis持久化,一旦重启,自动从磁盘上加载数据,快速回复缓存数据。

(4) 缓存穿透

是指查询一个数据源中一定不存在的数据

解决方案:

  • 缓存空值:也就是如果从数据库查询的对象为null,也放入缓存,只是设定的缓存过期时间较短,比如:60s
  • 接口层增加校验:如用户鉴权校验,id做基础校验,id<=0的直接拦截

(5) 缓存击穿

某个key非常热点,访问非常频繁,出于集中式高并发访问的情况,当这个key在失效的瞬间,大量的请求就击穿缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

解决方案:

  • 若缓存的数据基本不会发生更新时,则可尝试将该热点数据设置为永不过期。
  • 若缓存的数据更新不频繁,且缓存刷新的整个流程耗时较少的情况下,则可以采用基于Redis等分布式中间件的分布式互斥锁,以保证仅少量的请求能请求数据库并重新构建缓存,其余线程则在锁释放后能访问到新缓存。

缓存Cache概述——缓存Cache1.1.1相关推荐

  1. 缓存穿透、缓存击穿、缓存雪崩概述缓存一致性的解决方案

    背景: 缓存一致性的产生原因是为了提高系统的吞吐量,通常会把一些即时性.数据强一致性要求不高的,或者访问量大且更新频率不高(读多写少) 的数据从数据库中读取并放到缓存中,提高系统的IO速度,从而提高吞 ...

  2. L1 Cache(一级缓存)

    CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多.缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU ...

  3. mysql query cache 命中率_MySQL缓存命中率概述及如何提高缓存命中率

    MySQL缓存命中率概述 工作原理: 查询缓存的工作原理,基本上可以概括为: 缓存SELECT操作或预处理查询(注释:5.1.17开始支持)的结果集和SQL语句: 新的SELECT语句或预处理查询语句 ...

  4. Spring Cache抽象-缓存注解

    文章目录 概述 Spring缓存的基本原理 @Cacheable :主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 键生成器 带条件的缓存 @Cacheable 注解参数说明 示例-缓存管理 ...

  5. Spring Cache抽象-缓存管理器

    概述 SimpleCacheManager NoOpCacheManager ConcurrentMapCacheManager CompositeCacheManager 概述 CacheManag ...

  6. 计算机缓存Cache机制理解

    1.计算机存储体系简介 存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小.寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级, ...

  7. MemCached配置与缓存知识概述

    先看看百度百科里面对缓存的介绍: 缓存(Cache memory)是硬盘控制器上的一块内存芯片,具有极快的存取速度,它是硬盘内部存储和外界接口之间的缓冲器.由于硬盘的内部数据传输速度和外界介面传输速度 ...

  8. asp.net 应用数据缓存 -- Cache对象使用

    ASP.NET 应用数据缓存 -- Cache对象使用 [原文:http://msdn.microsoft.com/zh-cn/library/18c1wd61%28v=vs.100%29.aspx] ...

  9. ASP.NET状缓存Cache的应用-提高数据库读取速度

    ASP.NET状缓存Cache的应用-提高数据库读取速度 原文:ASP.NET状缓存Cache的应用-提高数据库读取速度 一. Cache概述        既然缓存中的数据其实是来自数据库的,那么缓 ...

最新文章

  1. [转载] CSS模块化【封装-继承-多态】
  2. 如何获取MDC产品文档
  3. OpenCV透视校正perspective correction的实例(附完整代码)
  4. 【拔刀吧少年】之shell编程规范与变量
  5. 解读Redis报错:“MISCONF Redis is configured to save RDB snapshots”
  6. linux下的open的注意事项
  7. 【2016年第1期】专题导读:农业大数据
  8. WEB消息推送-comet4j
  9. CloudStack4.10+GlusterFS4.10测试
  10. hc06发送at无回应_(完结)(温言穆霆琛)全章节~~全文阅读无弹窗广告
  11. 【Python】之glob库介绍
  12. 英特尔处理器的性能监控事件文件下载
  13. 体验Visual Studio 2015 Windows Forms应用程序开发与维护
  14. 活动 | 日立·INNOWAY “引领变革 启迪未来” 创意马拉松
  15. 微信开发者工具显示切后台按钮
  16. 碳中和数据全集-最全碳排放、碳封存、碳排放权配额、碳交易、能源消费与二氧化碳排放
  17. VS2008整合sp1
  18. 使用Python第三方库requests和bs4 爬取必应首页的图片,并存储到系统对应位置
  19. 《Day01》Java开发工程师必备技能:Maven的安装、使用以及重点
  20. Mybatis 注解开发

热门文章

  1. .net 导出excel_C# 导出 Excel 的 6 种简单方法!你会几种?
  2. iOS开源库–最全的整理
  3. 虚拟机从路由器获取宽带拨号账号密码
  4. 免费使用chatgpt的网站集合:
  5. centos7 搭建redis 5.0.0 集群
  6. 使用VirtualBox安装Linux虚拟机,避坑指南
  7. 如何用继电器实现逻辑门(与或非门)- 编码隐匿在计算机软硬件背后的语言读后感
  8. wps的计算机在哪里设置密码,怎么在电脑版WPS中修改密码?
  9. 数据分析_python数据可视化(基于matplotlib+pandas)
  10. 高等数学(导数的应用)