SpringBoot整合Redis
前言
Redis 的优势及特性不必多言,大家应该都知道,那我们就直接进入正题。
源码
GitHub地址:https://github.com/intomylife/SpringBoot
环境
- JDK 1.8.0 +
- Maven 3.0 +
- Redis 2.4.2
- SpringBoot 2.0.3
开发工具
- IntelliJ IDEA
- redis-desktop-manager
正文
commons 工程 - POM 文件
<?xml version="1.0" encoding="UTF-8"?>
<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.zwc</groupId>
<artifactId>springboot-redis-commons</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 工程名称和描述 -->
<name>springboot-redis-commons</name>
<description>公用工程</description>
<!-- 在properties下声明相应的版本信息,然后在dependency下引用的时候用${spring-version}就可以引入该版本jar包了 -->
<properties>
<!-- 编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- jdk -->
<java.version>1.8</java.version>
<!-- springboot -->
<platform-bom.version>Cairo-SR3</platform-bom.version>
<!-- ali json -->
<fastjson.version>1.2.47</fastjson.version>
<!-- commons 组件 -->
<commons-pool2.version>2.6.0</commons-pool2.version>
</properties>
<!-- 加入依赖 -->
<dependencies>
<!-- redis 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- ali json 依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- commons 依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>${commons-pool2.version}</version>
</dependency>
</dependencies>
<!-- 依赖 jar 包版本管理的管理器 -->
<!-- 如果 dependencies 里的 dependency 自己没有声明 version 元素,那么 maven 就此处来找版本声明。 -->
<!-- 如果有,就会继承它;如果没有就会报错,告诉你没有版本信息 -->
<!-- 优先级:如果 dependencies 里的 dependency 已经声明了版本信息,就不会生效此处的版本信息了 -->
<dependencyManagement>
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>io.spring.platform</groupId>
<artifactId>platform-bom</artifactId>
<version>${platform-bom.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 插件依赖 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 配置一些共用依赖,其中包括 spring-boot-starter-data-redis 依赖用来整合 redis
commons 工程 - system.properties
# Redis 配置
## Redis 连接池最大连接数,默认为 8。如果为负则表示没有限制。
spring.redis.jedis.pool.max-active=8
## Redis 连接池最大阻塞等待时间,默认为 -1。如果为负则表示没有限制。
spring.redis.jedis.pool.max-wait=-1
## Redis 连接池中最大空闲连接,默认为 8。
spring.redis.jedis.pool.max-idle=8
## Redis 连接池中最小空闲连接,默认为 0。
spring.redis.lettuce.pool.min-idle=0
## Redis 连接超时时间
spring.redis.timeout=1000
- 一些共用配置,不经常修改的,或者是可以统一修改的
- 比如还可以配置 OSS 的配置信息,MyBatis-Plus 的配置信息,MongoDB 的配置信息等等..
commons 工程 - 自定义配置
package com.zwc.config;
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.io.Serializable;
/**
* @ClassName RedisConfig
* @Desc TODO Redis 配置
* @Date 2019/3/30 23:48
* @Version 1.0
*/
@Configuration
@PropertySource("classpath:system.properties")
public class RedisConfig {
/*
* @ClassName RedisConfig
* @Desc TODO 配置 redisTemplate,序列化 key 和 value
* @Date 2019/3/30 20:39
* @Version 1.0
*/
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
StringRedisSerializer keySerializer = new StringRedisSerializer();
GenericFastJsonRedisSerializer valueSerializer = new GenericFastJsonRedisSerializer();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 序列化 key 和 value
redisTemplate.setKeySerializer(keySerializer);
redisTemplate.setValueSerializer(valueSerializer);
redisTemplate.setHashKeySerializer(keySerializer);
redisTemplate.setHashValueSerializer(valueSerializer);
return redisTemplate;
}
}
- 注意这里在注入类的时候,还要加载自定的配置文件,因为 SpringBoot 不会默认加载 system.properties
commons 工程 - Redis 工具类
package com.zwc.utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* @ClassName RedisClient
* @Desc TODO Redis 工具类
* @Date 2019/3/30 23:53
* @Version 1.0
*/
@Component
public class RedisClient {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
/*
* @ClassName RedisClient
* @Desc TODO 设置缓存(没有时间限制)
* @Date 2019/3/30 23:55
* @Version 1.0
*/
public void set(String key, Object value){
redisTemplate.opsForValue().set(key, value);
}
/*
* @ClassName RedisClient
* @Desc TODO 设置缓存(有时间限制,单位为 秒)
* @Date 2019/3/30 23:55
* @Version 1.0
*/
public void set(String key, Object value,long timeout){
redisTemplate.opsForValue().set(key, value,timeout,TimeUnit.SECONDS);
}
/*
* @ClassName RedisClient
* @Desc TODO 删除缓存,并返回是否删除成功
* @Date 2019/3/31 14:19
* @Version 1.0
*/
public boolean delete(String key){
redisTemplate.delete(key);
// 如果还存在这个 key 就证明删除失败
if(redisTemplate.hasKey(key)){
return false;
// 不存在就证明删除成功
}else{
return true;
}
}
/*
* @ClassName RedisClient
* @Desc TODO 取出缓存
* @Date 2019/3/30 23:57
* @Version 1.0
*/
public Object get(String key){
redisTemplate.getExpire(key);
return redisTemplate.opsForValue().get(key);
}
/*
* @ClassName RedisClient
* @Desc TODO 获取失效时间(-2:失效 / -1:没有时间限制)
* @Date 2019/3/31 14:18
* @Version 1.0
*/
public long getExpire(String key){
// 判断是否存在
if(redisTemplate.hasKey(key)){
return redisTemplate.getExpire(key);
}else{
return Long.parseLong(-2+"");
}
}
}
- 通过自定义配置 @Configuration + @Bean 注解注入的 redisTemplate 对象来操作 Redis
- redisTemplate 对象里面含有全面的增删改查操作,这里封装了几个最常用的方法
commons 工程 - 项目结构
service 工程
service 工程是一个父工程,里面可能会包含 基础模块,用户模块,订单模块等等... 每个模块中又会分为 core 和 api
此工程中需要注意的就只有下面两个地方
service 工程 - base-service-core - application.properties
# Redis 配置
## Redis 数据库索引:默认为 0。Redis 一共有 16 个数据库,索引分别为 0-15。从 Redis 客户端也可以看出,从 db0 ~ db15。
spring.redis.database=2
## Redis 服务器地址
spring.redis.host=localhost
## Redis 服务器端口
spring.redis.port=6379
## Redis 服务器密码
spring.redis.password=
- 如果 Redis 没有设置密码,那么设置时就为空好了
- 虽然没有密码,但是配置信息还是要写在那
- 如何配置 Windows 本地 Redis 服务器的密码,在本文文末处有提到
service 工程 - base-service-core - service
... 省略部分代码
/**
* @ClassName UserService
* @Desc TODO springboot整合redis 实现服务类
* @Date 2019/3/31 14:06
* @Version 1.0
*/
@Service
public class UserService {
@Autowired
private RedisClient redisClient;
... 省略部分代码
}
- 因为RedisClient 工具类使用了 @Component 注解把其注册到了 spring 中,所以这里 @Autowired 注解自动装配进来
启用项目,调用接口
注:调用接口时需打开 redis-server.exe (在 windows 上运行的 Redis 服务器),要不然会报错
- 端口:8080(默认端口。具体可以根据自己的喜好,在 application.properties 配置文件中配置 server.port)
- 添加数据到 Redis 接口(没有设置失效时间):http://localhost:8080/user/addUser
- 添加数据到 Redis 接口(并且设置失效时间):http://localhost:8080/user/addUserAndExpire
- 从 Redis 中获取数据:http://localhost:8080/user/getUser
- 从 Redis 中获取数据失效时间:http://localhost:8080/user/getExpire
- 删除 Redis 中的数据:http://localhost:8080/user/deleteUser
service 工程 - 项目结构
- 在 service 总工程中创建了一个 base-service 的基础模块
- 每一个模块中都包含 api 和 core
- api:主要包含接口,常量以及实体类的扩展类
- core:带有启动类的工程,此模块的核心代码都在里面
把多工程项目使用 IntelliJ IDEA 打开
- 把项目从 GitHub 中下载到你的本地
- 打开 IntelliJ IDEA
- 点击 File -> Open
- 打开你下载到本地的项目目录
- springboot-redis -> springboot-redis-service(选择打开此工程)
- 打开 service 工程后
- 再次点击 File -> Project Structrue
- 选择 Modules,点击 '+' 符号
- 点击 Import Module
- 还是打开你下载到本地的项目目录
- springboot-redis -> springboot-redis-commons -> pom.xml
- 点击 ok
- 点击 Apply,OK
扩展
redis-win 如何设置密码
在本地开发时,通常会使用到 redis-win(在 windows 上运行的 Redis 服务器),但是它默认是没有密码的,
我们开发时也一般不会去设置这个。出于好奇,研究了一下如何设置 Redis 的密码。
1. 打开下载好的压缩文件,找到电脑对应的版本(32bit / 64bit)
2. 选择其一打开,只需要关注三个文件
a) redis.conf (Redis 的配置信息)
b) redis-cli.exe (Redis 的客户端)
c) redis-server.exe (Redis 的服务端)
3. 打开 redis.conf ,ctrl + F 查找 requirepass foobared
4. 紧接着下面写一行 requirepass your password(your password自行更改为你自己的密码)。特别注意要顶格写
5. 如果直接双击 redis-server.exe 重启是不会生效的,因为要通过 redis.conf 配置文件启动 redis-server.exe
6. 打开 cmd ,进入到你解压目录,进入到 32bit 或 64bit 目录后执行 redis-server.exe redis.conf
7. 打开 redis-cli.exe ,输入 keys * 来验证密码是否设置生效
8. 如果反馈信息为:(error) ERR operation not permitted,则证明设置生效
9. 输入 auth your password(your password自行更改为你自己的密码),正常反馈 OK
10. 再次输入 keys * 就会输出你本地 Redis 的全部 key 了
每次都用 cmd 启动会浪费很多时间,所以需要一个 bat 文件
@echo off
E:
cd tools\redis-2.4.2-win32-win64-fix\64bit\
redis-server.exe redis.conf
exit
注:上面 E: 为我本地磁盘路径,需要改成你自己解压文件的路径
E: -> 更改为你的本地磁盘路径
tools\redis-2.4.2-win32-win64-fix\64bit\ -> 更改为你的解压目录路径
其他的不需要改动了
结语
到此 SpringBoot 整合 Redis 就结束了,关键的点就这么多,多多尝试,一定会成功的!
希望能够帮助到你
over