一、概念

缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。由于缓存的数据比内存快的多,所以缓存的作用就是帮助硬件更快的运行

二、目的

通过提高服务的性能从而提高应用的用户体验。

系统性能指标:响应时间、延迟时间、吞吐量、并发用户数量和资源利用率

吞吐量:系统在单位时间内处理的请求的数量

三、流程

前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。

四、分类

根据位置分类

1、客户端缓存:

对于BS架构的互联网应用来说客户端缓存主要分为页面缓存和浏览器缓存两种,对于APP而言主要是自身所使用的缓存

2、网络中缓存:

网络中的缓存主要是指代理服务器对客户端请求数据的缓存,主要分为WEB代理缓存和边缘缓存(CDN边缘缓存)

3、服务端缓存

从系统的架构上面区分可以将缓存分为

3.1 、服务器本地读缓存(localCache)

本地缓存是一级缓存,位于服务本机的内存中,在操作本地缓存的时候不需要网络IO不需要文件IO,直接从本机内存中读取数据,因此读写速度最快。

本地缓存存在的问题:

本读缓存数据直接保存在JVM中,需要考虑缓存数据的大小、JVM的垃圾回收性能消耗
单服务是集群部署的时候,应该考虑是否需要做集群中本地缓存的数据同步
在实际的开发中可以自己实现简单的本地缓存也可以使用开源的本地缓存框架,比如:ehcache、JBoss Cache等

3.2 、分布式缓存(Redis、Memcached等nosql)

当本地缓存被穿透的时候就会去查询分布式缓存,当在分布式缓存中查询到数据的时候,直接将查询结果放到本地缓存中。
对于分布式缓存主要是使用NoSQL数据库来实现,常用的NoSQL数据库有Redis、Memcached、MongoDB等。目前比较流行的Redis来说,支持Slava/Master模式和Cluster

3.3 、数据库缓存

数据库在设计的时候也有缓存操作,更改相关参数开启查询缓存。如mybatis+mysql的一级、二级缓存

五、常用术语

  1. 缓存命中:当客户端请求的数据在缓存中,这个缓存中的数据就会被使用,这一行为被称为缓存命中
  2. 没有命中:缓存中没有查询到数据,并且数据库中可以查到此数据,并将数据放到缓存中
  3. 缓存穿透:是指查询一个缓存中一定不存在的数据。即缓存中不存在,并且数据库中也不存在,并且在数据库中没有查询到数据的情况下,不会去写缓存,这样就导致每次对于此数据的查询都会去查询数据库,这样就导致缓存失去了意义。
  4. 存储成本:缓存没有命中的时候,从其他数据源取出数据并放到缓存中的时间成本和空间成本就是存储成本。
  5. 缓存失效:当缓存中的数据已经更新时,则此数据已经失效
  6. 替代策略:当缓存没有命中的时,并且缓存容量已满,就需要在缓存中去除一条旧数据,然后加入一条新数据,而应该去除哪些数据,就由替代策略来决定。
  7. 常用的替代策略有:LRU、LFU等。在使用缓存算法的时候,通常会考虑使用频率、获取成本、缓存容量和时间等因素。
  8. 缓存雪崩:缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
  9. 缓存击穿:是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

六、常见问题处理

一、缓存穿透

问题描述:

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:

接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

二、缓存击穿

问题描述:

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

解决方案:

设置热点数据永远不过期。
加互斥锁,互斥锁参考代码如下:

说明:

1)缓存中有数据,直接走上述代码13行后就返回结果了

2)缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待100ms,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。

3)当然这是简化处理,理论上如果能根据key值加锁就更好了,就是线程A从数据库取key1的数据并不妨碍线程B取key2的数据,上面代码明显做不到这点。

三、缓存雪崩

描述:

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

  • 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  • 如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
  • 设置热点数据永远不过期。

java中常用的缓存流程、缓存分类、缓存问题相关推荐

  1. java 中常用框架、intell idea简单使用、爬虫系统

    学习:http://www.ityouknow.com/spring-boot.html http://blog.didispace.com/spring-boot-learning-1/ ***in ...

  2. 动图 + 源码,演示 Java 中常用数据结构执行过程及原理

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  3. 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...

    程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...

  4. 【Java中常用的集合类】

    1.Java中集合框架图 2.List 和 Set 的区别? List , Set 都是继承自Collection 接口 List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重 ...

  5. 动图+源码,演示 Java 中常用数据结构执行过程及原理

    程序员的成长之路 互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆 cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识 ...

  6. java高级特性2_Java高级特性 第2节 java中常用的实用类(1)

    一.Java API Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用:此外也特指API的说明文档,也称帮助文档. Java中常用的包: jav ...

  7. Java基础-Java中常用的锁机制与使用

    Java基础-Java中常用的锁机制与使用 锁lock或互斥mutex是一种同步机制,主要用于在存在多线程的环境中强制对资源进行访问限制.锁的主要作用为强制实施互斥排他以及并发控制策略.锁一般需要硬件 ...

  8. java 中常用的类

    java 中常用的类 Math Math 类,包含用于执行基本数学运算的方法 常用API 取整 l  static double abs(double  a) 获取double 的绝对值 l  sta ...

  9. java中常用的几种排序算法--常见笔试面试

    转载:http://blog.csdn.net/ygc87/article/details/7208082 以下列出Java中常用的几种排序算法,只是简单实现了排序的功能,还有待改进,望指教(以下均假 ...

  10. JAVA中常用的逻辑运算符_Java中常用的运算符

    运算符是一种"功能"符号,用以通知 Java 进行相关的运算,Java 语言中常用的运算符可分为如下几种: 算数运算符.赋值运算符.比较运算符.逻辑运算符.条件运算符. 一.算数运 ...

最新文章

  1. 5分钟掌握手动优化机器学习模型超参数
  2. 数据仓库专题18-数据建模语言IDEF(转载)
  3. python3 for mac_PyCharm for Mac-PyCharm Mac版下载 V2018.3.2-PC6苹果网
  4. 独热编码(One-Hot)的理解
  5. 【Flask】request请求
  6. 【不屈】生如蝼蚁,当立鸿鹄之志
  7. 解锁环境变量在云原生应用中的各种姿势
  8. ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot
  9. 看ADS如何治愈DDoS伤痛
  10. mybatis-generator-maven-plugin插件自动生成代码的配置方法
  11. 购买课程赠老男孩出版的签名新书啦!
  12. C# WinForm开发系列 - Crystal Report
  13. 谷歌云端语音识别助手手机版-Google云端语音识别app1.0.0 官方安卓版-东坡下载...
  14. 语音云识别工具_语音识别工具_web语音识别应用程序的工具 - 云+社区 - 腾讯云...
  15. python-学生管理系统--8-排序功能模块
  16. [demo] 微信小程序Demo:树芽读书(一个不错的书籍朗读小程序)
  17. 三因素三水平正交表l9_正交试验在减水剂中的应用
  18. 药事管理学名词解释和问答题题集
  19. Java 验证码识别(1)使用 Tess4J 进行 OCR 识别
  20. 比较两个不同版本Word文档 Word文档比较差异

热门文章

  1. 用计算机计算四年级思维导图,四年级下册第一单元思维导图数学
  2. tspline工具_TSpline2.0海豚建模教程.pdf
  3. 电线直径对照表_电线平方与直径对照表
  4. 关于eclipse adt更新的问题
  5. TextWatcher使用
  6. win98万能显卡驱动_万能显卡驱动下载
  7. VS2010旗舰版安装图解
  8. miui 8.5 android,小米MIUI8.5稳定版
  9. VBoxGuestAdditions.iso下载地址
  10. 什么是远程桌面?花生壳+Windows远程桌面控制教程