Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
作者:13
GitHub:https://github.com/ZHENFENG13
版权声明:本文为原创文章,未经允许不得转载。
整合Redis
本来以为类似的Redis教程和整合代码应该会很多,因此也没打算特别认真的做这个教程,但是看了一下网上类似的教程好像不是特别多,刚好也要在perfect-ssm项目中整合Redis,因此花了两天时间做了整合和测试,并整理在这篇文章中,希望给看到教程的朋友一些帮助。
pom.xml依赖安装
<!-- Start: redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- End: redis -->
Spring+Redis集成代码
有两种集成方式,一种是通过Spring配置文件,另外一种是通过继承CachingConfigurerSupport,两种方式虽然方式不同,但是目的和结果是一样的。
方式一:
RedisCacheConfig.java
@Component
@EnableCaching
@Configuration
public class RedisCacheConfig extends CachingConfigurerSupport {
@Bean
public JedisConnectionFactory redisConnectionFactory() {
JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();
//ip地址
redisConnectionFactory.setHostName("127.0.0.1");
//端口号
redisConnectionFactory.setPort(17779);
//redis登录密码
redisConnectionFactory.setPassword("ILfr6LTKhpNJ0x5i");
//database 默认是16个,不设置的话默认为0
redisConnectionFactory.setDatabase(2);
return redisConnectionFactory;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
redisTemplate.setConnectionFactory(cf);
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//默认过期时间
cacheManager.setDefaultExpiration(3000);
return cacheManager;
}
}
完成后要将bean注入到Spring中,因此需要在spring-context.xml配置文件中添加如下配置:
<context:component-scan base-package="com.ssm.promotion.core.redis"/>
perfect-ssm项目中用到的是此方法,本文中后续的测试用例代码中也是根据这种方式来测试的,代码已经上传至github仓库,源码可以到我的github仓库中查看和下载。
方式二:
redis.properties
#ip地址
redis.host=127.0.0.1
#端口号
redis.port=17779
#密码
redis.password=ILfr6LTKhpNJ0x5i
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis.maxIdle=200
#连接池的最大数据库连接数。设为0表示无限制
redis.maxActive=300
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWait=1500
redis.testOnBorrow=true
spring-redis.xml
<context:property-placeholder location="classpath:redis.properties" ignore-unresolvable="true"/>
<!-- redis连接池 -->
<bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxActive}"></property>
<property name="maxIdle" value="${redis.maxIdle}"></property>
<property name="maxWaitMillis" value="${redis.maxWait}"></property>
<property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
</bean>
<!-- redis连接工厂 -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.host}"></property>
<property name="port" value="${redis.port}"></property>
<!-- 即使没有设置密码,password可以不设置值,但这项设置一定要保留 -->
<property name="password" value="${redis.password}"></property>
<!-- 即使没有设置密码,password可以不设置值,但这项设置一定要保留 -->
<property name="poolConfig" ref="jedisConfig"></property>
</bean>
<!-- redis操作模板 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="keySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="valueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
<!--开启事务-->
<property name="enableTransactionSupport" value="true"/>
</bean>
</beans>
注意事项:
如果在安装redis时没有设置密码,配置文件中的password可以不设置值,但是这项设置一定要保留:
<property name="password" value=""></property>
如若不然的话,项目在启动时会报错,无法连接redis,没有特别去研究为什么会这样,但是需要注意。
RedisUtil
由于采用的是第一种方式,在测试的时候又写了一个Redis的工具类,RedisUtil:
/**
* Created by 13 on 2017/12/4.
*/
@Component
public class RedisUtil {
private static final String CACHE_NAME = "perfect-ssm-cache:";
// 过期时间
private static final int EXPIRE_TIME = 3000;
private RedisTemplate template;
private RedisCache cache;
public RedisUtil() {
init();
}
public void init() {
template = SpringUtil.getBean("redisTemplate");//RedisCacheConfig中定义了
cache = new RedisCache(CACHE_NAME, CACHE_NAME.getBytes(), template, EXPIRE_TIME);
}
//添加
public void put(String key, Object obj) {
cache.put(key, obj);
}
//获取
public Object get(String key, Class clazz) {
return cache.get(key) == null ? null : cache.get(key, clazz);
}
//删除
public void del(String key) {
cache.evict(key);
}
}
整合测试
测试用例代码:
- 首先是简单的
String测试:
@Test
public void redisPutTest() {
//添加
redisUtil.put("name", "perfect-ssm");
}

@Test
public void redisGetTest() {
//获取
String str = (String) redisUtil.get("name", String.class);
System.out.println(str);
}
测试结果如下:

- 然后是复杂类型
java.util.List测试:
@Test
public void redisPutListTest() {
List<String> stringList = new ArrayList<>();
stringList.add("github");
stringList.add("13");
stringList.add("cnblog");
stringList.add("perfect-ssm");
//添加
redisUtil.put("stringList", stringList);
}

@Test
public void redisGetListTest() {
//获取
List<String> stringList = (List<String>) redisUtil.get("stringList", List.class);
if (stringList.size() > 0) {
for (String string : stringList
) {
System.out.println(string);
}
}
}
测试结果如下:

- 最后是项目中自定义的JavaBean的测试:
要缓存的JavaBean必须实现Serializable接口,因为Spring会将对象先序列化再存入 Redis,如测试用例中的com.ssm.promotion.core.entity.Article类,如果不实现 Serializable的话将会报出如下异常:
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.io.NotSerializableException: com.ssm.promotion.core.entity.Article

@Test
public void redisPutListArticleTest() {
List<Article> articles = new ArrayList<>();
Article article1 = new Article();
article1.setId("1");
article1.setArticleContent("article1");
Article article2 = new Article();
article2.setId("2");
article2.setArticleContent("article2");
articles.add(article1);
articles.add(article2);
//添加
redisUtil.put("articles", articles);
}

@Test
public void redisGetArticleListTest() {
//获取
List<Article> articles = (List<Article>) redisUtil.get("articles", List.class);
if (articles.size() > 0) {
for (Article article : articles
) {
System.out.println(article);
}
}
}
测试结果如下:

总结
配置文件中的密码、端口、ip地址要改成你自己的配置,不要直接用这里的配置,如果是这个原因导致项目报错就很尴尬了。
每周抽出一些时间做点事情,虽然感觉很压抑,但是看到结果的时候心里真的是乐开了花。
首发于我的个人博客,新的项目演示地址:perfect-ssm,登录账号:admin,密码:123456

如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友。
如果你想继续了解该项目可以查看整个系列文章Spring+SpringMVC+MyBatis+easyUI整合系列文章,也可以到我的GitHub仓库或者开源中国代码仓库中查看源码及项目文档。
Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存的更多相关文章
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(六)一定要RESTful吗?
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 写在前面的话 这个问题看起来就显得有些萌,或者说类似的问题都有些不靠 ...
- 如约而至,Java 10 正式发布! Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势 努力的孩子运气不会太差,跌宕的人生定当更加精彩 优先队列详解(转载)
如约而至,Java 10 正式发布! 3 月 20 日,Oracle 宣布 Java 10 正式发布. 官方已提供下载:http://www.oracle.com/technetwork/java ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十一)redis密码设置、安全设置
警惕 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作>主要是一个简单的介绍,针对redis ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(二)Log4j讲解与整合
日常啰嗦 上一篇文章主要讲述了一下syso和Log间的一些区别与比较,重点是在项目的日志功能上,因此,承接前文<Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Sy ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十四)Redis缓存正确的使用姿势
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 简介 这是一篇关于Redis使用的总结类型文章,会先简单的谈一下缓存 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(一)设计一套好的RESTful API
写在前面的话 看了一下博客目录,距离上次更新这个系列的博文已经有两个多月,并不是因为不想继续写博客,由于中间这段时间更新了几篇其他系列的文章就暂时停止了,如今已经讲述的差不多,也就继续抽时间更新< ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(二)RESTful API实战笔记(接口设计及Java后端实现)
写在前面的话 原计划这部分代码的更新也是上传到ssm-demo仓库中,因为如下原因并没有这么做: 有些使用了该项目的朋友建议重新创建一个仓库,因为原来仓库中的项目太多,结构多少有些乱糟糟的. 而且这次 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(九)Linux下安装redis及redis的常用命令和操作
redis简介 Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存 ...
随机推荐
- recovery 差分升级包制作超时
我们在对android系统升级的时候,可以减少升级包的大小,只升级差异部分,也就是差分包升级,相关的描述可以参考:http://blog.csdn.net/csdn66_2016/article/de ...
- [20180612]删除bootstrap$记录无法启动.txt
[20180612]删除bootstrap$记录无法启动.txt --//前几天看链接http://www.xifenfei.com/2018/05/willfully-delete-bootstra ...
- tkinter中Radiobutton单选框控件(七)
Radiobutton控件 由于本次内容中好多知识都是之前重复解释过的,本次就不做解释了.不太清楚的内容请参考tkinter1-6节中的内容 import tkinter wuya = tkinter ...
- ubuntu16.04系统彻底卸载mysql,并源码免编译重装MySQL的步骤
今天的总结 ubuntu上彻底卸载MySQL或重新安装 https://www.jianshu.com/p/974b33873bca #查看是否存在mysql服务 service mysql stat ...
- SAP SD模块功能构成
- 建立标准编码规则(三)-CodeFixProvider 给代码分析器增加修复建议
给代码分析器增加修复建议 既然代码分析器,向代码编写者提出了错误或警告,那么有没有可能向代码编写者提交有效的改进建议? 相对于 DiagnosticAnalyzer,代码修复继承与 CodeFixPr ...
- 环境搭建-----IntelliJ idea之resin配置
目前网上的相关资料太少了 自己只能摸索着尝试 最后在领导的帮忙下 成功实现了环境的集成 网上查到的一般都是修改resin的配置文件等等 其实完全没有必要 本人之前在intellij下部署resin遇到 ...
- yii2场景
遇到的问题 起作用了但是使用create的时候,保存却出了问题,提示unknown scenarios:default 解决方法 后来找文章,是因为设置场景的时候,直接把父类的场景覆盖了.所以应该这样 ...
- ethereum/EIPs-1078 Universal login / signup using ENS subdomains
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1078.md eip title author discussions-to status ...
- ethereum/EIPs-712 Ethereum typed structured data hashing and signing
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md eip title author discussions-to status ...