APP下载

SpringBoot项目中EhCache缓存技术的实现

2021-12-24王萍

电脑知识与技术 2021年29期
关键词:清空管理器进程

王萍

摘要:从本质上看,EhCache是一个缓存管理器,不仅可以和Hibernate配合实现缓存,也可以和其他框架比如spring boot结合,作为一个缓存管理器,该文这里举一个例子,来论述SpringBoot项目中EhCache缓存技术的实现过程,以“spring boot + mybatis + EhCache”實现本地缓存为例,探讨了SpringBoot项目中EhCache缓存技术的实现。

关键词:SpringBoot项目;EhCache;缓存技术

中图分类号:TP311  文献标识码:A

文章编号:1009-3044(2021)29-0079-03

1概述

1.1 SpringBoot

SpringBoot是由Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。

简而言之,SpringBoot是当前 web 开发主流,其简化了 Spring 的配置让开发者能够更容易上手Web项目的开发。由于Spring 的发展、微服务的发展使得SpringBoot越来越流行,已经成为JavaWeb开发的主流框架。

1.2 Spring Boot的缓存机制

SpringBoot高速缓存抽象不提供实际存储,且依赖于由org. springframework.cache.Cache和org.springframework.cache.Cache⁃ Manager接口实现的抽象。 Spring Boot根据自动配置实现合适的CacheManager,只要缓存支持通过@EnableCaching 注释启用即可。

1.3 EhCache

EhCache是一个开源的基于标准的缓存,是一个纯Java 的在进程中的缓存,可提高性能,减轻数据库负载并简化可伸缩性。它是使用最广泛的基于Java 的高速缓存,功能全面,并且与其他流行的库和框架集成在一起。EhCache从进程内缓存扩展到混合进程内/进程外部署与TB级缓存。EhCache是一个快速的、轻量级的、易于使用的、进程内的缓存。它支持read-on⁃ly和 read/write 缓存,内存和磁盘缓存。是一个非常轻量级的缓存实现,并支持集群。

现在的EhCache已经更新到了3.9版本,版本3加入一些新的功能,包括:1)改进了API,可以利用Java泛型并简化缓存交互;2)与javax.cache API(JSR-107)完全兼容;3)Offheap存储功能,包括仅堆外高速缓存;4)Spring Caching 和Hibernate集成得益于javax.cache支持。

1.4 Springboot整合EhCache的步骤

主要是:添加 pom 文件 maven 依赖——配置 ehcache.xml ——开启缓存支持——在项目中使用。

2方法

下面这个例子是一个springboot工程项目,集成了mybatis来进行数据库的访问,只是一个简单的数据库表操作,在具体的方法上添加了相应的注解,从而实现了本地缓存。没有用到EhCache集群和分布式,只是将信息缓存到内存中,从而降低数据库之间的访问,提高数据的访问速度。

核心的代码主要如下:

1)SpringCacheApplication启动类

package com.example.ehcache;

import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication;

import org. springframework. boot. autoconfigure. EnableAuto⁃ Configuration;

import org.springframework.boot.autoconfigure.SpringBootAp⁃ plication;

import org. springframework. boot. autoconfigure. jdbc. Data⁃SourceAutoConfiguration;

import org.springframework.cache.annotation.EnableCaching;

import org.springframework.cloud.client.discovery.EnableDis⁃coveryClient;

import org.springframework.cloud.config.server.EnableConfig⁃ Server;

/**

*数据库集成Mybatis、EhCache框架采用 Mapper 访问数据库。

*/

@EnableDiscoveryClient

@SpringBootApplication

@EnableCaching

public class SpringCacheApplication {

public static void main(String[] args){

SpringApplication. run(SpringCacheApplication. class,

args);

System.out.println("MysqlMybatisMapperEhCache数据库微服务已启动.");

}

}

如果想用EhCache缓存,在启动类上一定要加上@Enable⁃ Caching注解,否则缓存会不起作用。

2)UserServiceImpl实现类

package com.example.ehcache.service.impl;    import com.github.pagehelper.util.StringUtil;    import com.example.Ehcache.common.model.User; import com.example.ehcache.common.util.Result;

import com.example.ehcache.provider.dao.UserDao;    import com.example.ehcache.provider.service.UserService; import com.mysql.jdbc.StringUtils;

import com.sun.org.apache.regexp.internal.RE;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut;  import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service;

import org. springframework. transaction. annotation. Transac⁃tional;

import java.util.List;

@CacheConfig(cacheNames ="UserCache")

@Service

public class UserServiceImpl implements UserService {

private Logger logger = LoggerFactory. getLogger(this. get⁃Class());

private static final String CACHE_KEY ="'user'";

private static final String CACHE_NAME_B ="user- cache";

@Autowired

private UserDaouserDao;

@CachePut(value =  CACHE_NAME_B,  key =

CACHE_KEY)

@Override

public int insert(User user){

return userDao.insert(user);

}

@CacheEvict(value = CACHE_NAME_B, key ="'user_'+ #id")

@Override

public int deleteByPrimaryKey(String id){

Result result = new Result();

return userDao.deleteByPrimaryKey(id);

}

@CachePut(value = CACHE_NAME_B, key ="'user_'+#us? er.id")

@Traditional

@Override

public User updateByPrimaryKey(User user){

if(userDao.updateByPrimaryKey(user)>0){

user=userDao.selectByPrimaryKey(user.getId());

return user;

}else{

return null;

}

}

@Cacheable(value = CACHE_NAME_B, key ="'user_'+

#id")

@Override

public User selectByPrimaryKey(String id){

return userDao.selectByPrimaryKey(id);

}

@Cacheable

@Override

public List<User>selectAllUser(){

return userDao.selectAllUser();

}

@Cacheable(value = CACHE_NAME_B, key ="#userId+'_'+#userName")

@Override

public Result selectUserByAcount(Integer userId, String userName){

Result result = new Result();

try {

List<User> list = userDao.selectUserByAcount(userId, userName);

if (list.size()==0 || list.isEmpty()){

result.setRetCode(Result.RECODE_ERROR);

result.setErrMsg("查找的数据不存在!");

return result;

}

result.setData(list);

} catch (Exception e){

result.setRetCode(Result.RECODE_ERROR);

result.setErrMsg("方法执行出错了!");

logger.error("方法执行出错了!", e);

throw new RuntimeException(e);

}

return result;

}

}

3结论

通过以上的论述,可以看出:1)Springboot整合Encache实现数据缓存时,可以通过注入CacheManager实现缓存内容的查询和缓存清空;2)可以使用 @Cacheable、@CachePut 和@CacheEvict 实现缓存和缓存清空;3)清空缓存有两种方式,方式一通过使用cache.clear(),方式二使用@CacheEvict 注解在调用指定方法时清空缓存。

EhCache是一个非常轻量级的缓存实现且支持集群,同时也是hibernate 默认的缓存provider。以上本文只是EhCache對页面缓存的支持,EhCache的功能远不止如此,当然要使用好缓存,需对JEE 中缓存的原理、使用范围、适用场景等都有比较深刻的理解,这样才能用好缓存、用对缓存。

参考文献:

[1]王松.SPRING BOOT+VUE全栈开发实战[M].北京:清华大学出版社,2019.

[2]陈韶健.深入实践SpringBoot[M].北京:机械工业出版社,2016.

[3]彭志勇.基于Spring Boot技术的天津法院报表分析系统的设计与实现[D].南京:南京大学,2018.

[4]宁方美,贺雪梅,牟晋娟.SpringBoot集成Redis缓存技术在企业一卡通系统中的应用[J].电子技术与软件工程,2019(24):133-134.

[5]杨家炜. 基于 Spring Boot 的 web 设计与实现[J].轻工科技, 2016,32(7):86-89.

【通联编辑:张薇】

猜你喜欢

清空管理器进程
债券市场对外开放的进程与展望
Windows文件缓冲处理技术概述
清空你的购物车是我的温柔
清空购物车了吗!
下一场雪,写一首诗
高集成度2.5A备份电源管理器简化锂离子电池备份系统
社会进程中的新闻学探寻
我国高等教育改革进程与反思
Linux僵死进程的产生与避免
在Win 7下利用凭据管理器提高访问速度等