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 ...
随机推荐
- HDFS-HA高可用
HDFS-HA工作机制 通过双NameNode消除单点故障 HDFS-HA工作要点 1.元数据管理方式需要改变 内存中各自保存一份元数据: Edits日志只有Active状态的NameNode节点可以 ...
- Rabbitmq的使用及Web监控工具使用
本文转载自:https://www.cnblogs.com/gossip/p/4475978.html windows安装手册请参考:http://www.rabbitmq.com/install-w ...
- c++实现简单的客户端和服务端
server.cpp #include<WinScok.h> #include<windows.h> #include<stdio.h> int main() { ...
- Java开发瓶颈,Dubbo架构学习整理
作者:butterfly100 一. Dubbo诞生背景 随着互联网的发展和网站规模的扩大,系统架构也从单点的垂直结构往分布式服务架构演进,如下图所示: 单一应用架构:一个应用部署所有功能,此时简化C ...
- IntelliJ IDEA 使用前常用设置
0.设置位置 以下设置基于IntelliJ IDEA 2018.3.2 版本. IDEA 的设置一般都在 File 下的 Settings... 里进行设置的. 1.设置字体字号行间距 2.设置背景图 ...
- Ubuntu 18.04安装配置pure-ftpd解决中文乱码问题
之前用的是vsftpd配置ftp服务器,前面用的挺好,没什么问题,但是后面接收设备上传的文件夹时发现了一个大坑,当设备上传的文件夹名字中包含中文时,在Linux上显示的是乱码...各种转码都不行,折腾 ...
- JDK9新特性实战:流关闭新姿势
做Java开发的都知道,每个资源的打开都需要对应的关闭操作,不然就会使资源一直占用而造成资源浪费,从而降低系统性能. 关于资源的关闭操作,从JDK7-JDK9有了不少的提升及简化. JDK6 在JDK ...
- 微信小程序分包加载实战
"离线包"机制 微信小程序采用的是类似离线包加载方案,以转转小程序为例,当用户第一次打开时会先下载好所有代码,然后再加载页面:当用户再次进入转转小程序时,会直接使用已下载的代码,省 ...
- Mac idea激活
感谢https://blog.csdn.net/HALEN001/article/details/81137092 1.下载IntelliJ IDEA 2018.2.2版本和破解补丁Jetbrains ...
- 转:centos7搭建jenkins小记
转自:https://segmentfault.com/a/1190000007086764 安装java环境 1.查看服务器版本 centos7,继续. cat /etc/redhat-releas ...