【已解决】Spring-Data-Redis中boundValueOps()和opsForValue():boundValueOps()获取成功opsForValue()失败

本文详细介绍了如何在SpringBoot项目中配置Maven依赖以集成Redis,并通过示例展示了如何使用SpringBootTest进行单元测试,特别关注了Redis模板中的序列化策略和get方法行为。
摘要由CSDN通过智能技术生成

示例

在这里插入图片描述

环境搭建:可跳过

maven

<!--Redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!--Web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Test-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

application.properties

server.port=6012
# Redis数据库索引(默认为0)
spring.redis.database=2
# Redis服务器地址
spring.redis.host=
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=

测试用例

@SpringBootTest
public class SystemApplicationTest {
	@Resource
	private RedisTemplate<String, String> redisTemplate;

	@Test
	void contextLoads() {
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
		
		String cacheValue = redisTemplate.boundValueOps("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342").get();
		System.out.println(cacheValue);
		
		String cacheValue2 = redisTemplate.opsForValue().get("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342");
		System.out.println(cacheValue2);
	}
}

正文代码

1

redisTemplate.setKeySerializer(new StringRedisSerializer());

//差异在这一行
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());

String cacheValue = redisTemplate.boundValueOps("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342").get(0,-1);
System.out.println(cacheValue);

String cacheValue2 = redisTemplate.opsForValue().get("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342");
System.out.println(cacheValue2);

运行结果:
在这里插入图片描述
cacheValue被正确序列化
cacheValue2未被正确序列化

2

redisTemplate.setKeySerializer(new StringRedisSerializer());

//差异在这一行
redisTemplate.setValueSerializer(new StringRedisSerializer());

String cacheValue = redisTemplate.boundValueOps("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342").get(0,-1);
System.out.println(cacheValue);

String cacheValue2 = redisTemplate.opsForValue().get("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342");
System.out.println(cacheValue2);

运行结果:
在这里插入图片描述
cacheValue和cacheValue2都被正确序列化

3

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());

//和2差异在于这一行的get
String cacheValue = redisTemplate.boundValueOps("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342").get();
System.out.println(cacheValue);

String cacheValue2 = redisTemplate.opsForValue().get("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342");
System.out.println(cacheValue2);

在这里插入图片描述

4

redisTemplate.setKeySerializer(new StringRedisSerializer());

//和3差异在于这一行的get
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());

String cacheValue = redisTemplate.boundValueOps("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342").get();
System.out.println(cacheValue);

String cacheValue2 = redisTemplate.opsForValue().get("access_token:login:token:7d792ff4-bf32-49d6-adfc-1a01649ea342");
System.out.println(cacheValue2);

在这里插入图片描述

结论:源码

  1. 实际对象是使用StringRedisSerializer进行序列化的
  2. 至于boundValueOps使用get()方法无参时会报错,但是使用get(0,-1)不会报错原因在于这两个重载函数的返回值类型不同,实则使用get(0,-1)得不偿失,还是使用string的序列化方式
    在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lucky_Turtle

感谢您的打赏,作者会多多努力的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值