代码不熟造成的Redis报错
今天遇到了一个关于Redis的报错问题,是对公司代码不熟悉造成的。问题不是很严重,但是也要经过师兄的指点才能发现问题。
开门见山先说问题和解决办法
问题:
本地Redis服务开启的时候就能跑通,本地Redis服务关闭的时候就报错Could not get a resource from the pool; ……RedisConnectionException: Unable to connect to localhost:6379] with root cause
原因:
公司自己封装了一个用于操作Redis的工具类,但是我不知道,我用的是RedisTemplate。
RedisTemplate是
Spring Data Redis 提供的一个用于与 Redis 数据库进行交互的工具类
,所以在yml中要用Spring的方式配置Redis连接参数。而我的yml是用的公司自定义的注入方式,所以不能成功调通参数。
解决方法:
舍弃RedisTemplate,用公司自己封装的工具类
用RedisTemplate的时候:
@Autowired
private RedisTemplate<String, String> redisTemplate;
@GetMapping("/save")
public String save(@RequestParam("Id") String Id,@RequestParam("string") String string){
// 创建ValueOperations对象,用于操作Redis中的值
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
String tempString = "request" + Id;
// 存储数据
valueOperations.set(tempString, string);
// 设置过期时间
String endTime = "2023-12-10 18:50:00";
// 解析日期时间字符串
//如果endTime的值是"2023-12-10 15:30:00",那么expirationTime将包含对应的LocalDateTime对象,表示2023年12月10日下午3点30分。
LocalDateTime expirationTime = LocalDateTime.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
// 获取当前时间
LocalDateTime currentTime = LocalDateTime.now();
// 计算当前时间和结束时间之间的秒数
long secondsUntilExpiration = ChronoUnit.SECONDS.between(currentTime, expirationTime);
// 设置过期时间
redisTemplate.expire(tempString, secondsUntilExpiration, TimeUnit.SECONDS);
// 获取存储的数据,并输出
String retrievedValue = valueOperations.get(tempString);
System.out.println("存储数据为:" + retrievedValue);
return string;
}
如果这样编写代码的话,yml配置文件中就要这样写:
spring:
redis:
host: localhost
port: 6379
password: 1234
database: 5
对比一下我的yml:
spring:
……
没有redis的配置,所以默认加载的是localhost。
我本地调试的时候本地Redis是开着的,所以接口能跑通。
但是提交代码之后就不行了。
提交代码后的Redis读取不到配置,所以会报错。