声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅。

1、概念:SpringBoot 整合 Redis

2、背景

Redis 的数据库的整合在 java 里面提供的官方工具包:jedis,所以即便你现在使用的是 SpringBoot,那么也继续使用此开发包。

2.1、RedisTemplate 模版操作

在 Spring 支持的 Redis 操作之中提供有一个 RedisTemplate 处理程序类,利用这个类可以非常方便的实现 Redis 的各种基本数 据操作。

1、 修改项目中的 pom.xml 配置文件,追加 redis 的依赖引用:

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、 如果要想使用 Redis 操作,则一定要修改 application.yml 配置文件,在这个配置文件之中要进行 Redis 的各种连接配置处理;

spring:
redis:
host: 192.168.68.166
port: 6379
password: studyjava
timeout: 1000
database: 0
pool:
max-active: 10
max-idle: 8
min-idle: 2
max-wait: 100

3、 下面就可以通过程序来利用 RedisTemplate 模版进行数据处理了,因为以上的配置一旦完成之后会在 Spring 内部帮助用户直接 获得一个 RedisTemplate 模版处理对象,为了简单,直接建立一个测试类完成:

package cn.study.microboot;
import javax.annotation.Resource; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@SpringBootTest(classes = StartSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestRedis {
@Resource
private RedisTemplate<String, String> redisTemplate;
@Test
public void testSet() {
this.redisTemplate.opsForValue().set("study", "java");
System.out.println(this.redisTemplate.opsForValue().get("study"));
}
}

则此时就可以利用 Redis 实现在 SpringBoot 中的数据存储操作了。

2.2、Redis 对象序列化操作

虽然以上的代码实现了 Redis 基础的数据操作,但是遗憾的是在 Java 开发领域内必须要考虑一个实际的问题,那么就是对象 的序列化保存问题,毕竟 Redis 数据库的读写速度是非常快的,但是如果不能够进行对象的存储,这样的存储意义就不大了,这样 就需要准备一个对象的序列化处理程序类,通过对象的形式进行数据的存储。

1、 如果要想进行 Redis 对象序列化操作则一定要首先准备一个序列化处理程序类,这个程序类有实现要求:

package cn.study.microboot.util.redis;

import org.springframework.core.convert.converter.Converter;
import org.springframework.core.serializer.support.DeserializingConverter;
import org.springframework.core.serializer.support.SerializingConverter;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
// 此时定义的序列化操作表示可以序列化所有类的对象,当然,这个对象所在的类一定要实现序列化接口
public class RedisObjectSerializer implements RedisSerializer<Object> {
// 为了方便进行对象与字节数组的转换,所以应该首先准备出两个转换器
private Converter<Object, byte[]> serializingConverter = new SerializingConverter();
private Converter<byte[], Object> deserializingConverter = new DeserializingConverter();
private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; // 做一个空数组,不是null
@Override
public byte[] serialize(Object obj) throws SerializationException {
if (obj == null) { // 这个时候没有要序列化的对象出现,所以返回的字节数组应该就是一个空数组
return EMPTY_BYTE_ARRAY ;
}
return this.serializingConverter.convert(obj); // 将对象变为字节数组
}
@Override
public Object deserialize(byte[] data) throws SerializationException {
if (data == null || data.length == 0) { // 此时没有对象的内容信息
return null ;
}
return this.deserializingConverter.convert(data);
} }

2、 此时如果要想让 RedisTemplate 操作模版知道有这样一个序列化程序类存在,那么就不能够采用 RedisTemplate 默认配置形式, 需要准备一个单独的配置类进行处理:

package cn.study.microboot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer; import cn.study.microboot.util.redis.RedisObjectSerializer; @Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> getRedisTemplate(
RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
redisTemplate.setValueSerializer(new RedisObjectSerializer()); // value的序列化类型
return redisTemplate;
}
}

3、 进行程序的测试使用:

package cn.study.microboot.vo;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Member implements Serializable {
private String mid;
private Integer age;
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Member [mid=" + mid + ", age=" + age + "]";
}
}
package cn.study.microboot;
import javax.annotation.Resource; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import cn.mldn.microboot.vo.Member;
@SpringBootTest(classes = StartSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestRedis {
@Resource
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testGet() {
System.out.println(this.redisTemplate.opsForValue().get("study"));
}
@Test
public void testSet() {
Member vo = new Member() ;
vo.setMid("studyjava");
vo.setAge(19);
this.redisTemplate.opsForValue().set("study", vo);;
}
}

此时可以进行对象的序列化保存处理, 这样整体的数据存储的手段可以更加的丰富。

2.3、配置多个 RedisTemplate

由于在项目的实际开发过程之中 Redis 的使用会非常的频繁, 那么就有可能出现这样一种问题:现在的项目里面要求连接两 个 Redis 数据库。SpringBoot 里面针对于 Redis 的连接配置本质上只提供有一个连接配置项,那么如果你真的需要进行更多的 Redis 的连接配置,那么就需要自己来进行 Redis 的创建管理了。

1、 以非正规的形式修改 application.yml 配置文件:

spring:
redis:
host: 192.168.68.166
port: 6379
password: studyjava
timeout: 1000
database: 0
pool:
max-active: 10
max-idle: 8
min-idle: 2
max-wait: 100
redis-two:
host: 192.168.68.166
port: 6380
password: studyjava
timeout: 1000
database: 0
pool:
max-active: 10
max-idle: 8
min-idle: 2
max-wait: 100

2、 建立一个 RedisTwoConfig 的程序配置类,进行第二个 Redis 连接的配置处理:

package cn.study.microboot.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer; import cn.study.microboot.util.redis.RedisObjectSerializer;
import redis.clients.jedis.JedisPoolConfig; @Configuration
public class RedisTwoConfig {
public RedisConnectionFactory getRedisConnectionFactory(String hostName,
String password, int port, int maxActive, int maxIdle, int minIdle,
long maxWait, int database) { // 是负责建立Factory的连接工厂类
JedisConnectionFactory jedisFactory = new JedisConnectionFactory();
jedisFactory.setHostName(hostName);
jedisFactory.setPort(port);
jedisFactory.setPassword(password);
jedisFactory.setDatabase(database);
JedisPoolConfig poolConfig = new JedisPoolConfig(); // 进行连接池配置
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxWaitMillis(maxWait);
jedisFactory.setPoolConfig(poolConfig);
jedisFactory.afterPropertiesSet(); // 初始化连接池配置
return jedisFactory;
}
@Bean("redisTwo")
public RedisTemplate<String, Object> getRedisTemplate(
@Value("${spring.redis-two.host}") String hostName,
@Value("${spring.redis-two.password}") String password,
@Value("${spring.redis-two.port}") int port,
@Value("${spring.redis-two.database}") int database,
@Value("${spring.redis-two.pool.max-active}") int maxActive,
@Value("${spring.redis-two.pool.max-idle}") int maxIdle,
@Value("${spring.redis-two.pool.min-idle}") int minIdle,
@Value("${spring.redis-two.pool.max-wait}") long maxWait) { RedisConnectionFactory factory = this.getRedisConnectionFactory(
hostName, password, port, maxActive, maxIdle, minIdle, maxWait,
database); // 建立Redis的连接
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
redisTemplate.setValueSerializer(new RedisObjectSerializer()); // value的序列化类型
return redisTemplate;
}
}

3、 编写测试程序类:

package cn.study.microboot;
import javax.annotation.Resource; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration; import cn.study.microboot.vo.Member;
@SpringBootTest(classes = StartSpringBootMain.class)
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class TestRedisTwo {
@Resource(name="redisTwo")
private RedisTemplate<String, Object> redisTemplate;
@Test
public void testGet() {
System.out.println(this.redisTemplate.opsForValue().get("study"));
}
@Test
public void testSet() {
Member vo = new Member() ;
vo.setMid("studyjava");
vo.setAge(19);
this.redisTemplate.opsForValue().set("study", vo);;
}
}

在实际的工作之中由于 Redis 数据库的使用相当频繁,所以有很大的可能性是一个项目里面需要连接不同的 Redis 数据库。

3、总结

Redis 是一个重要的数据库产品,实际开发之中会利用 Redis 实现高并发的信息存储,所以多个 Redis 数据库的使用是一种常 见形式。

SpringBoot系列十:SpringBoot整合Redis的更多相关文章

  1. SpringBoot进阶教程(二十九)整合Redis 发布订阅

    SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...

  2. SpringBoot进阶教程(二十八)整合Redis事物

    Redis默认情况下,事务支持被禁用,必须通过设置setEnableTransactionSupport(true)为使用中的每个redistplate显式启用.这样做会强制将当前重新连接绑定到触发m ...

  3. SpringBoot进阶教程(二十六)整合Redis之共享Session

    集群现在越来越常见,当我们项目搭建了集群,就会产生session共享问题.因为session是保存在服务器上面的.那么解决这一问题,大致有三个方案,1.通过nginx的负载均衡其中一种ip绑定来实现( ...

  4. SpringBoot进阶教程(二十五)整合Redis之@Cacheable、@CachePut、@CacheEvict的应用

    在上一篇文章(<SpringBoot(二十四)整合Redis>)中,已经实现了Spring Boot对Redis的整合,既然已经讲到Cache了,今天就介绍介绍缓存注解.各家互联网产品现在 ...

  5. 实例讲解Springboot以Template方式整合Redis及序列化问题

    1 简介 之前讲过如何通过Docker安装Redis,也讲了Springboot以Repository方式整合Redis,建议阅读后再看本文效果更佳: (1) Docker安装Redis并介绍漂亮的可 ...

  6. SpringBoot进阶教程(二十四)整合Redis

    缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力.Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非 ...

  7. SpringBoot系列(十二)过滤器配置详解

    SpringBoot(十二)过滤器详解 往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件 ...

  8. springboot学习笔记-3 整合redis&mongodb

    一.整合redis 1.1 建立实体类 @Entity @Table(name="user") public class User implements Serializable ...

  9. SpringBoot学习- 5、整合Redis

    SpringBoot学习足迹 SpringBoot项目中访问Redis主要有两种方式:JedisPool和RedisTemplate,本文使用JedisPool 1.pom.xml添加dependen ...

随机推荐

  1. 用StyleCop规范团队代码

    前言 编码风格,每个人都是有不同的特点,风格各异,而且一个人在不同的时期,编码风格的差异也可能是非常大的,好比学生时代,刚工作的时候,工作一段时间后等. 在一个团队中,或一个项目中,如果出现了N种风格 ...

  2. spring源码分析之spring-jdbc模块详解

    0 概述 Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作.下表描述了哪些是spring帮助我们做好的,哪些是我们要做的. Action  Spring  You ...

  3. springboot集成下,mybatis的mapper代理对象究竟是如何生成的

    前言 开心一刻 中韩两学生辩论. 中:端午节是属于谁的? 韩:韩国人! 中:汉字是谁发明的? 韩:韩国人! 中:中医是属于谁的? 韩:韩国人! 中:那中国人到底发明过什么? 韩:韩国人! 前情回顾 M ...

  4. java web 项目打包(war 包)并部署

    1.在eclipse中右键单击项目,然后Export选择WAR file,生成项目的WAR文件.具体步骤请看图片详细操作步骤: 2.把生成的WAR文件放到tomcat解压之后的webapps文件夹下. ...

  5. Perl IO:操作系统层次的IO

    sysopen() open()和sysopen()都打开文件句柄,open()是比较高层次的打开文件句柄,sysopen()相对要底层一点.但它们打开的文件句柄并没有区别,只不过sysopen()有 ...

  6. 杭电ACM2015--偶数求和

    偶数求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. 用php输出心形曲线

    <?php for($t=0;$t<360;$t++) { $y=2*cos($t)-cos(2*$t); //笛卡尔心形曲线函数 $x=2*sin($t)-sin(2*$t); $x+= ...

  8. Flask 系列之 Migration

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 flask-migrate 实现数据库的迁移操 ...

  9. 深入理解 JavaScript 执行上下文和执行栈

    前言 如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制.执行上下文和执行栈是 JavaScript ...

  10. bootstrap思考一

    bootstrap是一种热门的Web前端流行框架,如果要兼容PC端.手机端和响应式布局,那他一定是我的首选.bootstrap内容很多,功能强大,其中最好入门也是很重要的就是他的栅格系统.他有四个典型 ...