「java本地缓存同步」java实现本地缓存
本篇文章给大家谈谈java本地缓存同步,以及java实现本地缓存对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、为什么redis在java是同步缓存,而在nodejs是异步缓存
- 2、转载 如何安全的更新java本地缓存
- 3、Java本地缓存有哪些
- 4、redis怎么与mysql同步java代码
- 5、Spring本地缓存的使用方法
- 6、如何安全的更新java本地缓存
为什么redis在java是同步缓存,而在nodejs是异步缓存
在java下可以使用 :
String value = redis.get(key);
是同步的
但在nodejs 下使用:
```javascript
var value ;
var isConnection = client.get(key,function(err,repy){
value = repy;
client.quit(); //调用了quit之后isConnection就是false了,这个get方法应该是返回连接状态吧?
});
client.get直接返回的结果是!client.shou_buffer。而且对于异步操作的js,这个值肯定是它向redis发送请求之前就被返回了的。
转载 如何安全的更新java本地缓存
但使用缓存,不可避免的就需要对缓存进行更新。最近在做一个项目的时候,发现多个老系统里采用了一种不安全的更新方案,该方案的主要思路如下:Java代码 /** 本地缓存 */ private List configs = null; /** 本地缓存的上次更新时间 */ private long lastUpdateTime = 0; public List queryInterfaceList() { long currentTime = System.currentTimeMillis(); //判断本次缓存是否过期,过期则重新调用webservice查询数据,并更新缓存 if (currentTime - lastUpdateTime 60000) { InterfaceManageResult result = interfaceManageFacade.queryAllInterfaceList(); if (null != result result.isSuccess()) { configs = result.getInterfaceConfigList(); } lastUpdateTime = currentTime; } if (!CollectionUtils.isEmpty(configs)) { return configs; } //本地缓存为空,则重新调用webservice查询数据,并更新缓存 InterfaceManageResult result = interfaceManageFacade.queryAllInterfaceList(); if (null == result || !result.isSuccess()) { return null; } configs = result.getInterfaceConfigList(); return configs; } 当外部请求访问缓存数据时:如果缓存已经过期(当前时间-缓存的上次更新时间超过缓存的有效期),则重新调用webservice访问服务端查询数据,然后更新缓存。如果缓存未过期,但缓存为空,则重新调用webservice访问服务端查询数据,然后更新缓存。仔细分析一下,该方案存在以下几处安全隐患:如果某一时刻缓存过期,此时刚好有大量的请求并发访问缓存数据,则会给服务端造成很大的压力,有多少个并发请求,就会并发向服务端发起多少次webservice请求缓存第一次初始化前,如果有大量的请求并发访问缓存数据,同样会给服务端早晨很大的压力。 即在某些时间点,会给服务端带来峰值抖动,其实,造成该隐患的根本原因在于:缓存的更新时机是由外部请求直接触发的。
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来管理从属关系和分布式缓存的通讯。
redis怎么与mysql同步java代码
redis应该算是本地缓存,而mysql的话是数据库,你的意思应该是:怎么用java代码同步数据库中的数据到redis。如果是这种情况的话:目前项目中会用一个定时任务定时去读取数据库中的数据,然后放到redis,或者在项目初始化读取数据库然后再放到redis
Spring本地缓存的使用方法
我们现在在用的Spring Cache,可以直接看Spring Boot提供的缓存枚举类,有如下这些:
EhCache:一个纯Java的进程内缓存框架,所以也是基于本地缓存的。(注意EhCache2.x和EhCache3.x相互不兼容)。
Redis:分布式缓存,只有Client-Server(C\S)模式,Java一般使用Jedis/Luttuce来操纵。
Hazelcast:基于内存的数据网格。虽然它基于内存,但是分布式应用程序可以使用Hazelcast进行分布式缓存、同步、集群、处理、发布/订阅消息等。
Guava:它是Google Guava工具包中的一个非常方便易用的本地化缓存实现,基于LRU(最近最少使用)算法实现,支持多种缓存过期策略。在Spring5.X以后的版本已经将他标记为过期了。
Caffeine:是使用Java8对Guava缓存的重写版本,在Spring5中将取代了Guava,支持多种缓存过期策略。
SIMPLE:使用ConcurrentMapCacheManager,因为不支持缓存过期时间,所以做本地缓存基本不考虑该方式。
关于分布式缓存,我们需要后面会专门讨论Redis的用法,这里只看本地缓存。性能从高到低,依次是Caffeine,Guava,ConcurrentMapCacheManager,其中Caffeine在读写上都快了Guava近一倍。
这里我们只讨论在Spring Boot里面怎么整合使用Caffeine和EhCache。
主要有以下几个步骤:
1)加依赖包:
2)配置缓存:
这里有两种方法,通过文件配置或者在配置类里面配置,先看一下文件配置,我们可以写一个properties文件,内容像这样:
然后还要在主类中加上@EnableCaching注解:
另外一种更灵活的方法是在配置类中配置:
应用类:
测试类:
导入依赖包,分为2.x版本和3.x版本。
其中2.x版本做如下导入:
3.x版本做如下导入:
导包完成后,我们使用JCacheManagerFactoryBean + ehcache.xml的方式配置:
参考资料:
如何安全的更新java本地缓存
java安全的更新本地缓存的方式如下:
当外部请求访问缓存数据时:如果缓存已经过期(当前时间-缓存的上次更新时间超过缓存的有效期),则重新调用webservice访问服务端查询数据,然后更新缓存。如果缓存未过期,但缓存为空,则重新调用webservice访问服务端查询数据,然后更新缓存。
/** 本地缓存 */
private ListInterfaceConfig configs = null;
/** 本地缓存的上次更新时间 */
private long lastUpdateTime = 0;
public ListInterfaceConfig queryInterfaceList() {
long currentTime = System.currentTimeMillis();
//判断本次缓存是否过期,过期则重新调用webservice查询数据,并更新缓存
if (currentTime - lastUpdateTime 60000) {
InterfaceManageResult result = interfaceManageFacade.queryAllInterfaceList();
if (null != result result.isSuccess()) {
configs = result.getInterfaceConfigList();
}
lastUpdateTime = currentTime;
}
if (!CollectionUtils.isEmpty(configs)) {
return configs;
}
//本地缓存为空,则重新调用webservice查询数据,并更新缓存
InterfaceManageResult result = interfaceManageFacade.queryAllInterfaceList();
if (null == result || !result.isSuccess()) {
return null;
}
configs = result.getInterfaceConfigList();
return configs;
}
关于java本地缓存同步和java实现本地缓存的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。