SpringBoot整合Redis
suichentree 11/16/2023 RedisSpringBoot
[toc]
# SpringBoot整合Redis
目前大部分的微服务项目,都是基于 SpringBoot 框架进行快速开发,在 SpringBoot 项目中我们应该如何使用 Redis。
① 创建springboot项目 ② 添加springboot的redis启动包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1
2
3
4
2
3
4
springboot项目默认继承一个父工程,而这个redis依赖的版本继承自父工程。
③ 在配置文件中配置redis
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
注意从SpringBoot 2.x开始,spring-boot-starter-data-redis默认集成的java客户端是Lettuce。
④ 测试代码
SpringBoot提供了一个高度封装的RedisTemplate类来操作redis的各个命令,通过RedisTemplate提供的方法,就可以操作redis。
RedisTemplate工具类常用方法
代码如下
@RestController
@RequestMapping("/redis")
public class redisController {
@Autowired
private RedisTemplate redisTemplate;
//StringRedisTemplate是RedisTemplate的子类
//StringRedisTemplate专门用于处理String类型的key和value
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/testGet")
public Object testGet(){
// 获取String数据
Object obj = stringRedisTemplate.opsForValue().get("project1:order:3");
System.out.println("obj = " + obj);
return obj;
}
@RequestMapping("/testSet")
public void testSet(){
System.out.println("testSet----");
// 写入一条String数据
stringRedisTemplate.opsForValue().set("project1:order:3","order3333");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# RedisTemplate笔记
SpringBoot提供了一个高度封装的RedisTemplate类来操作redis的各个命令,通过RedisTemplate提供的方法,就可以操作redis。
RedisTemplate工具类常用方法
# RedisTemplate 常用方法
String字符串操作
//设置key和value值
redisTemplate.opsForValue().set("key","value");
//通过key获取value值
String result = redisTemplate.opsForValue().get("key").toString();
1
2
3
4
5
2
3
4
5
list列表操作
//list数组对象和添加数组值
List<String> list = new ArrayList<String>();
list.add("a1");
list.add("a2");
list.add("a3");
//把list数组集合添加进Redis
redisTemplate.opsForList().leftPush("listkey",list);
//根据key获取list集合
List<String> resultList = redisTemplate.opsForList().leftPop("listkey");
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Hash数据操作
//定义Map集合和类型
Map<String,String> map = new HashMap<String,String>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
//把map设置到redis中
redisTemplate.opsForHash().putAll("map",map);
//根据key,获取全部Hash数据
Map<String,String> resultMap = redisTemplate.opsForHash().entries("map");
//根据key,获取Hash数据中的所有value值
List<String> reslutMapList = redisTemplate.opsForHash().values("map");
//根据key,获取Hash数据中的所有key值
Set<String> resultMapSet = redisTemplate.opsForHash().keys("map");
//根据key,获取Hash数据中的某个value值
String value = (String)redisTemplate.opsForHash().get("map","key1");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Set数据操作
//定义一个set集合并设置集合值
SetOperations<String, String> set = redisTemplate.opsForSet();
set.add("set1","22");
set.add("set1","33");
set.add("set1","44");
//通过key获取set集合中的对象值
Set<String> resultSet = redisTemplate.opsForSet().members("set1");
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# RedisTemplate的乱码问题
RedisTemplate向写入Redis数据时,由于默认是采用JDK序列化,因此得到的结果是这样的:
解决方式1:自定义RedisTemplate的序列化方式。下面用JSON序列化代替默认的JDK序列化
@Configuration
public class RedisTemplateConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
// 创建RedisTemplate对象
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 设置连接工厂
template.setConnectionFactory(connectionFactory);
// 创建JSON序列化工具
GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置Key的序列化
template.setKeySerializer(RedisSerializer.string());
template.setHashKeySerializer(RedisSerializer.string());
// 设置Value的序列化
template.setValueSerializer(jsonRedisSerializer);
template.setHashValueSerializer(jsonRedisSerializer);
// 返回
return template;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
解决方式2:直接使用StringRedisTemplate,它的key和value的序列化方式默认就是String。
- 优点:不需要自定义RedisTemplate的序列化方式。
- 缺点:StringRedisTemplate只能处理String类型的key和value。对于其他类型的数据还是需要自定义RedisTemplate的序列化方式。