概述
SpringBoot连接Redis服务
1、前期准备
- redis环境服务的安装
- redis服务器防火墙端口的开放
- redis配置文件redis.conf中bind修改
- 开发工具:idea
2、目标
快速构建Springboot+SSM+Redis+Swagger集成框架
3、具体流程
3.1 pom.xml整合SSM+Redis+Swagger相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--这里就是redis的核心jar包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-avro</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<!--guava限流-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- 文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.8.5</version>
</dependency>
3.2 配置文件配置
server:
port: 8080
spring:
main:
allow-bean-definition-overriding: true
thymeleaf:
cache: false
prefix: classpath:/templates/
mode: HTML
encoding: UTF-8
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
locale: zh_CN
# 解决json返回过程中long的精度丢失问题
generator:
write-numbers-as-strings: true
write-bigdecimal-as-plain: true
# 配置redis
redis:
database: 0
password: mkxiaoer
host: 101.132.122.79
port: 6379
# 数据库连接配置
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
hikari:
connection-timeout: 60000
validation-timeout: 3000
idle-timeout: 60000
login-timeout: 5
max-lifetime: 60000
maximum-pool-size: 400
minimum-idle: 100
read-only: false
# mybatis-plus配置
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath*:/mapper/*.xml
type-aliases-package: com.example.entity
3.3 swagger配置
package com.example.config;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootConfiguration
@EnableSwagger2
public class SwaggerConfiguration {
/**
* 在完成上述配置之后,其实就已经可以产生帮助文档了,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生。
* 对用户体验不好,我们通常需要自己增加一些说明来丰富文档内容。如果:
* 加入
*
* @ApiIgnore 忽略暴露的 api
* @ApiOperation(value = "查找", notes = "根据用户 ID 查找用户")
* 添加说明
* <p>
* <p>
* 其他注解:
* @Api :用在类上,说明该类的作用
* @ApiImplicitParams :用在方法上包含一组参数说明
* @ApiResponses :用于表示一组响应
* 完成上述之后,启动springboot程序,
* 旧访问:http://localhost:8080/swagger-ui.html
* 新访问:http://localhost:8080/doc.html
* @ApiOperation() 用于方法;表示一个http请求的操作
* value用于方法描述
* notes用于提示内容
* tags可以重新分组(视情况而用)
* @ApiParam() 用于方法,参数,字段说明;表示对参数的添加元数据(说明或是否必填等)
* name–参数名
* value–参数说明
* required–是否必填
* @ApiModel()用于类 ;表示对类进行说明,用于参数用实体类接收
* value–表示对象名
* description–描述
* 都可省略
* @ApiModelProperty()用于方法,字段; 表示对model属性的说明或者数据操作更改
* value–字段说明
* name–重写属性名字
* dataType–重写属性类型
* required–是否必填
* example–举例说明
* hidden–隐藏
* @ApiIgnore()用于类或者方法上,可以不被swagger显示在页面上 比较简单, 这里不做举例
* @ApiImplicitParam() 用于方法
* 表示单独的请求参数
* @ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam
* name–参数ming
* value–参数说明
* dataType–数据类型
* paramType–参数类型
* example–举例说明
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(getApiInfo())
.select()
// 核心:读取把那个包下面的方法作为接口,只能是:controller
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo getApiInfo() {
return new ApiInfoBuilder()
.title("测试项目数据接口")
.description("测试项目数据接口,在线体验文档")
.termsOfServiceUrl("https://api.taoyuan.com/api")
.contact("刘备,关羽,张飞")
.version("1.0")
.build();
}
}
3.4 测试redis服务是否连接成功
package com.example;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class StudyRedisStringApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("age","34");
}
}
4、redis默认情况下,key是对象状态,key前面会有前缀
通过客户端连接以后:
> src/redis-cli
> auth mkxiaoer
> get age
nil
nil是空的。并不是没存进去,而是因为redistemplate默认情况下:key和value 都会以对象的方式序列化存在到redis服务器中。
127.0.0.1:6379> keys *
1) "xacxedx00x05tx00x03age"
2) "name"
127.0.0.1:6379> get "xacxedx00x05tx00x03age"
"xacxedx00x05tx00x0234"
通过修改RedisTemplate的对key和value的序列化就可以进行修改。
5、Redis能够存储java对象吗?
答案:可以,但是对象必须要序列化。
package com.example;
import com.example.entiy.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
@SpringBootTest
class StudyRedisStringApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void contextLoads() {
redisTemplate.opsForValue().set("age","34");
Object age = redisTemplate.opsForValue().get("age");
System.out.println(age);
}
@Test
void saveUserToRedis() {
User user = new User();
user.setId(1);
user.setNickname("yykk");
user.setPassword("123456");
// 存储一个java对象
redisTemplate.opsForValue().set("user"+user.getId(),user);
}
}
通过测试会报错:
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.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.kuangstudy.entiy.User]
redis没有办法把一个没有序列化的对象存储到redis中。
package com.example.entiy;
public class User implements java.io.Serializable{
private Integer id;
private String nickname;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
通过序列化以后,确实可以讲java的对象存储到redis服务中、存储的格式如下:
127.0.0.1:6379> keys *
1) "xacxedx00x05tx00x03age"
2) "name"
3) "xacxedx00x05tx00x05user1"
127.0.0.1:6379> get "xacxedx00x05tx00x05user1"
"xacxedx00x05srx00x19com.kuangstudy.entiy.Userzxbax88xd3/xc6ux90x02x00x03Lx00x02idtx00x13Ljava/lang/Integer;Lx00bnicknametx00x12Ljava/lang/String;Lx00bpasswordqx00~x00x02xpsrx00x11java.lang.Integerx12xe2xa0xa4xf7x81x878x02x00x01Ix00x05valuexrx00x10java.lang.Numberx86xacx95x1dx0bx94xe0x8bx02x00x00xpx00x00x00x01tx00x04yykktx00x06123456"
分析
- key = “xacxedx00x05tx00x05user1”
- value = “xacxedx00x05srx00x19com.kuangstudy.entiy.Userzxbax88xd3/xc6ux90x02x00x03Lx00x02idtx00x13Ljava/lang/Integer;Lx00bnicknametx00x12Ljava/lang/String;Lx00bpasswordqx00~x00x02xpsrx00x11java.lang.Integerx12xe2xa0xa4xf7x81x878x02x00x01Ix00x05valuexrx00x10java.lang.Numberx86xacx95x1dx0bx94xe0x8bx02x00x00xpx00x00x00x01tx00x04yykktx00x06123456”
上面的逻辑是正确的,如果不考虑阅读和操作复杂度的话,其实是可以不用修改的。
优化方案:
- key – 一定string类型
- value - json进行存储,
6、RedisTemplate序列化
默认情况下RedisTemplate使用的是JackSerializationRedisSerializer ;会出现两个问题
- 需要存储的对象必须实现
java.io.Serializable
接口
public class User implements java.io.Serializable
- 被序列化的对象的key会出现乱码问题,导致key和value可读性很差
127.0.0.1:6379> keys *1) "xacxedx00x05tx00x06user:1"127.0.0.1:6379> get "xacxedx00x05tx00x06user:1""xacxedx00x05srx00x1acom.kuangstudy.entity.Userx8fxx00x00x01yx88&xd9pxsrx00x11java.lang.Integerx12xe2xa0xa4xf7x81x878x02x00x01Ix00x05valuexrx00x10java.lang.Numberx86xacx95x1dx0bx94xe0x8bx02x00x00xpx00x00x00x01ptx00x11xe5xadxa6xe7x9bxb8xe4xbcxb4xe7x94xa8xe6x88xb7_0tx00a1234560sqx00~x00ax00x00x00x00sqx00~x00x05wbx00x00x01yx88&xd9px"
解决方案:
package com.example.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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfiguration {
/**
* @return org.springframework.data.redis.core.RedisTemplate<java.lang.String, java.lang.Object>
* @Author
* @Description 改写redistemplate序列化规则
* @Date 13:20 2021/5/20
* @Param [redisConnectionFactory]
**/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 创建一个json的序列化方式
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置value用jackson进行处理
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置key用string序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
最后
以上就是有魅力心情为你收集整理的SpringBoot连接Redis服务的全部内容,希望文章能够帮你解决SpringBoot连接Redis服务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复