作者: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集成Redis缓存的更多相关文章

  1. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...

  2. spring boot redis 缓存(cache)集成

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  3. spring集成redis

    redis是一种非关系型数据库,与mongoDB不同的是redis是内存数据库,所以访问速度很快.常用作缓存和发布-订阅式的消息队列.redis官方没有提供windows版本的软件.windows版本 ...

  4. spring 集成 redis -- pub/sub

    redis除了常用的当做缓存外,还可以当做简单的消息中间件,实现消息发布订阅 spring集成redis,可以使用spring-data-redis 首先引入相关maven依赖(此处我spring相关 ...

  5. 集成Redis缓存

    一.简介 1.场景 由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度. 2.RedisTemplate Jedis是Redi ...

  6. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  7. spring boot redis缓存JedisPool使用

    spring boot redis缓存JedisPool使用 添加依赖pom.xml中添加如下依赖 <!-- Spring Boot Redis --> <dependency> ...

  8. Spring集成Redis集群(含spring集成redis代码)

    代码地址如下:http://www.demodashi.com/demo/11458.html 一.准备工作 安装 Redis 集群 安装参考: http://blog.csdn.net/zk6738 ...

  9. 使用maven简单搭建Spring mvc + redis缓存

    注:此文参考并整合了网上的文章 <spring缓存机制>:http://blog.csdn.net/sidongxue2/article/details/30516141 <配置 S ...

随机推荐

  1. Java基础总结--Java编程环境变量配置

    1.jdk--bin--都是命令行程序(图形化是对命令行的封装)eg javac&java执行javac必须切换到其所在目录--太麻烦---想在任意目录下使用要执行一个命令--先在当前目录下找 ...

  2. 运行第一个Go Web框架

    GO 语言的web框架很多,相对来说, Beego 框架,入门简单,文档齐全(中文),功能强大,本文以Beego 示例. Beego提供了详细的开发文档:http://beego.me/docs/in ...

  3. idea中的汉语注释出现乱码的解决方案

    日记 - idea中的汉语注释出现乱码的解决方案 我是个idea的忠实用户,新公司的项目都是用eclipse做的,通过svn拉下代码后发现,注释的内容里,中文内容都是乱码.问过项目负责人,说可能是GB ...

  4. Java项目打包方式分析

    [TOC] 概述 在项目实践过程中,有个需求需要做一个引擎能执行指定jar包的指定main方法. 起初我们以一个简单的spring-boot项目进行测试,使用spring-boot-maven-plu ...

  5. 【前端GUI】——网站设计的重要知识点总结&思维导图(一)

    前言:网页美术设计具有四大特点,分别为交互性.整合性.多维性以及动态性.完整的网页设计既需要试听元素,也需要版式设计,以求有效的传达信息.在设计的时候,设计者要学会利用框架,也要学会打破框架. 一.优 ...

  6. VS2012环境下C#调用C++生成的DLL

    1.VS2012 C++生成DLL 这个过程仿照http://www.cnblogs.com/LCCRNblog/p/3625200.html创建DLL即可,暂时不用创建测试工程,因为下面有测试工程的 ...

  7. 默认权限umask、文件系统权限、特殊权限

    第1章 权限相关错误 1.1 普通用户 ls /root/ /root  属于root 普通用户没有任何权限,所以无法查看 [oldboy@znix ~]$ ls /root/ ls: cannot ...

  8. IdentityServer4 登录使用数据库

    业务场景: IdentityServer4 默认使用TestUser和UserStore,需要模拟和加载所有的用户数据,正式环境肯定不能这样实现,我们想从自己的数据库中读取用户信息,另外,因为 Ide ...

  9. 利用JavaScript实现动态显示表格且对应改变按键的value值

    插入的代码并没有符合HTML5样式,只是为了实现利用JS动态显示表格,并且按键的value值会同时发生变化的功能. <!DOCTYPE > <html > <head&g ...

  10. c++学习笔记---01---C++语言与OO思想介绍

    C++语言与OO思想介绍 C++的特点与OO思想 C语言有一个优点,即它的速度可以很快.写出来的程序可以很精练.简单.小巧,不用为了解决某个问题环绕太平洋一大圈. 但如果将C和C++相比较,C++就经 ...