前景提要:这篇文章可以
快速了解RedisTemplate
,并没有去详细介绍RedisTemplate的API
,如果想要了解API的,可以去看一下API文档,或者用到具体的方法在Idea里,直接点进去RedisTemplate源码,找需要的方法。
文章目录
零. 简单了解RedisTemplate
了解RedisTemplate之前先来了解SpringData
SpringData
是Spring中数据操作的模块
,包含对各种数据库的集成
(最常见的是JdbcTemplate,只不过平常开发中用MyBatis的比较多),其中对Redis命令的集成模块(可以理解为封装
)是SpringDataRedis,SpringDataRedis有很多东西,其中RedisTemplate是最上层的,提供许多API
,用来操作Redis.
一.RedisTemplate的特点
- 将
不同数据类型的API操作封装到不同类型
中
API | 返回值类型 | 对应数据类型 |
---|---|---|
redisTemplate.opsForValue() | ValueOperations | String类型 |
redisTemplate.opsForHash() | HashOperations | Hash类型 |
reidsTemplate.opsForList() | ListOperations | Lsit类型 |
reidsTemplate.opsForSet() | SetOperations | Set类型 |
redisTemplate.opsForZSet() | ZSetOperations | SortSet类型 |
二.更形象的了解RedisTemplate
在一些项目中,redis是单独部署在一个服务器上的
,想要实现与Redis的交互
,就必须与Redis实现远程通信,然后将命令发送,这是Redis客户端
的实现,现在可以通过RedisTemplate,RedisTemplate封装了redis的客户端命令
,和连接池等复杂操作,现在只需要调用Redis的方法,就可以实现与Redis的远程交互,这也是RedisTempalte的一个优点。
三. 快速使用
RedisTempalte
- 引入
依赖
<dependency>
<groupId>org.springframework.boot<groupId>
<artifactId>spring-boot-starter-data-reids<artifactId>
</dependency>
<dependency>
<groupId>org.apaache.common</groupId>
<artfactId>commons-pool2</artfactId>
</dependency>
配置
内容
spring:
redis:
host: ip地址
port: 端口号
password: 密码(在redis配置文件可以设置,如果直接买,上面会有密码)
lettuce:
pool:
max-active: 最大连接(以下都是连接池的配置,必须要配置的不然redis不能生效)
max-idle: 最大空闲连接
min-idle: 最小空闲连接
max-wait: 100ms 连接等待时间100毫秒
- 在需要使用的类中,
注入
RedisTemplate
@Autowired
private RedisTemplate redisTemplate;
- 使用的时候,调用redisTemplate的API
//插入一条String类型的数据
redisTemplate.opsForValue().set("name","我是海绵宝宝");
四. RedisSerialize–Redis的序列化工具
redisTemplate的set()参数是String Object,默会对Object序列化,例如下面
虽然set()的值是字符串,但是会序列化然后存在Redis,如果在Redis库里会发现值是类似乱码的东西。同时取值get()会自动进行一个反序列化的一个东西,这对使用者是透明的
。
//
redisTemplate.opsForValue().set("name","我是海绵宝宝");
五. 对Redis序列化的源码分析
- 首先会创建一个
默认的JDK序列化器
defaultSerialize=new JdkSerializationRedisSerialize(参数);
- 调用set()是部分源码,在
return时调用了序列化方法
return valueSerializer().serialize(value);
知识小贴士:序列化的概念,序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。
六. 如何修改Redis序列化方式
?
需求:在写项目中,大多使用JSON传输
,这样的话,需要 将value序列化为JSON格式的。
解决: 上面提到默认使用的是JDK序列化器,现在只需要改成JSON的序列化器
,更改配置
@Configuration
public class RedisConfig{
@Bean
public RedisTemplate<String,Obejct> redisTeplate(RedisConnectFactoru redisConnectFatory)
{
//创建RedisTempalte对象
//设置连接工厂
//设置key序列化
redisTempalte.setKey()
//设置value的序列化
redisTemplate.setValueSerializer(jsonRedisSerializer);
//返回
}
}
JDK序列化器与JSON序列化器的区别
?
- JDK序列化器是将
对象转化为字节
- JSON序列化器将
对象转换成JSON格式的字符串
七. 实现手动序列化
虽然RedisTemplate能自动
实现序列化与反序列化的过程,但是也有一定弊端
,在反序列化时需要知道反序列化对象的类型
,RedisTemplate将对象的全类名写入Redis
进行存入,在大型项目中,百万级数据就会浪费空间
,所以选择手动序列化
Spring提供了StringRedisTemplate
,StringRedis只能存储String类型的key-value
.可以直接将序列化好的值存入Redis,项目中常常使用
这种方法,一是使用同一的序列化工具,二是降低额外开销