Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。
springboot项目中一般不直接使用Jedis进行redis连接等操作了,因为集成了Spring-data-redis,所以一般直接使用Spring-data-redis即可,非常得方便。
一、RedisTemplate 简单使用
1)引入依赖:
<!--redis相关的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2) 配置文件:
spring:
redis:
port: 6379
# Redis服务器地址
host: localhost
# Redis数据库索引(默认为0)
database: 0
# Redis服务器连接密码(默认为空)
password: 123456
# 连接超时时间(毫秒)
timeout: 5000ms
# 连接池最大连接数(使用负值表示没有限制)
jedis:
pool:
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
3) 简单调用
实际上引入依赖 以及 添加好配置文件之后就可以进行api调用了,调用方式很简单只需要使用@Autowired注解将RedisTemplate进行注入即可:
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/aaa")
public boolean test() {
redisTemplate.opsForValue().set("name", "123456");
return true;
}
简单写个接口demo,上面的语句就是设置一个key为name,value为123456得数据。这样就可以了。但是虽然存储成功了,去redis中查看发现,存储是这样的:
左边得是key,右边得是value,会发现存储得类型是一串很奇怪得数据。
这是因为redis序列化方式得问题,需要简单说一下redisTemplate的序列化机制。
二、RedisTemplate序列化方式
1)RedisTemplate源码:
序列化需要注意的是这四个属性:
keySerializer
:1、用途:这个属性定义了 RedisTemplate 如何序列化和反序列化 Redis 键(key)的数据类型。
2、默认值:默认为
null
,如果不设置,会使用 RedisTemplate 的默认键序列化器。
valueSerializer
:1、用途:这个属性定义了 RedisTemplate 如何序列化和反序列化 Redis 值(value)的数据类型。
2、默认值:默认为
null
,如果不设置,会使用 RedisTemplate 的默认值序列化器。
hashKeySerializer
:1、用途:这个属性定义了 RedisTemplate 如何序列化和反序列化 Redis 哈希的键的数据类型(在使用 Hash 类型时)。
2、默认值:默认为
null
,如果不设置,会使用 RedisTemplate 的默认哈希键序列化器。
hashValueSerializer
:1、用途:这个属性定义了 RedisTemplate 如何序列化和反序列化 Redis 哈希的值的数据类型(在使用 Hash 类型时)
2、默认值:默认为
null
,如果不设置,会使用 RedisTemplate 的默认哈希值序列化器。
这四个属性就是redis在存取数据时对应的序列化的方式。会发现这个四个属性都是RedisSerializer类型的,所以如果要设置对应的序列化属性,我们就需要使用RedisSerializer对应的实现类即可。
2)RedisSerializer 接口的实现类
RedisSerializer 接口的实现类 有如下几种:
也就是说我们要设置序列化方式,使用上面的实现类进行实现即可。
归类一下可以分为:
- JDK 序列化方式 (默认)
- String 序列化方式
- SON 序列化方式
- XML 序列化方式
3)序列化方式 :
1.JDK 序列化方式 (默认)
org.springframework.data.redis.serializer.JdkSerializationRedisSerializer
,默认情况下,RedisTemplate 使用该数据列化方式。
Spring Boot 自动化配置 RedisTemplate Bean 对象时,就未设置默认的序列化方式。绝大多数情况下,不推荐使用 JdkSerializationRedisSerializer 进行序列化。主要是不方便人工排查数据。上面的demo种就是这样,我们会发现KEY 前面带着奇怪的 16 进制字符 , VALUE 也是一串奇怪的 16 进制字符。所以序列化成这样非常不方便我们进行排查。
2)String 序列化方式
org.springframework.data.redis.serializer.StringRedisSerializer
,字符串和二进制数组的直接转换
一般我们key值都是使用 String 类型得序列化方式。
3)JSON 序列化方式
org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer
使用 Jackson 实现 JSON 的序列化方式,并且从 Generic 单词可以看出,是支持所有类。
这里需要简单得讲解一下,先看一下使用这个类序列化后得结果:
标准得json格式:
{
"id": 100,
"name": "小工匠",
"sex": "Male"
}
使用GenericJackson2JsonRedisSerializer 后得序列化格式:
{
"@class": "com.artisan.domain.Artisan",
"id": 100,
"name": "小工匠",
"sex": "Male"
}
会发现同一个对象,序列化后的内容不太一样,其实可以简单理解为,GenericJackson2JsonRedisSerializer
在序列化对象时,会将对象的对应的全类名也存储下来,这样在反序列化时,就可以直接通过全类名,直接反序列化为对应的对象类型。
4.XML 序列化方式
org.springframework.data.redis.serializer.OxmSerializer
使用 Spring OXM 实现将对象和 String 的转换,从而 String 和二进制数组的转换。 没见过哪个项目用过,不啰嗦了
https://www.cnblogs.com/csjoz/p/16337145.html