Java缓存介绍

news2024/12/23 17:27:04

2f432f146f7e49b0a6ec059bf346f987.jpg使用场景

 

 

CPU占用:如果你有某些应用需要消耗大量的cpu去计算,比如正则表达式,如果你使用正则表达式比较频繁,而其又占用了很多CPU的话,那你就应该使用缓存将正则表达式的结果给缓存下来。

数据库IO性能:如果发现有大量数据需要频繁查询使用,或者某些数据不会频繁变更时,为了提高数据库IO性能,可以使用缓存

缓存定义

 

所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。

缓存主要可分为二大类:

通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;

内存缓存,也就是创建一个静态内存区域,将数据存储进去,例如我们B/S架构的将数据存储在Application中或者存储在一个静态Map中。

本地缓存

 

所谓的本地缓存是相对于网络而言的(包括集群,数据库访问等)

在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据或者一些数据字典等),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大)

但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略。

分布式/集群缓存定义

 

传统单机缓存概念的一个延伸,用于表示能跨越多台服务器,同时具有可扩展性的缓存。说白了,就是将本地缓存数据存储到远程可集群的缓存载体上,利用网络进行数据交换的一种缓存方式

常用集群载体:Redis;Memcached

多级缓存

 

定义:系统中使用多种缓存(本地缓存及分布式缓存)技术对数据进行缓存,应用数据时,按照优先级(先本地,后分布式)对数据进行依次读取,如果所有缓存中都无数据,则对数据库进行数据读写,并将取到的数据依次(先分布式,后本地)进行缓存更新

为什么使用多级缓存技术(以一级缓存L1(Caffeine)和二级缓存L2(Redis)举例)

如果只有L1,那么在系统重新部署后,缓存数据全部消失;

如果只要L2,使用Redis,很多系统都会使用云服务,这时访问Redis会有一定的网络I/O以及序列化反序列化,虽然性能很高但是其终究没有本地内存L1快

多级缓存常用技术

 

利用Caffeine做一级缓存,Redis作为二级缓存。

首先去Caffeine中查询数据,如果有直接返回。如果没有则进行第2步。

再去Redis中查询,如果查询到了返回数据并在Caffeine中填充此数据。如果没有查到则进行第3步。

最后去Mysql中查询,如果查询到了返回数据并在Redis,Caffeine中依次填充此数据。

对于Caffeine的缓存,如果有数据更新,只能删除更新数据的那台机器上的缓存,其他机器只能通过超时来过期缓存,超时设定可以有两种策略

设置成写入后多少时间后过期

设置成写入后多少时间刷新

缓存更新

 

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

这个操作有一个比较大的问题,在对缓存删除完之后,有一个读请求,这个时候由于缓存被删除所以直接会读库,读操作的数据是老的并且会被加载进入缓存当中,后续读请求全部访问的老数据。

先更新数据库,再删除缓存(推荐)

有一个数据此时是没有缓存的,所以查询请求会直接落库,更新操作在查询请求之后,但是更新操作删除数据库操作在查询完之后回填缓存之前,就会导致我们缓存中和数据库出现缓存不一致,但是这个问题几率特别小。

为什么要删除缓存,而不是更新缓存

你可以想想当有多个并发的请求更新数据,你并不能保证更新数据库的顺序和更新缓存的顺序一致,那就会出现数据库中和缓存中数据不一致的情况。所以一般来说考虑删除缓存。

缓存坑货三剑客

 

缓存穿透

解释:缓存穿透是指查询的数据在数据库是没有的,那么在缓存中自然也没有,所以,在缓存中查不到就会去数据库取查询,这样的请求一多,那么我们的数据库的压力自然会增大

解决方案:

约定:对于返回为NULL的依然缓存,对于抛出异常的返回不进行缓存,注意不要把抛异常的也给缓存了。采用这种手段的会增加我们缓存的维护成本,需要在插入缓存的时候删除这个空缓存,当然我们可以通过设置较短的超时时间来解决这个问题。

制定一些规则过滤一些不可能存在的数据,小数据用BitMap,大数据可以用布隆过滤器,比如你的订单ID 明显是在一个范围1-1000,如果不是1-1000之内的数据那其实可以直接给过滤掉。

缓存击穿

解释:对于某些key设置了过期时间,但是其是热点数据,如果某个key失效,可能大量的请求打过来,缓存未命中,然后去数据库访问,此时数据库访问量会急剧增加。

解决方案:

加分布式锁:加载数据的时候可以利用分布式锁锁住这个数据的Key,在Redis中直接使用setNX操作即可,对于获取到这个锁的线程,查询数据库更新缓存,其他线程采取重试策略,这样数据库不会同时受到很多线程访问同一条数据。

异步加载:由于缓存击穿是热点数据才会出现的问题,可以对这部分热点数据采取到期自动刷新的策略,而不是到期自动淘汰。淘汰其实也是为了数据的时效性,所以采用自动刷新也可以。

缓存雪崩

解释:缓存雪崩是指缓存不可用或者大量缓存由于超时时间相同在同一时间段失效,大量请求直接访问数据库,数据库压力过大导致系统雪崩。

解决方案:

增加缓存系统可用性,通过监控关注缓存的健康程度,根据业务量适当的扩容缓存。

采用多级缓存,不同级别缓存设置的超时时间不同,及时某个级别缓存都过期,也有其他级别缓存兜底。

缓存的过期时间可以取个随机值,比如以前是设置10分钟的超时时间,那每个Key都可以随机8-13分钟过期,尽量让不同Key的过期时间不同。

缓存监控

 

很多人对于缓存的监控也比较忽略,基本上线之后如果不报错然后就默认他就生效了。但是存在这个问题,很多人由于经验不足,有可能设置了不恰当的过期时间,或者不恰当的缓存大小导致缓存命中率不高,让缓存就成为了代码中的一个装饰品。所以对于缓存各种指标的监控,也比较重要,通过其不同的指标数据,我们可以对缓存的参数进行优化,从而让缓存达到最优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/916992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++信息学奥赛1131:基因相关性

这段代码的功能是比较两个字符串的相似度&#xff0c;并根据给定的阈值判断是否相似。 解析注释后的代码如下&#xff1a; #include <iostream> #include <string> using namespace std;int main() {double bf; // 定义双精度浮点数变量bf&#xff0c;用于存储阈…

Promise.all和promise.race的应用场景举例

Promise.all( ).then( )适用于处理多个异步任务&#xff0c;且所有的异步任务都得到结果时的情况。 <template><div class"box"><el-button type"primary" plain click"clickFn">点开弹出框</el-button></div> &…

Docker构建镜像

Docker根据Dockerfile文件构建镜像 在实际生产中&#xff0c;常常使用Dockerfile构建企业级生产环境镜像,然后再部署在我们的生产环境中&#xff0c;本文将从从零开始介绍Dockerfile如何使用&#xff0c;构建镜像。 Dockerhub官网地址&#xff1a;https://registry.hub.docke…

小白到运维工程师自学之路 第七十九集 (基于Jenkins自动打包并部署Tomcat环境)1

一、传统的流程 1、传统网站部署的流程 在运维过程中&#xff0c;网站部署是运维的工作之一。传统的网站部署的流程大致分为:需求分 析-->原型设计-->开发代码-->提交代码-->内网部署-->内网测试-->确认上线-->备份数据-->外网更新-->外网测试--&g…

2023年7月京东净水器行业品牌销售排行榜(京东数据分析软件)

伴随消费升级及健康生活理念的流行&#xff0c;消费者对饮水健康的关注度也逐步提高。加之经净水器处理的水在安全性、便捷性等方面的优势得到认可&#xff0c;净水器这一电器的市场占比也不断提高。在家电行业整体低迷的环境下&#xff0c;净水器的销量销额仍保持正向增长。 …

VBA Excel自定义函数的使用 简单的语法

一个简单的教程&#xff0c;实现VBA自定义函数。 新建模块 复制后面的代码放进来 函数的入口参数不定义&#xff0c;则认为是一块区域&#xff1b; 反之&#xff0c;如FindChar1 As String&#xff0c;则认为是输入的单值。 循环和分支如下例子&#xff0c;VB比较接近自然语…

OpenAI 组件 | 加速 OpenAI API 在项目中的集成

在当今这个快节奏的技术世界中&#xff0c;将 OpenAI 的功能集成到项目中已经成为一种趋势。OpenAI 提供了一系列强大的自然语言处理API。然而&#xff0c;集成这些 API 的过程复杂且耗时&#xff0c;通常需要大量精力和专业知识。为了简化集成过程&#xff0c;我们开发了 Open…

keepalived+haproxy 搭建高可用高负载高性能rabbitmq集群

一、环境准备 1. 我这里准备了三台centos7 虚拟机 主机名主机地址软件node-01192.168.157.133rabbitmq、erlang、haproxy、keepalivednode-02192.168.157.134rabbitmq、erlang、haproxy、keepalivednode-03192.168.157.135rabbitmq、erlang 2. 关闭三台机器的防火墙 # 关闭…

基于swing的火车站订票系统java jsp车票购票管理mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的火车站订票系统 系统有2权限&#xff1a;…

【广州华锐视点】VR技术带你身临其境体验地震逃生全过程

虚拟现实&#xff08;VR&#xff09;技术在模拟地震逃生体验方面具有重要的意义。地震是一种常见的自然灾害&#xff0c;对人类的生命和财产安全造成巨大威胁。通过利用VR技术&#xff0c;人们可以在安全的环境中亲身体验不同震级的地震情景&#xff0c;从而增加对地震的认识和…

编写Dockerfile制作Web应用系统nginx镜像,生成镜像nginx:v1.1,并推送其到私有仓库。

环境&#xff1a; CentOS 7 Linux 3.10.0-1160.el7.x86_64 具体要求如下&#xff1a; &#xff08;1&#xff09;基于centos基础镜像&#xff1b; &#xff08;2&#xff09;指定作者信息&#xff1b; &#xff08;3&#xff09;安装nginx服务&#xff0c;将提供的dest目录…

uview2.0自定义tabbar

tabbar组件 <template><u-tabbar :value"tab" change"changeTab" :fixed"true" :border"true" :placeholder"true":safeAreaInsetBottom"true"><u-tabbar-item text"消息" icon"c…

react-sortable-hoc 拖拽列表上oncick事件失效

const SortableItem SortableElement(({value, onChangePayment}) > {const onClickItem () > {// todo}return (<View className"-item" onClick{onClickItem}>xxxxxxx</View>) })问题&#xff1a;onClick 无效 解决&#xff1a;添加distance

Lazada上成功吸引消费者有哪些小妙招?

作为销售平台来说,其实网上可以搜索到,或者通过下载软件轻松就可以将APP下载了,然后接下来就是注册和开店去吸引消费者的过程了。对于现在比较火爆的Lazada来说,如果想要在上面成功吸引更多的消费者,需要有哪些优质的推广策略呢? 品牌效应很重要 其实Lazada首先走的就是品牌效…

PAT 1114 Family Property

个人学习记录&#xff0c;代码难免不尽人意 Sample Input: 10 6666 5551 5552 1 7777 1 100 1234 5678 9012 1 0002 2 300 8888 -1 -1 0 1 1000 2468 0001 0004 1 2222 1 500 7777 6666 -1 0 2 300 3721 -1 -1 1 2333 2 150 9012 -1 -1 3 1236 1235 1234 1 100 1235 5678 9012 …

文心问数Sugar Bot :大模型+BI,多轮会话自动生成可视化图表与数据结论

Sugar BI 的文心问数功能是基于大语言模型实现的&#xff0c;支持您使用自然语言&#xff0c;通过多轮会话的方式&#xff0c;获取实时数据的图表展现&#xff0c;也可以自动为您总结与图表相关的业务结论。 文心问数功能邀测中&#xff0c;欢迎CSDN的用户前来报名&#xff1a;…

SQL地址门牌排序,字典序转为数字序

页面有一批地址数据查询&#xff0c;结果字符排序默认是字典序的&#xff0c;所以造成了门牌3号在30号之前&#xff0c;影响用户体验&#xff1b; id, road_code, road_name, address_fullname, address_name 102 10086 人民一路 北江省南海市西湖区人民一路3号 3号 103 10086…

YOLO目标检测——小狗图像数据集下载分享

小狗图像数据集 小狗图像数据集是一种常用的用于研究和分析狗狗图像分类问题的数据集&#xff0c;它包含了大量不同品种和姿势的小狗图像样本&#xff0c;用于训练和评估狗狗图像分类算法的性能&#xff0c;共同540张图片&#xff0c;8个不同类别小狗。 数据集点击下载&#xf…

蜜蜂剪辑安装教程

安装蜜蜂剪辑&#xff1a; 1、首先&#xff0c;打开您的Windows电脑并浏览至蜜蜂剪辑的官方网站。 https://www.apowersoft.com.cn 2、点击“下载”按钮&#xff0c;在下载页面中选择您需要的版本&#xff0c;然后下载软件安装程序。 百度网盘&#xff1a; 链接&#xff1a;htt…

10个非常有用的Python库,你知道几个?

整理&#xff5c;TesterHome 这里给大家介绍10个不是最流行但非常有用的Python库&#xff0c;希望可以提供参考帮助。 PyO3 PyO3是一个Rust库&#xff0c;可以让你在Rust中编写Python模块。它可以利用 Rust 的速度和安全性编写高性能的 Python 模块。 https://github.com/PyO3…