Java高并发--缓存
Java高并发--缓存
主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记
在下图中每一个部分都可以使用缓存的技术。

缓存的特征
缓存命中:直接通过缓存获取到数据
命中率:命中数 / (命中数+ 未命中数)
最大元素(空间):超过最大空间将触发缓存清空策略
清空策略:FIFO(先进先出)、LFU(最少使用)、LRU(最近最少使用)、过期时间、随机
缓存的粒度越小,缓存命中率越高,对比缓存一整个集合和集合中的某一个元素,或者一整个对象和对象的其中一个属性。
缓存适合的业务场景:读多写少,实时性要求越低,越适合缓存。因为实时性高,数据经常会表更新修改。
缓存的分类
- 本地缓存:编程实现(成员变量、局部变量、静态变量)、Guava Cache。与程序耦合性高,各个应用需要维护自己的本地缓存
- 分布式缓存:Memcache、Redis。与程序是隔离的,缓存自身就是一个独立的应用。多个应用可以共享缓存。
缓存一致性
对数据实时性高的应用,要求数据库和缓存中的数据一致,这就比较依赖缓存的更新和更新策略了,一般在会在数据更改的时候主动更新缓存中的数据或者移除最近的缓存,这时候就可能出现缓存一致性问题。一般有以下四种情况。

缓存并发问题
缓存未命中时会尝试从后端数据库获取数据,在高并发的场景下可能会给数据库造成极大的冲击甚至导致缓存雪崩的现象,此外在某个缓存的key在被更新时,会被大量请求获取,也可能造成缓存一致性问题。如何解决呢?可以使用类似于锁的机制。在缓存更新或者过期的情况下,某个请求尝试获得锁,其他的请求必须等待,当从数据库获取完毕后再释放锁。

缓存穿透
在高并发场景下,对某个key的并发访问,没有命中缓存,出于容错性的考虑会从后端数据库中获取数据,导致大量请求对后端数据库的访问。当该key对应的数据本身是空的情况下,使得数据库中进行了大量不必要的查询操作,从而产生了大量的冲击和压力。

可以有以下几种策略:
- 对于空对象也进行缓存,这样避免请求穿透到数据库了。需要保证缓存数据的时效性。这种实现简单,比较适合命中不高但可能被频繁更新的数据。
- 单独过滤处理,对所有对应数据为空的key进行统一的存放,并在请求前作拦截,避免请求穿透到后端数据库。这种实现相对复杂,比较适合命中不高且更新不频繁的数据。
缓存雪崩
在说缓存雪崩时,先看看缓存抖动。缓存抖动比缓存雪崩更轻微的故障,通常是由于缓存结点的故障导致,推荐的做法是通过一致性哈希算法解决。缓存并发、缓存穿透、缓存抖动等都有可能导致缓存雪崩的发生。
缓存雪崩是由于缓存的原因导致大量请求到达后端数据库,从而导致数据库崩溃的灾难。

Java高并发--缓存的更多相关文章
- Java高并发缓存架构,缓存雪崩、缓存穿透之谜
面试题 了解什么是 redis 的雪崩.穿透和击穿?redis 崩溃之后会怎么样?系统该如何应对这种情况?如何处理 redis 的穿透? 面试官心理分析 其实这是问到缓存必问的,因为缓存雪崩和穿透,是 ...
- Java高并发--CPU多级缓存与Java内存模型
Java高并发--CPU多级缓存与Java内存模型 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 CPU多级缓存 为什么需要CPU缓存:CPU的频率太快,以至于主存跟 ...
- Java高并发如何解决
Java高并发如何解决 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧 ...
- 高级java高并发,高性能,分布式,高可用,负载均衡,系统架构实战
java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战 视频课程包含: ...
- Java高并发的常见应对方案
Java高并发的常见应对方案 一.关于并发我们说的高并发是什么? 在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来. 高并发,通常关心的系统指标与业务指标? QPS:每秒钟查询量,广 ...
- Java高并发--原子性可见性有序性
Java高并发--原子性可见性有序性 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 原子性:指一个操作不可中断,一个线程一旦开始,直到执行完成都不会被其他线程干扰.换 ...
- 转载:Java高并发,如何解决,什么方式解决
原文:https://www.cnblogs.com/lr393993507/p/5909804.html 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并 ...
- java高并发编程(一)
读马士兵java高并发编程,引用他的代码,做个记录. 一.分析下面程序输出: /** * 分析一下这个程序的输出 * @author mashibing */ package yxxy.c_005; ...
- 构建高性能服务(二)java高并发锁的3种实现
构建高性能服务(二)java高并发锁的3种实现 来源:http://www.xymyeah.com/?p=46 提高系统并发吞吐能力是构建高性能服务的重点和难点.通常review代码时看到sync ...
随机推荐
- QEMU KVM libvirt手册(2): monitor
Administrating Virtual Machines with QEMU Monitor When QEMU is running, a monitor console is provide ...
- 包建强的培训课程(16):Android新技术入门和提高
@import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...
- nginx关于限制请求数和连接数
nginx轻巧功能强大,能承受几百并发量,ddos攻击几乎没有影响到nginx自身的工作,但是,太多的请求就开始影响后端服务了.所以必须要在nginx做相应的限制,让攻击没有到后端的服务器.这里阐述的 ...
- 笔记:Zygote和SystemServer进程启动过程
简述 Android设备启动过程中,先是Linux内核加载完,接着Android中的第一个进程init启动,它会启动一些需要开机启动的进程. Zygote就是进程init启动起来的.Android中所 ...
- Javascript对象Oject的强制类型转换
众所周知Javascript作为一种动态类型,弱类型的脚本语言其数据类型在很多时候都会发生类型转换.而这些类型转换往往都是隐式的,这让我们在使用Js的时候会产生许多麻烦.而Js的基础数据类型的转换在此 ...
- 解决微信小程序的wx-charts插件tab切换时的显示会出现位置移动问题-tab切换时,图表显示错乱-实现滑动tab
解决Echarts在微信小程序tab切换时的显示会出现位置移动问题 tab切换时,图表显示错乱 <canvas class="kcanvas" canvas-id=" ...
- gdb remote 使用
//设置halt (gdb) set {int}0x400b0000 = 0x1(gdb) load //设置下一个pc指针的值(gdb) set {int}0x400b2000 = 0x80(gdb ...
- 【学习笔记】分类算法-k近邻算法
k-近邻算法采用测量不同特征值之间的距离来进行分类. 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 用例子来理解k-近邻算法 电影可以按 ...
- 阿里妈妈前端团队出品的开源接口管理工具RAP第二代 http://rap2.taobao.org
RAP2-DELOS 开源社区版本 (后端API服务器) 项目地址:https://github.com/thx/rap2-delos RAP2是在RAP1基础上重做的新项目,它包含两个组件(对应两个 ...
- 扒一扒.net、.net framework、mono和Unity
zhaichao 标签: .net.net frameworkc#monounity 2017-04-23 14:39 425人阅读 评论(0) 收藏 举报 版权声明:本文为博主原创文章,未经博主允许 ...