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根目录下



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

导入ehcache的工具类

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、
    

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

同样在另外一台服务器也做同样的配置,只不端口号和地址需要反过来。
这样如果其中一台缓存发生变化,就会发送通知给另外一台。只不过如果服务器越多,配置就越多,不合适做集群。

你可能感兴趣的:(Java的缓存框架ehcache)