如何通过SpringBoot去整合我们的Redis,这里我们先对SpringBoot Redis做一个简单的介绍,其实SpringBoot Redis,
和我们之前讲的Spring JPA都是Spring Data下的一个模块,其实不同的是什么呢,Spring Data JPA,我们对数据库操作
的一些行为,那么SpringBoot Data Redis,简化了我们在项目当中,如果使用Redis的话,对于Redis操作的一些行为,
当然SpringBoot Data除了我们说的那两个模块之外,还有JDBC,还有MongoDB,这都是他在SpringData下提供的模块,
这些模块的出发点呢,也是针对了如果我们项目当中使用了这些技术,那么他就可以去简化技术操作的一些行为,现在我们
把笔记整理一下,SpringData Redis他是什么呢,Spring Data Redis是属于Spring Data下的一个模块,然后他的作用是
什么呢,就是简化对于Redis的一个操作,这是他的一个作用,然后接下来我们看一下,如何在我们的代码当中,如何使用
SpringBoot去整合Redis,首先打开我们的eclipse,我们先去创建一个项目,这里我们就快速创建一个,在我们的项目当中
找一个最简单的,首先对pom文件做一个修改,项目修改完以后,我们接下来看,我们既然想整合Spring Data Redis,我们要
在项目当中添加相应的坐标,在这里我们添加一个坐标
<!-- Spring Data Redis的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
提供了一个启动器,那么这个启动器的名字叫什么呢,spring-boot-starter-data-redis,我们把这个坐标加入以后,
看一下Maven Dependecies,把它展开,会多了一个Spring-data-redis的一个jar包,这是Spring data整合Redis的
一个核心jar包,除此之外还会多一个jedis的jar包,这个jedis jar包大家不陌生了,其实jedis的主要作用是提供了
JAVA操作redis的一套API,我们以前用spring整合redis的时候也用了这个jar包,所以这两个jar包进来以后,就可以
使用spring data redis去做相应的开发,第一步我们把坐标加进来之后呢,在这里我们先回顾一下,如果我们用Spring
整合Redis的时候,需要怎么做,大家应该还有印象,我们需要在Spring当中,添加一个对于Redis的一个配置文件,
那么在配置文件当中呢,我们可能要配这么几个东西,比如我们要做一个Redis的连接,起码我们要在配置文件中去配一个叫
Jedis Pool Config的对象,然后里面给一些连接池的信息,当然你如果不配Jedis Pool Config,他也会有一个默认的
参数值的设定,大家应该还记得,我们除了要配这个以外呢,其次我们还要配一个Jedis的客户端,如果你要是单机版的,
Jedis Client,如果是集群版的呢,Jedis Cluster,其实我们现在用SpringBoot来整合我们的Redis,也得去做,只不过在
配置整合他的时候呢,我们在SpringBoot当中,不需要再去创建配置文件了,我们把以往在配置文件里的配置,现在全部
移植到了代码当中,通过注解加方法,来实现这样一个配置,那我们看一下代码当中怎么去做呢,首先我们打开项目,我可以
在项目下去新建一个类,这个类当然你放到哪个包下都行,放到这个config包下,然后我给他起个名,这个名称你叫什么都行,
比如我叫RedisConfig,那么这个类的作用是什么呢,完成对于Redis整合的一些配置,我们在这里要配置一些连接池,Redis的
连接池,RedisConfig可以,我们还要将连接池注入给客户端,把我们原来在xml里面所做的,全移植到类当中了,这个类肯定
是一个配置类,既然是配置类了,我们肯定要让SpringBoot去启动的时候,去初始化他,这个时候我们要用到一个@Annotation,
@Configuration,其实这个Annotation并不陌生了,之前用过,这个是SpringBoot的配置注解,在哪个类上加上注解,要去加载
这个类,我们加载这个类的目的,方法对Redis做一个配置,所以这里还要提供一些方法,至于提供几个方法,完全由我们自己
来设计,总而言之你需要在方法当中,最后返回一个RedisTemplate的一个对象就可以了,你也可以在一个方法上去完成所有的
配置,你也可以放到不同的方法上去实现,那么为了我们便于理解,我们就采用分解的形式,来对他做一个配置,JedisPoolConfig
参数的配置,那如果需要做这个事的话,我这个方法要怎么编写呢,创建JedisPoolConfig
/**
* 1.创建JedisPoolConfig对象。在该对象中完成一些链接池配置
*
*/
@Bean
public JedisPoolConfig jedisPoolConfig(){
JedisPoolConfig config = new JedisPoolConfig();
//最大空闲数
config.setMaxIdle(10);
//最小空闲数
config.setMinIdle(5);
//最大链接数
config.setMaxTotal(20);
return config;
}
那么这个方法怎么写呢,其实这个方法不管你叫什么名,你只要返回一个JedisPoolConfig对象就可以了,你叫什么都行,
我们叫jedisPoolConfig,然后这个方法也是要让SpringBoot去执行的一个方法,那么对于这样的方法呢,上面也要加一个
@Bean的注解,这个注解我们之前也用过,这个注解最大的特点就是,SpringBoot在启动时,对于@Configuration这样的类,
会加载同时去执行一下@Bean标记的方法,其实说白了,@Bean标记和我们配置文件当中Bean标签是一个含义的,并且把这个
方法和返回的对象,放到SpringIOC容器里去缓存,就是这个意思,那在这个方法里肯定要返回一个pool对象,那么在这里我们先去创建他,
如果你在这里没有对JedisPoolConfig做任何配置,那么他就会走连接池默认的配置,我们也可以做自己所需要的配置,这里有一个
setMaxIdle,这个就是配置最大空闲数的,除了最大空闲数以外呢,minIdle,这是最小空闲数,除此之外还有一个最大连接数,
这些值可以根据你的实际情况来处理,我就暂时先配置这些,这样我们就完成了一些简单的配置,SpringBoot对于方法一执行,
我们创建的JedisPoolConfig放到IOC里面去,然后接下来第二步,我们要去创建一个JedisConnectionFactory这样的一个对象
/**
* 2.创建JedisConnectionFactory:配置redis链接信息
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config){
JedisConnectionFactory factory = new JedisConnectionFactory();
//关联链接池的配置对象
factory.setPoolConfig(config);
//配置链接Redis的信息
//主机地址
factory.setHostName("10.40.8.152");
//端口
factory.setPort(6379);
return factory;
}
这个对象主要是为了,需要把我们刚才创建的JedisPoolConfig,还有redis的一些连接配置,也是在这个方法里完成的,我们来
写一个吧,这是第二步,这个对象叫JedisConnectionFactory,通过他来配置我们的连接参数,这个也要让Spring来做一个执行,
所以我要加一个@Bean,就是返回JedisConnectionFactory,在方法里我去创建这个对象,这个方法其实我们是需要一个参数了,
就是把我们刚刚创建的连接池的对象拿过来,这个时候在Spring的IOC容器里已经有了,所以让SpringBoot执行这个方法的时候,
把这个对象拿过来,放到这里,然后我们通过这个对象,把我们的JedisPoolConfig传到里面,这样就完成了配置信息的一个关联,
接下来我们就要配置Redis的一些信息,这个是关联连接池的配置对象,接下来配置连接Redis的信息,比如我们要知道Redis在什么
位置,我们给定当前Redis所在的当前地址,我们的Redis装到了Linux当中,这个是我们运行Redis的服务器,然后我们可以去配置
Redis的端口,Redis里监听了这个端口,接下来是Redis的端口,端口我们并没有对他做修改,默认的是6379,这样就配置好了,
这里你还可以设置他的database,我们Redis装完以后,是有16个库,然后他他的下标是0到15,这块会给一个索引,如果没给默认的就是
0的库,下标所以为0的,那这里我们不给了,然后return factory,这样第二步创建JedisConnectionFactory,接下来就是我们的
第三步,第三步我们要去创建什么呢,这个就是要创建SpringBoot Redis,操作Redis的一个缓存模板对象,创建RedisTemplate,
这个模板对象呢,就是里面封装了一些API,让我们去对Redis操作,以前用Spring整合Redis的时候,我这里面还要去定义一些方法,
自己去定义一些Redis操作的行为,然后通过调用这个方法,这些都在RedisTemplate里面封装了,这个对象的作用就是,
用于执行操作Redis的方法,还是加一个@Bean,这个对象叫RedisTemplate,其实泛型就是你要操作的数据类型,比如Key
是String类型的,value可以给一个Object,然后方法名叫redisTemplate
/**
* 3.创建RedisTemplate:用于执行Redis操作的方法
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(JedisConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//为key设置序列化器
template.setKeySerializer(new StringRedisSerializer());
//为value设置序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
这个方法里需要一个参数,就是我们刚刚创建的JedisConnectionFactory,因为只有通过它才知道,去对哪个Redis
进行操作,通过他的参数传递过来,在这里我们还是得创建一个对象,然后我们要把JedisConnectionFactory对象,
注入给他,我们还有这样的一个工作需要去做,RedisTemplate这个对象,他所提供的API,在Redis操作的时候,
他需要我们设置一个对key和value序列化对象的一个指定,序列化的一个指定,我们来看一下序列化对象是什么意思,
org\springframework\data\spring-data-redis\1.8.11.RELEASE\spring-data-redis-1.8.11.RELEASE.jar
org.springframework.data.redis.serializer
这些是序列化器,这些序列化器呢,主要的作用是为了让我们向Redis里面存储数据的时候,对key和value做了一些序列化的
操作,这么说可能挺抽象的,举个例子,原来我们使用Spring整合Redis的时候,我现在想将一个对象,存到Redis里,怎么办,
我们肯定不能直接把某个对象扔到Redis里,这个时候我们需要用到一个工具类,比如说你可以通过JSON的格式,用一个
JSON的工具类,先把你的对象转成JSON,然后把转化完的字符串,放到Redis里去存储,Redis的特点呢,这个种key和value的
结合,存的内容就是字符串,字符串的形式去存的,不管你是使用的String类型还是List类型,比如String类型和List类型,
最大的区别是组织方式上会有一些区别而已,其他的存的都是字符类型,所以这块我就直接给他一个对象,没法去给你存
这个对象,那么我们就必须去给他做一个转换的处理,那么在我们Spring Data Redis当中呢,其实就为你准备了一些
序列化器,可以根据一个序列化器,去做一个对象到序列化的一个处理器,这样我们就变得容易的多了,换句话说有了序列化
器了,转换的工具就不需要了,比如我们先操作String类型为主,叫StringRedisSerializer,是针对于字符串的序列化器,
那么我们这里要对谁进行序列化器的一个使用呢,两个,一个是他的key,一个是他的value,我们要用哪个序列化器我们
就去用谁,字符串的序列化器
template.setKeySerializer(new StringRedisSerializer());
这个是给key设置序列化器,也就是key都是可以是自定义的对象了,他就会根据序列化器序列化我们的对象,序列化到
字符串的一个转换,然后我们还得给我们的value设置一个序列化器
template.setValueSerializer(new StringRedisSerializer());
还是new一个字符串的序列化器,这样我们SpringBoot去整合Redis,整合工作就已经配置好了,你可以把这写整合成一个,
这里只返回一个RedisTemplate,然后把这些行为放到一个方法里,返回RedisTemplate,这也是可以的,所以这也是为了讲解
一个配置过程,编写Spring Data Redis的配置类
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.learn</groupId>
<artifactId>spring-boot-redis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- springBoot的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Data Redis的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
</project>
package com.learn.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.JedisPoolConfig;
/**
* 完成对Redis的整合的一些配置
*/
@Configuration
public class RedisConfig {
/**
* 1.创建JedisPoolConfig对象。在该对象中完成一些链接池配置
*
*/
@Bean
public JedisPoolConfig jedisPoolConfig(){
JedisPoolConfig config = new JedisPoolConfig();
//最大空闲数
config.setMaxIdle(10);
//最小空闲数
config.setMinIdle(5);
//最大链接数
config.setMaxTotal(20);
return config;
}
/**
* 2.创建JedisConnectionFactory:配置redis链接信息
*/
@Bean
public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config){
JedisConnectionFactory factory = new JedisConnectionFactory();
//关联链接池的配置对象
factory.setPoolConfig(config);
//配置链接Redis的信息
//主机地址
factory.setHostName("10.40.8.152");
//端口
factory.setPort(6379);
factory.setPassword("1234");
return factory;
}
/**
* 3.创建RedisTemplate:用于执行Redis操作的方法
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(JedisConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
//关联
template.setConnectionFactory(factory);
//为key设置序列化器
template.setKeySerializer(new StringRedisSerializer());
//为value设置序列化器
template.setValueSerializer(new StringRedisSerializer());
return template;
}
}