位置: IT常识 - 正文

Java实现本地缓存、分布式缓存及多级缓存(java本地缓存框架有哪些)

编辑:rootadmin
Java实现本地缓存、分布式缓存及多级缓存

推荐整理分享Java实现本地缓存、分布式缓存及多级缓存(java本地缓存框架有哪些),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java本地缓存工具,java本地缓存有哪些,java如何使用缓存,java如何使用缓存,java如何使用缓存,java本地缓存框架有哪些,java实现本地缓存,java实现本地缓存,内容如对您有帮助,希望把文章链接给更多的朋友!

以下均为自己参考其它博主文章或自己理解整理而成,如有错误之处,欢迎在评论区批评指正!

0. 缓存简介

       像MySql等传统的关系型数据库已经不能适用于所有的业务场景,比如电商系统的秒杀场景,APP首页的访问流量高峰场景,很容易造成关系型数据库的瘫痪,随着缓存技术的出现很好的解决了这个问题。

0.1 什么是缓存?

       就是把访问量较高的热点数据从传统的关系型数据库中加载到内存中,当用户再次访问热点数据时是从内存中加载,减少了对数据库的访问量,解决了高并发场景下容易造成数据库宕机的问题。

0.2 为什么要用缓存?

       针对于这个问题要从两个方面去考虑,一个是应用系统的高并发场景,另一个就是应用系统的高性能情况。

0.2.1 高性能情况

       用户第一次访问数据时,缓存中没有数据,要从数据库中获取数据,因为是从磁盘中拿数据,读取数据的过程比较慢。拿到数据后将数据存储在缓存中,用户第二次访问数据时,可以从缓存中直接获取,因为缓存是直接操作内存的,访问数据速度比较快。

0.2.2 高并发场景

       操作缓存能够承受的并发访问量是远远大于访问数据库的,比如redis,它的读的速度是110000次/s,写的速度是81000次/s。所以说将数据库中访问量高的数据存储到缓存中,用户请求的时候直接访问数据库,不必访问数据库,提高应用程序的并发量。

0.3 缓存分类

缓存基本上分为三类:本地缓存、分布式缓存、多级缓存。

       根据缓存和应用程序是否属于同一个进程,将缓存分为本地缓存和分布式缓存。基于本地缓存和分布式缓存都有各自的优点和缺点,后面又出现了多级缓存的概念。

0.3.1 本地缓存

本地缓存:是指和应用程序在同一个进程内的内存空间去存储数据,数据的读写都是在同一个进程内完成的。

优点:读取速度快,但是不能进行大数据量存储。

       本地缓存不需要远程网络请求去操作内存空间,没有额外的性能消耗,所以读取速度快。但是由于本地缓存占用了应用进程的内存空间,比如java进程的jvm内存空间,故不能进行大数据量存储。

缺点:

应用程序集群部署时,会存在数据更新问题(数据更新不一致)

       本地缓存一般只能被同一个应用进程的程序访问,不能被其他应用程序进程访问。在单体应用集群部署时,如果数据库有数据需要更新,就要同步更新不同服务器节点上的本地缓存的数据来保证数据的一致性,但是这种操作的复杂度高,容易出错。可以基于redis的发布/订阅机制来实现各个部署节点的数据同步更新。

数据会随着应用程序的重启而丢失

       因为本地缓存的数据是存储在应用进程的内存空间的,所以当应用进程重启时,本地缓存的数据会丢失。

实现:

缓存存储的数据一般都是key-value键值对的数据结构,在java语言中,常用的字典实现包括 HashMap 和 ConcurretHashMap。

除了上面说的实现方式以外,也可以用Guava、Ehcache以及Caffeine等封装好的工具包来实现本地缓存。

0.3.2 分布式缓存

分布式缓存:分布式缓存是独立部署的服务进程,并且和应用程序没有部署在同一台服务器上,所以是需要通过远程网络请求来完成分布式缓存的读写操作,并且分布式缓存主要应用在应用程序集群部署的环境下。

优点:

支持大数据量存储

       分布式缓存是独立部署的进程,拥有自身独自的内存空间,不需要占用应用程序进程的内存空间,并且还支持横向扩展的集群方式部署,所以可以进行大数据量存储。

数据不会随着应用程序重启而丢失

       分布式缓存和本地缓存不同,拥有自身独立的内存空间,不会受到应用程序进程重启的影响,在应用程序重启时,分布式缓存的存储数据仍然存在。

数据集中存储,保证数据的一致性

       当应用程序采用集群方式部署时,集群的每个部署节点都有一个统一的分布式缓存进行数据的读写操作,所以不会存在像本地缓存中数据更新问题,保证了不同服务器节点的数据一致性。

数据读写分离,高性能,高可用

       分布式缓存一般支持数据副本机制,实现读写分离,可以解决高并发场景中的数据读写性能问题。而且在多个缓存节点冗余存储数据,提高了缓存数据的可用性,避免某个缓存节点宕机导致数据不可用问题。

缺点:

数据跨网络传输,读写性能不如本地缓存

       分布式缓存是一个独立的服务进程,并且和应用程序进程不在同一台机器上,所以数据的读写要通过远程网络请求,这样相对于本地缓存的数据读写,性能要低一些。

分布式缓存的实现:典型实现包括 MemCached 和 Redis。

0.3.3 多级缓存

       基于本地缓存和分布式缓存的优缺点,多级缓存应运而生,在实际的业务开发中一般也是采用多级缓存。注意:本地缓存一般存储更新频率低,访问频率高数据,分布式缓存一般存储更新频率很高的数据。

Java实现本地缓存、分布式缓存及多级缓存(java本地缓存框架有哪些)

       多级缓存的请求流程:本地缓存作为一级缓存,分布式缓存作为二级缓存。当用户获取数据时,先从一级缓存中获取数据,如果一级缓存有数据则返回数据,否则从二级缓存中获取数据。如果二级缓存中有数据则更新一级缓存,然后将数据返回客户端。如果二级缓存没有数据则去数据库查询数据,然后更新二级缓存,接着再更新一级缓存,最后将数据返回给客户端。

多级缓存的实现:可以使用Guava或者Caffeine作为一级缓存,Redis作为二级缓存。

       注意:在应用程序集群部署时,如果数据库的数据有更新的情况,一级缓存的数据更新容易出现数据不一致的情况。因为是集群部署,多个部署节点实现一级缓存数据更新难度比较大,不过我们可以通过Redis的消息发布/订阅机制来实现多个节点缓存数据一致性问题。

1. 本地缓存详细介绍及具体实现1.1 介绍

参考链接:本地缓存:为什么要用本地缓存?用它会有什么问题?_Gimtom的博客-CSDN博客_本地缓存

       对于缓存的作用不言而喻,可以提高查询效率,比去数据库查询的速度要快。项目中我们经常会使用Nosql数据库,如Redis等做缓存。但是对于数据量很小的,访问非常频繁的,我们也可以存在本地缓存中。

       在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或Memcached 这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在提升访问速度的同时,也能降低数据库的压力。

       随着不断的发展,这一架构也产生了改进,在一些场景下可能单纯使用Redis类的远程缓存已经不够了,还需要进一步配合本地缓存使用,例如Guava cache或Caffeine,从而再次提升程序的响应速度与服务性能。于是,就产生了使用本地缓存作为一级缓存,再加上远程缓存作为二级缓存的两级缓存架构。

       在先不考虑并发等复杂问题的情况下,两级缓存的访问流程可以用下面这张图来表示:

本地缓存:在客户端本地的物理内存中划出一部分空间来缓存客户端回写到服务器的数据,当本地回写缓存达到缓存阈值时,将数据写入到服务器中。

特点:

本地缓存是基于本地环境的内存,访问速度非常快,对于一些变更频率低、实时性要求低的数据,可以放在本地缓存中,提升访问速度。

使用本地缓存能够减少和Redis类的远程缓存间的数据交互,减少网络I/O开销,降低这一过程中在网络通信上的耗时。

本地回写缓存功能可以在很大程度上降低服务器读写能力和网络负载,一般将本地缓存作为一级缓存,远程缓存作为二级缓存。

本地缓存应该具有的功能:

超过最大限制有对应淘汰策略,如LRU、LFU

过期时间淘汰,如定时、懒式、定期;

持久化

统计监控

1.2 本地缓存方案选型1.2.1 使用ConcurrentHashMap实现本地缓存

       缓存的本质就是存储在内存中的KV数据结构,对应的就是jdk中线程安全的ConcurrentHashMap,但是要实现缓存,还需要考虑淘汰、最大限制、缓存过期时间淘汰等等功能。

优点:实现简单,不需要引入第三方包,比较适合一些简单的业务场景。缺点是如果需要更多的特性,需要定制化开发,成本会比较高,并且稳定性和可靠性也难以保障。对于比较复杂的场景,建议使用比较稳定的开源工具。

1.2.2 基于Guava Cache实现本地缓存

       Guava是Google团队开源的一款 Java 核心增强库,包含集合、并发原语、缓存、IO、反射等工具箱,性能和稳定性上都有保障,应用十分广泛。Guava Cache支持很多特性:

支持最大容量限制

支持两种过期删除策略(插入时间和访问时间)

支持简单的统计功能

基于LRU算法实现

引入依赖如下:

  <dependency>    <groupId>com.google.guava</groupId>    <artifactId>guava</artifactId>    <version>31.1-jre</version> </dependency>

测试代码:

 @Slf4j public class GuavaCacheTest {    public static void main(String[] args) throws ExecutionException {        Cache<String, String> cache = CacheBuilder.newBuilder()                .initialCapacity(5) // 初始容量                .maximumSize(10)     // 最大缓存数,超出淘汰                .expireAfterWrite(60, TimeUnit.SECONDS) // 过期时间                .build(); ​        String orderId = String.valueOf(123456789);        // 获取orderInfo,如果key不存在,callable中调用getInfo方法返回数据        String orderInfo = cache.get(orderId, () -> getInfo(orderId));        log.info("orderInfo = {}", orderInfo); ​    } ​    private static String getInfo(String orderId) {        String info = "";        // 先查询redis缓存        log.info("get data from redis"); ​        // 当redis缓存不存在查db        log.info("get data from mysql");        info = String.format("{orderId=%s}", orderId);        return info;    } }1.2.3 基于Caffeine实现本地缓存

       Caffeine是基于java8实现的新一代缓存工具,缓存性能接近理论最优,可以看作是Guava Cache的增强版,功能上两者类似,不同的是Caffeine采用了一种结合LRU、LFU优点的算法:W-TinyLFU,在性能上有明显的优越性。

引入依赖如下:

 <dependency>    <groupId>com.github.ben-manes.caffeine</groupId>    <artifactId>caffeine</artifactId>    <version>2.9.3</version> </dependency>

测试代码如下:

 @Slf4j public class CaffeineTest {    public static void main(String[] args) {        Cache<String, String> cache = Caffeine.newBuilder()                .initialCapacity(5)                // 超出时淘汰                .maximumSize(10)                //设置写缓存后n秒钟过期                .expireAfterWrite(60, TimeUnit.SECONDS)                //设置读写缓存后n秒钟过期,实际很少用到,类似于expireAfterWrite                //.expireAfterAccess(17, TimeUnit.SECONDS)                .build(); ​        String orderId = String.valueOf(123456789);        String orderInfo = cache.get(orderId, key -> getInfo(key));        System.out.println(orderInfo);    } ​    private static String getInfo(String orderId) {        String info = "";        // 先查询redis缓存        log.info("get data from redis"); ​        // 当redis缓存不存在查db        log.info("get data from mysql");        info = String.format("{orderId=%s}", orderId);        return info;    } }1.2.4 基于Encache实现本地缓存

       Encache是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。同Caffeine和Guava Cache相比,Encache的功能更加丰富,扩展性更强。

优点:

支持多种缓存淘汰算法,包括LRU、LFU和FIFO

缓存支持堆内存储、堆外存储、磁盘存储(支持持久化)三种

支持多种集群方案,解决数据共享问题

引入依赖如下:

  <dependency>    <groupId>org.ehcache</groupId>    <artifactId>ehcache</artifactId>    <version>3.9.7</version> </dependency>

测试代码如下:

 @Slf4j public class EhcacheTest {    private static final String ORDER_CACHE = "orderCache";    public static void main(String[] args) {        CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()                // 创建cache实例                .withCache(ORDER_CACHE, CacheConfigurationBuilder                        //
本文链接地址:https://www.jiuchutong.com/zhishi/293046.html 转载请保留说明!

上一篇:一只停在树枝上的仓鸮 (© blickwinkel/Alamy)(树枝上停着一只什么小鸟)

下一篇:蒙特城堡,意大利普利亚大区 (© Toni Spagone/Alamy)(蒙特城堡干红葡萄酒价格)

  • javascript function(javascript function 对象)

    javascript function(javascript function 对象)

  • 小米手环6怎么换自定义壁纸(小米手环6怎么调时间)

    小米手环6怎么换自定义壁纸(小米手环6怎么调时间)

  • 华为手机可以免费贴膜吗(华为手机可以免费领手机壳吗)

    华为手机可以免费贴膜吗(华为手机可以免费领手机壳吗)

  • 随申办的小红点如何消除(随申办的小红点的消息在哪里点)

    随申办的小红点如何消除(随申办的小红点的消息在哪里点)

  • OPPOFind X3屏幕尺寸是多大(oppo find x3 屏幕参数)

    OPPOFind X3屏幕尺寸是多大(oppo find x3 屏幕参数)

  • 华为手机没有声音是什么原因(华为手机没有声音显示耳机模式怎么办)

    华为手机没有声音是什么原因(华为手机没有声音显示耳机模式怎么办)

  • 小米8屏幕闪烁(小米8屏幕闪烁频率)

    小米8屏幕闪烁(小米8屏幕闪烁频率)

  • 全家福要怎么扫(全家福怎么容易扫出来)

    全家福要怎么扫(全家福怎么容易扫出来)

  • 为什么在淘宝买东西别人会知道(为什么淘宝买的东西质量不好)

    为什么在淘宝买东西别人会知道(为什么淘宝买的东西质量不好)

  • 腾讯vip可以几个人一起使用(腾讯vip可以几个电视用)

    腾讯vip可以几个人一起使用(腾讯vip可以几个电视用)

  • 光猫可以直接连接智能电视吗(光猫可以直接连接摄像头吗)

    光猫可以直接连接智能电视吗(光猫可以直接连接摄像头吗)

  • m2和sata固态不能共用(m2和sata3固态冲突)

    m2和sata固态不能共用(m2和sata3固态冲突)

  • 华为手机怎么把两张照片合在一起(华为手机怎么把试卷答案去掉)

    华为手机怎么把两张照片合在一起(华为手机怎么把试卷答案去掉)

  • ps怎么羽化人物边缘(ps羽化人物边缘怎么用)

    ps怎么羽化人物边缘(ps羽化人物边缘怎么用)

  • ps怎么设置压感(ps在哪调压感)

    ps怎么设置压感(ps在哪调压感)

  • 淘宝津贴在哪里领(淘宝津贴是什么意思?)

    淘宝津贴在哪里领(淘宝津贴是什么意思?)

  • oppo手机关机怎么关(oppo手机关机了怎么找到手机)

    oppo手机关机怎么关(oppo手机关机了怎么找到手机)

  • oppoa5特殊功能(oppoa5特殊功能介绍)

    oppoa5特殊功能(oppoa5特殊功能介绍)

  • 极速表格2017怎样制表(极速表格2017教程)

    极速表格2017怎样制表(极速表格2017教程)

  • Linux系统中怎么安装和使用ImageMagick软件?(Linux系统中怎么定位到java代码的方法级)

    Linux系统中怎么安装和使用ImageMagick软件?(Linux系统中怎么定位到java代码的方法级)

  • hkwnd.exe是什么进程 作用是什么 hkwnd进程查询(zhp.exe是什么进程)

    hkwnd.exe是什么进程 作用是什么 hkwnd进程查询(zhp.exe是什么进程)

  • 前端LayUI框架快速上手详解(一)(前端框架源码)

    前端LayUI框架快速上手详解(一)(前端框架源码)

  • 叶面积指数(LAI)介绍以及遥感估算方法(叶面积指数名词解释)

    叶面积指数(LAI)介绍以及遥感估算方法(叶面积指数名词解释)

  • 税收优惠属于政策吗
  • 原材料的采购成本包括运费吗
  • 进料加工为什么要差额确认收入呢
  • 企业持股分红
  • 不能抵扣进项税额的发票类型
  • 可变现净值与公允价值孰低
  • 事业单位人员租房有补助吗
  • 网络公司可以开展什么业务
  • 财务人士必知消防知识
  • 无形资产根据什么填列资产负债表
  • 预提土地使用税的分录
  • 如何加强存货管理内部控制
  • 购买未完工的厂房会计分录
  • 每股收益的无差别点小于息税前利润选择什么筹资方式
  • 营改增后挂靠开票作收入吗?
  • 收到多开发票已认证怎么做账?
  • 企业当年度增值税税率
  • 以前年度利润和当年净利润
  • 个人接受捐赠要开发票吗
  • 企业研发人员数量在哪里查
  • 内账增值税会计核算
  • Windows11怎么连接网络
  • 项目工程会计账务处理
  • adb是什么程序
  • 筹建期间费用计入什么
  • 个税手续费会计分录
  • wlan和蜂窝版的区别
  • php实用的案例
  • 蝴蝶兰的养殖方法和注意事项 盆栽蝴蝶兰烂根
  • 出口退税会计分录怎么做没退到税全部减免抵
  • 新税法减免项目
  • php批量更新数据库
  • 存货的原材料分析
  • php实现文件的下载
  • monolog php
  • 政策性搬迁补偿收入
  • 提取备用金记账凭证图片
  • 会计等式反映了六大会计要素的恒等关系
  • addr指令
  • php+flash+jQuery多图片上传源码分享
  • 命令启动服务管理
  • 累计折旧累计摊销属于现金流吗
  • 研发专利什么意思
  • 装修费摊销的分录是什么
  • 预付账款的适用范围
  • 银行回单应该如何处理
  • file file=new file()的作用
  • 高速公路费如何查询
  • 银行承兑汇票是什么意思
  • 长期待摊费用好处
  • 应付账款的余额表示什么
  • 固定资产折旧的会计科目
  • 押金为什么要一个月才退
  • 非限定性净资产是什么意思
  • 销项税额是负数怎么做账
  • 负数发票要给税务局吗
  • 确认医院体检收费怎么办
  • linux系统配置命令
  • linux中安装jdk1.8
  • win7记事本功能
  • win7系统关闭自动休眠
  • linux查看开机运行时间
  • linux查看hz
  • 校园网升级套餐
  • edit apps
  • unity3d颜色
  • jquery easyui 教程
  • 设计一个windows
  • javascript 日期
  • unity控制组件开关
  • jquery返回顶部
  • ListView.setOnItemClickListener不起作用的原因
  • Embedded statement cannot be a declaration or labeled statement
  • javascript要学哪些
  • jquery中validate
  • 小规模纳税人季报网上申报流程
  • 广西税务12366如何交社保
  • 马来西亚进口货物的标签要求
  • 为什么要进行进气歧管真空度检测
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设