我在项目中使用Redis缓存遇到的问题总结

本文介绍了一种方法来取消Redis中缓存数据的过期时间,通过使用RedisTemplate执行RedisCallback,设置特定的key使其永久有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

设置缓存数据永久有效,其实是操作key的过期时间,所以我在项目中取消了key的过期时间,

取消key的过期时间代码如下:

public boolean addData(final String key, final String value, final int expireSecond) {
boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
public Boolean doInRedis(RedisConnection connection) {
RedisSerializer<String> serializer = getRedisSerializer();
byte[] bkey = serializer.serialize(key);
byte[] bvalue = serializer.serialize(value);
connection.setEx(bkey, expireSecond, bvalue);
connection.persist(bkey); // 取消key的过期时间=设置缓存数据永久有效
connection.close();
return true;
}
});
return result;
}

注: 如果你感觉有不足的地方,诚恳的请大牛指正。

### Spring Boot Redis LocalDateTime 反序列化异常解决方案 在Spring Boot项目中,当使用Redis作为缓存时,可能会遇到`LocalDateTime`类型的字段在反序列化过程中出现问题的情况。这种现象通常是由默认的序列化机制无法正确解析日期时间格式引起的。 为了有效解决这个问题,可以采取以下几种方式: #### 方法一:自定义Jackson序列化器和反序列化器 通过为`LocalDateTime`类型设置特定的序列化器和反序列化器来解决问题。可以在实体类的相关字段上添加注解以指定使用的序列化工具。这种方式的具体实现如下所示[^2]: ```java import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; ``` 上述代码片段设置了`createTime`字段的时间格式以及对应的时区信息,从而确保其能够在序列化与反序列化的过程中保持一致性。 #### 方法二:全局配置Jackson模块支持JSR-310标准 除了针对单个字段进行定制外,还可以通过对整个应用程序的Jackson模块进行扩展的方式统一处理所有的`LocalDateTime`对象。具体操作是在项目的启动类或者配置文件中注册相应的模块[^1]: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); JavaTimeModule module = new JavaTimeModule(); mapper.registerModule(module); mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); return mapper; } } ``` 此方法不仅简化了开发流程,还提高了代码可维护性,因为无需逐一手动标注每一个涉及`LocalDateTime`的对象属性。 #### 方法三:调整RedisTemplate的序列化策略 如果问题仍然存在,则可能是因为Redis本身未采用合适的序列化方式所致。此时可以通过修改`RedisTemplate`实例中的键值对序列化选项进一步优化数据交换过程[^3]: ```java import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @Configuration public class RedisConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setConnectionFactory(redisConnectionFactory); return template; } } ``` 以上代码将字符串形式的key映射到JSON结构化的value之上,极大地增强了跨平台兼容能力并减少了潜在错误的发生概率。 --- ### 总结 综上所述,在面对Spring Boot集成Redis场景下发生的`LocalDateTime`反序列化失败状况时,可以从以下几个角度出发寻找对策: 1. 使用专门设计好的序列化/反序列化组件; 2. 扩展Jackson框架的功能范围至Java新特性领域; 3. 调整Redis连接池内部的工作参数设定。 每种途径各有优劣之处,实际选用需视具体情况而定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值