java平台缓存 简书_Java的缓存框架ehcache

JVM内置缓存。

流程大致就是,查询某个数据,先查询缓存有没有,没有就查数据库,然后把数据添加到缓存,如果缓存有,就不用查询数据库。

缓存的一个过期策略:

FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。

LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。

LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。

默认是使用第二种:LRU。下面有介绍各种参数的意思

引入依赖:版本2倾向于单机处理,版本3倾向于分布式。

net.sf.ehcache

ehcache-core

${ehcache-core.version}

引入ehcache.xml。这个要放在resources根目录下

xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"

updateCheck="false">

eternal="false"

maxElementsInMemory="10000"

overflowToDisk="false"

diskPersistent="false"

timeToIdleSeconds="1800"

timeToLiveSeconds="259200"

memoryStoreEvictionPolicy="LRU"/>

name="这里写一个自定义缓存策略名字,如:cloud_user"

eternal="false"

maxElementsInMemory="5000"

overflowToDisk="false"

diskPersistent="false"

timeToIdleSeconds="1800"

timeToLiveSeconds="1800"

memoryStoreEvictionPolicy="LRU"/>

//还可以继续写缓存,换个名字就行了

List list = null;//写一些数据

//调用工具类把数据放入缓存。存活时间:60s,单位秒

EhcacheUtil.setValue("cloud_fblog", "user_hotusers", list, 60);

//取出缓存数据,get它的Key就行了。

list = (List) EhcacheUtil.getValue("刚刚写的那个缓存库名字cloud_user", "定义一个缓存名字:user_hotusers");

Spring Boot 整合 Ehcache

pom.xml和加入ehcache.xml(上面有)

org.springframework.boot

spring-boot-starter-cache

net.sf.ehcache

ehcache

2.9.1

application.properties的配置

spring.cache.type=ehcache

spring.cache.ehcache.cofnig=classpath:/ehcache.xml

在入口处配置:

@EnableCaching //开启ehcache缓存模式

public class app {

public static void main(String[] args) {

app.run(app.class, args);

}

}

在你需要缓存的类上面加入策略名称:

//这里的名称要和你ehcache.xml里面配置的一样

@CacheConfig(cacheNames = "cloud_user") //表示创建缓存配置,里面还有一些参数可以配置

public class APIServiceImpl implements APIService {

在类下面的方法那个需要缓存的加入注解@Cacheable

@Cacheable //这个方法就已经加入缓存了

public List findByHotUser(Integer maxResults) {

List list = null;

Pageable pageable = PageRequest.of(0, maxResults,Direction.DESC,"createTime");

Page page = userDao.findAll(pageable);

list = page.getContent();

缓存和DB不同步的问题:

该数据已经在缓存里面,而且还没过期,这时候修改数据库,就会造成数据库和缓存数据不一致的问题。

解决办法:在修改数据库的时候,顺便把缓存清理一下就可以了。

@Autowired

private CacheManager cacheManager;

@RequestMapping("/remoKey")

public void remoKey() {

cacheManager.getCache("cache_user").clear();

}

ehcache集群:

ehcache可以做,但是不合适做。

在ehcache.xml里面加入代码:

创建一个rmi的集群,端口号port8080、

class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"

properties="hostName=127.0.0.1,port=8080,socketTimeoutMillis=120000" />

这里端口号8081他会集群到8080,

class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"

properties="peerDiscovery=manual,rmiUrls=//127.0.0.1:8081/cache_user"/>

同样在另外一台服务器也做同样的配置,只不端口号和地址需要反过来。

这样如果其中一台缓存发生变化,就会发送通知给另外一台。只不过如果服务器越多,配置就越多,不合适做集群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值