# redisTemplate
**Repository Path**: wl8888/redisTemplate
## Basic Information
- **Project Name**: redisTemplate
- **Description**: SpringDataRedis简介
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,[官网地址](https://spring.io/projects/spring-data-redis)
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-05-17
- **Last Updated**: 2023-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
@[TOC](SpringDataRedis)
# SpringDataRedis简介
SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,[官网地址](https://spring.io/projects/spring-data-redis)
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 提供了RedisTemplate统一API来操作Redis
- 支持Redis的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
- 支持基于Redis的JDKCollection实现
# RedisTemplate对Redis操作类型
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

# SpringDataRedis快速入门
**SpringDataRedis的使用步骤:**
> 1、引入spring-boot-starter-data-redis依赖
2、在application.yml配置Redis信息
3、注入RedisTemplate
## 1、引入spring-boot-starter-data-redis依赖
```xml
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
```
## 2、在application.properties配置Redis信息
```java
server.port=8087
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=123456
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=30000
```
## 3、注入RedisTemplate并测试
```java
@SpringBootTest
class RedisTemplateApplicationTests {
@Autowired
private RedisTemplate redisTemplate;
@Test
void testString() {
redisTemplate.opsForValue().set("name","李四");
Object name = redisTemplate.opsForValue().get("name");
System.out.println("name = " + name);
}
}
```

# SpringDataRedis的序列化方式
## 现象分析
在控制台能够看见正常的key和value,但是我们通过redis客户端查看时发现结果是这样的。

==RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化;==
**缺点:**
- 可读性差
- 内存占用较大
查看源码RedisTemplate可以发现默认是采用JDK序列化;

通过debug观察redisTemplate.opsForValue().set("name","李四");怎样将name进行jdk序列化的

## SpringDataRedis的序列化方式
我们希望在redis中存的,所见及所得,而不是进行jdk序列化之后的样子,所以我们需要改变序列化方式。

StringRedisSerializer
>如果key 或者hashkey都是字符串一般用它
GenericJackson2JsonRedisSerializer
>value有可能是对象就用他,转json字符串的序列化方式
```java
@Configuration
public class RedisConfig {
/**
* 描述信息: key和hashKey采用string序列化方式 alue和hashValue采用Json序列化方式
*
* @date 2023/05/17
* @param redisConnectionFactory
* @return org.springframework.data.redis.core.RedisTemplate
**/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//创建Template
RedisTemplate redisTemplate = new RedisTemplate<>();
//设置连接工厂
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
//key和hashKey采用string序列化方式
redisTemplate.setKeySerializer(RedisSerializer.string());
redisTemplate.setHashKeySerializer(RedisSerializer.string());
//value和hashValue采用Json序列化方式
redisTemplate.setValueSerializer(jsonRedisSerializer);
redisTemplate.setHashValueSerializer(jsonRedisSerializer);
return redisTemplate;
}
}
```
平时开发中不用单独引入jackson依赖,springmvc自带jackson依赖;现在demo中没有引入mvc,需要手动添加一下jsckson
```xml
com.fasterxml.jackson.core
jackson-databind
```
再次测试

## redisTemplate保存对象测试
```java
@Test
void testSaveUser() {
redisTemplate.opsForValue().set("user:100",new User("小红",29));
User user = (User) redisTemplate.opsForValue().get("user:100");
System.out.println("user = " + user);
}
```

**分析**
尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图:
为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。
# 实际开发中使用redis方式(重要)
为了节省内存空间,我们并不会使用JSON序列化器来处理value,而是统一使用String序列化器,要求只能存储String类型的key和value。当需要存储Java对象时,手动完成对象的序列化和反序列化。

详细使用在以下博客中说明,里面包含了生产项目中使用的工具类
[springBoot整合redis使用介绍(详细案例)](https://blog.csdn.net/weixin_43811057/article/details/120382906)