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 ...
随机推荐
- 学习C++后感
c++是一门系统级语言,记得大一是要学习这门课时还上网找过学习方法.但网上很多学习方法看的我都头晕,都说学习C++很难,有的说学C++前最好先学C语言,有的说学C++最好不要学C语言,当翻了C++课本 ...
- Idea环境下git 图形化操作
大家好,之前我们介绍了<IDEA环境下GIT操作浅析之一Idea下仓库初始化与文件提交涉及到的基本命令>和<IDEA环境下GIT操作浅析之二-idea下分支操作相关命令>,本文 ...
- 判断浏览器是否支持HTML5 video
话不多说,下面是我从W3C扒的判断浏览器是是否支持H5视频的代码,有需要的小伙伴,拿走不谢 HTML <div id="checkVideoResult"><bu ...
- MySQL:数据库表的空间回收
1. 表数据的存储方式 表数据既可以存储在共享表空间,也可以时单独的文件.这个行为由参数 innodb_file_per_table 控制: 设置为 OFF 时,表示表数据存储在共享表空间: 设置为 ...
- python(leetcode)-14最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- 浅谈模块系统与 ABP 框架初始化
在 ABP 框架当中所有库以及项目都是以模块的形式存在,所有模块都是继承自AbpModule 这个抽象基类,每个模块都拥有四个生命周期.分别是: PreInitialze(); Initialize( ...
- IdentityServer4(7)- 使用客户端认证控制API访问(客户端授权模式)
一.前言 本文已更新到 .NET Core 2.2 本文包括后续的Demo都会放在github:https://github.com/stulzq/IdentityServer4.Samples (Q ...
- 使用ANNdotNET进行情感分析
2018年10月的MSDN杂志上发表了由James McCaffrey撰写的文章“使用CNTK的情感分析” .在这篇博文中,我将向您介绍这篇非常好且写得很好的MSDN文章示例.我不打算重复MSDN文章 ...
- IntelliJ IDEA 代码字体大小的快捷键设置放大缩小(很实用)(图文详解)
不多说,直接上干货! 这是在设置IntelliJ IDEA 代码字体的快捷键设置缩小: 怎么达到的了,就是ctrl + 你的鼠标滑扭往下 这是在设置IntelliJ IDEA 代码字体的快捷键设置 ...
- JVM的类加载
一.基本类加载机制介绍 大体引用一下<深入理解Java虚拟机>一书中对类加载的定义:虚拟机将描述类的二进制字节流(即Class文件)加载到内存中,并对其进行验证.准备.解析.初始化,最终 ...