Springboot+Jedis+Ehcache整合
项目结构概览:
1. 导包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<!-- 跳过test打包 -->
<skipTests>true</skipTests>
</properties> <dependencies>
<!--web场景启动器,包含 Tomcat 和 spring-mvc restful aop jackjson支持。 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 热加载 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- ehcache缓存 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- commons-lang3工具类 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--指定主函数路径
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.codingapi.txlcn.tm.TMApplication</mainClass>
</manifest>
</archive>
</configuration>-->
</plugin>
</plugins>
</build>
<!--
没有Main函数打包
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
-->
2.1 application.properties配置文件
# 运行端口
server.port=8084
# 项目访问路径前缀
server.context-path=/cache # 服务名称
spring.application.name=springbootTest
# ehcache配置文件
spring.cache.ehcache.config=classpath:ehcacheproduct.xml
2.2 redis.properties配置参数
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
#spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=1024
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=10000
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=200
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=10000
#flase:超时就报错, true:阻塞到超时
spring.redis.block-when-exhausted=true
2.3 ehcacheproduct.xml配置问价
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"> <!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir" /> <!--
name: 缓存名称
maxElementsInMemory: 缓存最大个数
maxEntriesLocalHeap: 在内存创建对象的最大数量,0=无限制。
maxEntriesLocalDisk: 硬盘上存储的对象的最大数量。默认0,即无限制
eternal: 对象是否永久有效,一但设置了, timeout将不起作用
timeToIdleSeconds: 当缓存闲置n秒后销毁 ,默认是0,也就是对象存活时间无穷大。当eternal=false时有效!
timeToLiveSeconds: 当缓存存活n秒后销毁 ,默认是0,也就是对象存活时间无穷大。当eternal=false时有效!
overflowToDisk: 达到缓存maxElementsInMemory个数后,将数据存入磁盘,默认大小为30mb
diskPersistent: 是否缓存虚拟机重启期数据
diskExpiryThreadIntervalSeconds: 磁盘失效线程运行时间间隔,默认是120秒。达到缓存最大个数,会按照磁盘清理策略去清理磁盘。
memoryStoreEvictionPolicy: 磁盘清理策略, 默认策略LRU(最近最少使用)你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush: 内存数量最大时是否清除
-->
<!-- 默认缓存 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap" />
</defaultCache> <!-- 自定义缓存 -->
<cache name="userchache"
eternal="false"
timeToIdleSeconds="2400"
timeToLiveSeconds="2400"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU">
</cache>
</ehcache>
3. RedisConfig配置文件
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; @Configuration
@PropertySource("classpath:redis.properties")
public class RedisConfig {
private final Logger log = LoggerFactory.getLogger(this.getClass()); @Value("${spring.redis.host}")
private String host; @Value("${spring.redis.port}")
private int port; @Value("${spring.redis.timeout}")
private int timeout; @Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle; @Value("${spring.redis.jedis.pool.max-wait}")
private long maxWaitMillis; //@Value("${spring.redis.password}")
//private String password;
private String password; @Value("${spring.redis.block-when-exhausted}")
private boolean blockWhenExhausted; @Bean
public JedisPool redisPoolFactory() throws Exception{
log.info("-------------JedisPool注入成功!!----------------");
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
// 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
jedisPoolConfig.setBlockWhenExhausted(blockWhenExhausted);
// 是否启用pool的jmx管理功能, 默认true
jedisPoolConfig.setJmxEnabled(true);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password); return jedisPool;
}
}
4. Redis工具类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
@Component
public class RedisUtil{
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private JedisPool jedisPool; public String get(String key) {
Jedis jedis = null;
String value = null;
try {
jedis = jedisPool.getResource();
value = jedis.get(key);
log.info(value);
} catch (Exception e) { log.error(e.getMessage());
} finally {
returnResource(jedis);
}
return value;
} public String set(String key, String value) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.set(key, value);
} catch (Exception e) { log.error(e.getMessage());
return "0";
} finally {
returnResource(jedis);
}
} /**
* 关闭连接
*/
public static void returnResource(Jedis jedis) {
try {
jedis.close();
} catch (Exception e) {
}
}
}
5. 测试业务逻辑
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.wulei.model.User;
import com.wulei.utils.RedisUtil;
@Service
// 指定ehcache缓存规则
@CacheConfig(cacheNames = "userchache")
public class UserService {
@Autowired
RedisUtil redisUtil; public List<User> testRedis() {
redisUtil.set("name", "吴磊");
System.out.println(redisUtil.get("name"));
return this.getDataSource();
} @Cacheable(key="'testEhcaheCacheable'")
public List<User> testEhcaheCacheable(){
// 只会查询一次
System.out.println("Cacheable查询缓存数据");
return this.getDataSource();
} //键为"userId:"字符串加上userId值,如 'userId:1'
@CacheEvict(key="'userId:' + #userId")
public List<User> testEhcaheCacheEvict(int userId){
// 每次请求都会删除指定key
System.out.println("清除userchache中指定key的缓存");
List<User> list = this.getDataSource();
list.remove(userId-1);
return list;
} @CacheEvict(allEntries=true)
public List<User> testEhcaheCacheEvictAll(){
// 每次请求都会删除所有key
System.out.println("清除userchache中所有key的缓存");
return new ArrayList<User>();
} public List<User> getDataSource(){
List<User> list = new ArrayList<User>();
list.add(new User(1, "jay", 21));
list.add(new User(2, "join", 22));
list.add(new User(3, "eason", 23));
list.add(new User(4, "jj", 24));
return list;
}
}
6. controller入口
@RestController
public class UserController { @Autowired
private UserService userService; @RequestMapping("/testRedis")
public List<User> testRedis() {
return userService.testRedis();
}
@RequestMapping("/testEhcahe")
public List<User> testEhcahe(int type){
if(type==1) {
return userService.testEhcaheCacheable();
}else if(type==2) {
return userService.testEhcaheCacheEvict(type);
}else if(type==3) {
return userService.testEhcaheCacheEvictAll();
}
return null;
}
}
7. 主函数
@SpringBootApplication
@EnableCaching // 启用ehcache缓存注解
public class Application { private static Logger log = Logger.getLogger(Application.class); public static void main(String[] args) {
SpringApplication.run(Application.class, args);
log.info("SpringBoot Start Success");
}
}
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.8.RELEASE</version> <relativePath/> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version><!-- 跳过test打包 --> <skipTests>true</skipTests> </properties> <dependencies> <!--web场景启动器,包含 Tomcat 和 spring-mvc restful aop jackjson支持。 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 热加载 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!-- ehcache缓存 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <!-- redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <type>jar</type> <scope>compile</scope> </dependency> <!-- commons-lang3工具类 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.7</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!--指定主函数路径 <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.codingapi.txlcn.tm.TMApplication</mainClass> </manifest> </archive> </configuration>--> </plugin> </plugins> </build> <!-- 没有Main函数打包 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> </plugin> </plugins> </build> -->
Springboot+Jedis+Ehcache整合的更多相关文章
- Springboot使用ehcache缓存
本文部分步骤继承于springboot使用cache缓存,如果有不清楚的,请移驾springboot使用cache缓存 ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java ...
- SpringBoot 优雅的整合 Shiro
Apache Shiro是一个功能强大且易于使用的Java安全框架,可执行身份验证,授权,加密和会话管理.借助Shiro易于理解的API,您可以快速轻松地保护任何应用程序 - 从最小的移动应用程序到最 ...
- SpringBoot+Shiro+mybatis整合实战
SpringBoot+Shiro+mybatis整合 1. 使用Springboot版本2.0.4 与shiro的版本 引入springboot和shiro依赖 <?xml version=&q ...
- Ehcache 整合Spring 使用页面、对象缓存
Ehcache 整合Spring 使用页面.对象缓存 Ehcache在很多项目中都出现过,用法也比较简单.一 般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布 ...
- ehcache整合spring本地接口方式
一.简介 ehcache整合spring,可以通过使用echache的本地接口,从而达到定制的目的.在方法中根据业务逻辑进行判断,从缓存中获取数据或将数据保存到缓存.这样让程序变得更加灵活. 本例子使 ...
- 八 mybatis查询缓存(一级缓存,二级缓存)和ehcache整合
1 查询缓存 1.1 什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存.
- mybatis 与 ehcache 整合[转]
1.简介 MyBatis 是支持普通SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及结果集的检索. Ehcache 是现在最流行的纯 ...
- SpringBoot与Mybatis整合方式01(源码分析)
前言:入职新公司,SpringBoot和Mybatis都被封装了一次,光用而不知道原理实在受不了,于是开始恶补源码,由于刚开始比较浅,存属娱乐,大神勿喷. 就如网上的流传的SpringBoot与Myb ...
- Springboot security cas整合方案-实践篇
承接前文Springboot security cas整合方案-原理篇,请在理解原理的情况下再查看实践篇 maven环境 <dependency> <groupId>org.s ...
随机推荐
- js能否上传文件夹
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- 当SQL Server出现当 MUST_CHANGE 为 ON (开)时
取消账号强制策略时出现错误 当 MUST_CHANGE 为 ON (开)时,不能将 CHECK_POLICY 和 CHECK_EXPIRATION 选项设为 OFF (关). (Microsoft S ...
- swiper实现滑动到某页锁住不让滑动
var swiper = new Swiper('.swiper-container', { pagination: '.swiper-pagination', onTouchStart: funct ...
- 5.Python注释(多行注释和单行注释)用法详解
Python单行注释 Python 中使用井号(‘#’)作为单行注释的符号,语法格式为: # 注释内容 也就是说,从符号‘#’处开始,直到换行处结束,此部分内容都作为注释的内容,当程序执行时,这部分内 ...
- Oracle-SQL程序优化3
最近一个星期ETL无论在凌晨或是在中午的JOB执行过程中经常卡住,导致不能按时完成系统引擎的运行,对业务产生影响. 通过生成AWR报告,发现有三条SQL消耗大量的CPU,而且还没有执行完成被终止的.如 ...
- less基本用法
在vue中使用less首先要下载依赖: npm install less less-loader --save-dev 下载好之后就可以.vue文件中使用lang="less"和@ ...
- python学习之路(25)
继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类(Base clas ...
- 关于如何解决TeamViewer限制时间问题
最近在弄一个项目,我们是乙方,甲方离我们比较远,所以需要用到远程操作软件.也就是TeamViewer. 这个软件一开始运行还行,后来时间用久了,很容易被限制时间.在网上查了大部分资料,都是一些修改MA ...
- Vue左滑组件slider的实现
本文链接:https://blog.csdn.net/latency_cheng/article/details/82983000 slider组件与swiper组件不同,slider滑动时并不翻页, ...
- iOS自动化--Spaceship使用实践
Spaceship ### 脚本操作 证书,app,provision等一些列apple develop后台操作,快速高效. github地址 spaceship开发文档 文档有列出常用的api调用d ...