java分布式缓存(java分布式缓存实现方案)

本篇文章给大家谈谈java分布式缓存,以及java分布式缓存实现方案对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

1、JAVA目前比较常用的缓存有哪些? 集中式缓存与分布式缓存有何区别? 它们应用场景是?2、如何用java 建立一个分布式系统3、java用户评论缓存在哪里4、Java本地缓存有哪些

JAVA目前比较常用的缓存有哪些? 集中式缓存与分布式缓存有何区别? 它们应用场景是?

java目前常用的缓存:

Generic

JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, etc)

EhCache 2.x

Hazelcast

Infinispan

Couchbase

Redis

Caffeine

Guava (deprecated)

Simple

建议使用spring boot集成方式,可插拔,简单。

集中式缓存适用场景:

1、服务器集群部署。

2、数据高一致性(任何数据变化都能及时的被查询到)

分布式缓存适用场景:

系统需要缓存的数据量大

对数据的可用性较高的情况

需要横向扩展,从而达到缓存的容量无限的要求

java分布式缓存(java分布式缓存实现方案)

如何用java 建立一个分布式系统

分布式架构的演进

系统架构演化历程-初始阶段架构

初始阶段 的小型系统 应用程序、数据库、文件等所有的资源都在一台服务器上通俗称为LAMP

特征:

应用程序、数据库、文件等所有的资源都在一台服务器上。

描述:

通常服务器操作系统使用Linux,应用程序使用PHP开发,然后部署在Apache上,数据库使用MySQL,汇集各种免费开源软件以及一台廉价服务器就可以开始系统的发展之路了。

系统架构演化历程-应用服务和数据服务分离

好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台webserver

特征:

应用程序、数据库、文件分别部署在独立的资源上。

描述:

数据量增加,单台服务器性能及存储空间不足,需要将应用和数据分离,并发处理能力和数据存储空间得到了很大改善。

系统架构演化历程-使用缓存改善性能

特征:

数据库中访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力。

描述:

系统访问特点遵循二八定律,即80%的业务访问集中在20%的数据上。

缓存分为本地缓存和远程分布式缓存,本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况。

系统架构演化历程-使用应用服务器集群

在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了,突然有一天,发现系统的访问又开始有变慢的趋势了,这个时候首先查看数据库,压力一切正常,之后查看webserver,发现apache阻塞了很多的请求,而应用服务器对每个请求也是比较快的,看来 是请求数太高导致需要排队等待,响应速度变慢

特征:

多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。

描述:

使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。

系统架构演化历程-数据库读写分离

享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈,导致了系统变慢

特征:

多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。

描述:

使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,使得服务器的负载压力不在成为整个系统的瓶颈。

系统架构演化历程-反向代理和CDN加速

特征:

采用CDN和反向代理加快系统的 访问速度。

描述:

为了应付复杂的网络环境和不同地区用户的访问,通过CDN和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN与反向代理的基本原理都是缓存。

系统架构演化历程-分布式文件系统和分布式数据库

随着系统的不断运行,数据量开始大幅度增长,这个时候发现分库后查询仍然会有些慢,于是按照分库的思想开始做分表的工作

特征:

数据库采用分布式数据库,文件系统采用分布式文件系统。

描述:

任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。

分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。

系统架构演化历程-使用NoSQL和搜索引擎

特征:

系统引入NoSQL数据库及搜索引擎。

描述:

随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如NoSQL和分数据库查询技术如搜索引擎。应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。

系统架构演化历程-业务拆分

特征:

系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。

描述:

为了应对日益复杂的业务场景,通常使用分而治之的手段将整个系统业务分成不同的产品线,应用之间通过超链接建立关系,也可以通过消息队列进行数据分发,当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。

纵向拆分:

将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统

纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。

横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务

横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。

系统架构演化历程-分布式服务

特征:

公共的应用模块被提取出来,部署在分布式服务器上供应用服务器调用。

描述:

随着业务越拆越小,应用系统整体复杂程度呈指数级上升,由于所有应用要和所有数据库系统连接,最终导致数据库连接资源不足,拒绝服务。

Q:分布式服务应用会面临哪些问题?

A:

(1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

(2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

(3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

(4) 服务多了,沟通成本也开始上升,调某个服务失败该找谁?服务的参数都有什么约定?

(5) 一个服务有多个业务消费者,如何确保服务质量?

(6) 随着服务的不停升级,总有些意想不到的事发生,比如cache写错了导致内存溢出,故障不可避免,每次核心服务一挂,影响一大片,人心慌慌,如何控制故障的影响面?服务是否可以功能降级?或者资源劣化?

Java分布式应用技术基础

分布式服务下的关键技术:消息队列架构

消息对列通过消息对象分解系统耦合性,不同子系统处理同一个消息

分布式服务下的关键技术:消息队列原理

分布式服务下的关键技术:服务框架架构

服务框架通过接口分解系统耦合性,不同子系统通过相同的接口描述进行服务启用

服务框架是一个点对点模型

服务框架面向同构系统

适合:移动应用、互联网应用、外部系统

分布式服务下的关键技术:服务框架原理

分布式服务下的关键技术:服务总线架构

服务总线同服务框架一样,均是通过接口分解系统耦合性,不同子系统通过相同的接口描述进行服务启用

服务总线是一个总线式的模型

服务总线面向同构、异构系统

适合:内部系统

分布式服务下的关键技术:服务总线原理

分布式架构下系统间交互的5种通信模式

request/response模式(同步模式):客户端发起请求一直阻塞到服务端返回请求为止。

Callback(异步模式):客户端发送一个RPC请求给服务器,服务端处理后再发送一个消息给消息发送端提供的callback端点,此类情况非常合适以下场景:A组件发送RPC请求给B,B处理完成后,需要通知A组件做后续处理。

Future模式:客户端发送完请求后,继续做自己的事情,返回一个包含消息结果的Future对象。客户端需要使用返回结果时,使用Future对象的.get(),如果此时没有结果返回的话,会一直阻塞到有结果返回为止。

Oneway模式:客户端调用完继续执行,不管接收端是否成功。

Reliable模式:为保证通信可靠,将借助于消息中心来实现消息的可靠送达,请求将做持久化存储,在接收方在线时做送达,并由消息中心保证异常重试。

五种通信模式的实现方式-同步点对点服务模式

五种通信模式的实现方式-异步点对点消息模式1

五种通信模式的实现方式-异步点对点消息模式2

五种通信模式的实现方式-异步广播消息模式

分布式架构下的服务治理

服务治理是服务框架/服务总线的核心功能。所谓服务治理,是指服务的提供方和消费方达成一致的约定,保证服务的高质量。服务治理功能可以解决将某些特定流量引入某一批机器,以及限制某些非法消费者的恶意访问,并在提供者处理量达到一定程度是,拒绝接受新的访问。

基于服务框架Dubbo的服务治理-服务管理

可以知道你的系统,对外提供了多少服务,可以对服务进行升级、降级、停用、权重调整等操作

可以知道你提供的服务,谁在使用,因业务需求,可以对该消费者实施屏蔽、停用等操作

基于服务框架Dubbo的服务治理-服务监控

可以统计服务的每秒请求数、平均响应时间、调用量、峰值时间等,作为服务集群规划、性能调优的参考指标。

基于服务框架Dubbo的服务治理-服务路由

基于服务框架Dubbo的服务治理-服务保护

基于服务总线OSB的服务治理-功能介绍

基于服务总线OSB的服务治理

Q:Dubbo到底是神马?

A:

淘宝开源的高性能和透明化的RPC远程调用服务框架

SOA服务治理方案

Q:Dubbo原理是?

A:

-结束-

java用户评论缓存在哪里

在java应用中,对于访问频率比较高,又不怎么变化的数据,常用的解决方案是把这些数据加入缓存。相比DB,缓存的读取效率快好不少。java应用缓存一般分两种,一是进程内缓存,就是使用java应用虚拟机内存的缓存;另一个是进程外缓存,现在我们常用的各种分布式缓存。相比较而言,进程内缓存比进程外缓存快很多,而且编码也简单;但是,进程内缓存的存储量有限,使用的是java应用虚拟机的内存,而且每个应用都要存储一份,有一定的资源浪费。进程外缓存相比进程内缓存,会慢些,但是,存储空间可以横向扩展,不受限制。

这里是几中场景的访问时间

——————————————————————-

|         从数据库中读取一条数据(有索引)        |  十几毫秒  |

|         从远程分布式缓存读取一条数据              |  0.5毫秒    |

|         从内存中读取1MB数据                         |  十几微妙  |

——————————————————————-

进程内缓存和进程外缓存,各有优缺点,针对不同场景,可以分别采用不同的缓存方案。对于数据量不大的,我们可以采用进程内缓存。或者只要内存足够富裕,都可以采用,但是不要盲目以为自己富裕,不然可能会导致系统内存不够。

下面要分享的是一个代码级别的,对进程内缓存的经验总结。面向jdk1.8版本。

在有效时间内缓存单个对象

public class LiveCacheT {    // 缓存时间

private final int cacheMillis;    // 缓存对象

private final T element;    // 缓存对象创建时间

private final long createTime;

public LiveCache(int cacheMillis, T element) {        this.cacheMillis = cacheMillis;        this.element = element;        this.createTime = System.currentTimeMillis();

}

// 获取缓存对象

public T getElement() {        long currentTime = System.currentTimeMillis();        if(cacheMillis 0 currentTime – createTime cacheMillis) {            return null;

} else {            return element;

}

}

// 获取缓存对象,忽略缓存时间有效性

public T getElementIfNecessary() {        return element;

}

}

public static void main(String[] args) {    int cacheMilis = 1000 ;

LiveCacheObject liveCache = new LiveCache(cacheMilis, new Object()) ;

liveCache.getElement() ;

liveCache.getElementIfNecessary() ;

}

有效时间内,缓存单个对象,可异步刷新

@FunctionalInterfacepublic interface LiveFetchT {    // 刷新缓存接口    T fetch() ;

}

public class LiveManagerT {    // 缓存时间

private int cacheMillis;    // 缓存对象

private LiveCacheT liveCache;    // 刷新缓存的对象

private LiveFetchT liveFetch ;

private Logger logger = LoggerFactory.getLogger(LiveManager.class) ;

// 刷新缓存开关

private boolean refresh = false ;

public LiveManager(int cacheMillis, LiveFetchT liveFetch) {        this.cacheMillis = cacheMillis ;        this.liveFetch = liveFetch ;

}

/**

* fetch cache ; if cache expired , synchronous fetch

* @return

*/

public T getCache() {

initLiveCache();

if(liveCache != null) {

T t  ;            if((t= liveCache.getElement()) != null) {                return t ;

} else {

t = liveFetch.fetch() ;                if(t != null) {

liveCache = new LiveCacheT(cacheMillis, t) ;                    return t ;

}

}

}

return null ;

}

/**

* fetch cache ; if cache expired , return old cache and asynchronous fetch

* @return

*/

public T getCacheIfNecessary() {

initLiveCache();

if(liveCache != null) {

T t  ;            if((t= liveCache.getElement()) != null) {                return t ;

} else {

refreshCache() ;                return liveCache.getElementIfNecessary() ;

}

}

return null ;

}

/**

* init liveCache     */

private void initLiveCache() {        if(liveCache == null) {

T t = liveFetch.fetch() ;            if(t != null) {

liveCache = new LiveCacheT(cacheMillis, t) ;

}

}

}

/**

* asynchronous refresh cache     */

private void refreshCache() {

if(refresh)            return ;

refresh = true ;        try {

Thread thread = new Thread(() – {                try {

T t = liveFetch.fetch();                    if (t != null) {

liveCache = new LiveCache(cacheMillis, t);

}

} catch (Exception e){

logger.error(“LiveManager.refreshCache thread error.”, e);

} finally {

refresh = false ;

}

}) ;

thread.start();

} catch (Exception e) {

logger.error(“LiveManager.refreshCache error.”, e);

}

}

}

public class Test {

public static void main(String[] args) {        int cacheMilis = 1000 ;

LiveManagerObject liveManager = new LiveManager(cacheMilis,() – new Test().t1()) ;

liveManager.getCache() ;

liveManager.getCacheIfNecessary() ;

}

public Object t1(){

return new Object() ;

}

}

Java本地缓存有哪些

下面给你介绍几个常见的java缓存框架:

1、OSCache

OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。

OSCache有以下特点:

缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。

拥有全面的API–OSCache API给你全面的程序来控制所有的OSCache特性。

永久缓存–缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。

支持集群–集群缓存数据能被单个的进行参数配置,不需要修改代码。

缓存记录的过期–你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。

2、Java Caching System

JSC(Java Caching System)是一个用分布式的缓存系统,是基于服务器的java应用程序。它是通过提供管理各种动态缓存数据来加速动态web应用。

JCS和其他缓存系统一样,也是一个用于高速读取,低速写入的应用程序。

动态内容和报表系统能够获得更好的性能。

如果一个网站,有重复的网站结构,使用间歇性更新方式的数据库(而不是连续不断的更新数据库),被重复搜索出相同结果的,就能够通过执行缓存方式改进其性能和伸缩性。

3、EHCache

EHCache 是一个纯java的在进程中的缓存,它具有以下特性:快速,简单,为Hibernate2.1充当可插入的缓存,最小的依赖性,全面的文档和测试。

4、JCache

JCache是个开源程序,正在努力成为JSR-107开源规范,JSR-107规范已经很多年没改变了。这个版本仍然是构建在最初的功能定义上。

5、ShiftOne

ShiftOne Java Object Cache是一个执行一系列严格的对象缓存策略的Java lib,就像一个轻量级的配置缓存工作状态的框架。

6、SwarmCache

SwarmCache是一个简单且有效的分布式缓存,它使用IP multicast与同一个局域网的其他主机进行通讯,是特别为集群和数据驱动web应用程序而设计的。SwarmCache能够让典型的读操作大大超过写操作的这类应用提供更好的性能支持。

SwarmCache使用JavaGroups来管理从属关系和分布式缓存的通讯。

java分布式缓存的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java分布式缓存实现方案、java分布式缓存的信息别忘了在本站进行查找喔。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月2日 15:27:31
下一篇 2024年4月2日 15:37:50

相关推荐

  • javaredis分布式锁,redis分布式锁java代码

    redis分布式锁如何实现 我们需要封装一个公共的Redis访问工具类。该类需要注入RedisTemplate实例和ValueOperations实例,使用ValueOperations实例是因为Redis实现的分布式锁使用了最简单的String类型。 如果想要实现可重入的分布式锁的话,需要在设置value的时候加上线程信息和加锁次数的信息。但是这是简单的思…

    2024年5月18日
    3500
  • java实现缓存,java自己实现缓存

    java怎么把变量放到缓存中 cache=请求数据库操作 } key你自己加,String还是int都行,value是你数据库的结构,可以写个实体。获取的时候直接cache.get(key)就可以了。java如何从数据库读取数据并写入txt文件:将数据查询出来放在list中,然后写入文件。 在内存中的数据有两块,第缓冲,一般写数据到磁盘的时候开辟出来的内存空…

    2024年5月18日
    4000
  • java分布式公共代码,java 分布式编程

    JAVA入门教程什么好? 《Java编程思想》在有了一定的Java编程经验之后,你需要“知其所以然”了。 学习web开发:学习全面的web开发知识,比如Servlet JSP、javaBean、TagLib等。学习开源框架:学习较为流行和实用的开源框架,比如:Struts、Spring、Webwork等。 Java编程语言,即语法。Java文件格式,即各种文…

    2024年5月18日
    3000
  • java双缓存,java双缓存技术

    java实现缓存技术(java缓存机制) 1、TreeCache/JBossCache JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能。缓存数据被自动复制,让你轻松进行JBoss服务器之间的集群工作。 2、Cache是一个像 Map 一样的数据结构,它允许基于 Key 的临时储存。缓存被单个CacheManager拥…

    2024年5月18日
    3600
  • 网络安全拓展知识培训方案,网络安全拓展知识培训方案范文

    学校网络安全教育活动策划方案 通过举办展览、论坛知识竞赛等多种形式,以及报刊、电视台、网站等传播渠道,发动全民广泛参与网络安全宣传教育活动,普及网络安全知识,加强个人信息保护,提升社会网络安全意识和防护技能。 学校网络安全教育主题活动方案1 20__年11月24日至30日是首届国家网络信息安全宣传周。 学校网络安全教育活动策划方案1 活动主题: 网络安全为人…

    2024年5月17日
    3500
  • 关于javascript缓存机制的信息

    如何解决Ajax请求结果的缓存问题说明 1、在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“If-Modified-Since”,”0″)。在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“Cache-Control”,”no-cache”)。 2、bug分析:通过对开发同学的沟通,我发现…

    2024年5月16日
    3400
  • linux做差异备份,linux备份方案

    linux异地备份命令 1、接下来就是一个见的文件拷贝命令。rsync -avz /usr/local/nginx /usr/local/tomcat /mnt/backserver/09back 就把文件备份到19160.18:root/work/backup目录下了。 2、只要在这个备份脚本下增加一个异地传输功能即可。假定异地服务器建立一个Ftp服务器。…

    2024年5月16日
    4500
  • linux分区方案,linux分区方案 300g

    Linux中如何创建新分区啊? 在 Linux 下,分区一般通过 fdisk 或 gdisk 这样的工具来完成。对于 1TB 的硬盘,一般通过分成多个不同的逻辑分区来完成。 创建新的分区在分区模式下,可以使用“n”命令来创建新的分区。根据提示,输入分区大小、分区类型、分区位置等信息。根据需要,可以创建多个分区。 首先,找出你要使用的磁盘。在终端输入 lsbl…

    2024年5月15日
    2900
  • c语言人民币兑换,c语言人民币兑换方案

    C语言编写程序:要将1元人民币换1角,2角,5角的零钱,有几种换法? 1、int rmb=1000;int sum=0;for(i=1;i++){ for(j=1;j++){ for(k=1;k++){ if((i+2*j+5*k)==1000)sum++;} } } printf(%d,sum);} 输入在一行中给出待换的零钱数额x∈(8,100)。 2、…

    2024年5月14日
    3900
  • 信息网络安全知识培训方案,信息网络安全知识培训方案怎么写

    网络安全培训的内容 1、网络安全培训的内容有很多,并不是固定的,常规的一般包括网络及系统安全、Web安全、渗透测试和安全服务四部分。 2、网络安全实用技术的基本知识;网络安全体系结构、无线网及虚拟专用网安全管理、IPv6安全性;网络安全的规划、测评与规范、法律法规、体系与策略、管理原则与制度;黑客的攻防与入侵检测;身份认证与访问控制;密码与加密管理。 3、网…

    2024年5月14日
    4300

发表回复

登录后才能评论



关注微信