vue 实现删除对象的元素 delete
924
2022-08-18
SpringBoot使用RedisTemplate.delete删除指定key失败的解决办法
目录问题概述解决办法
问题概述
关于这个问题呢,还是主要出现在项目开发的管理上面,先描述哈项目环境:
1、java 使用的 JDK-1.8
2、Spring Boot 使用的 Spring Boot-2.0.3
3、Redis 使用的是 2.0.8
4、Jedis 使用的是 2.9.0
(当然其它就不再描述了)
起先,使用的都是原生的 ReidsTemplate API 进行系统缓存的管理工作。后来,由于涉及到对象相关的操作,此时如果还使用原生API,缓存中的对象是一坨乱码,让人眼花缭乱,这是就需要自定义序列化机制了,而那位同事就默默的添加上了,在团队中没有任何的反馈。
当然,在系统缓存的管理与操作中,博主依然淡定的使用着 RedisTemplate 原生的 API 呢,然后在某天前,测试团队那边突然就炸开了锅,各种问题。。。
现象:通过 Redis 的原生 API 删除缓存中的 Key 后,系统无任何的报错信息,并提示删除成功,再进入到 Redis 服务器上查看应该被删除的 Key 依然存在,懵逼了!!!
解决办法
经过一段艰辛的 BUG 排查,再加上各种姿势查看 Redis 源码,终于把问题给解决了,贴上一段 Redis 源码如下:
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (this.defaultSerializer == null) {
this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
}
if (this.enableDefaultSerializer) {
if (this.keySerializer == null) {
this.keySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.valueSerializer == null) {
this.valueSerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashKeySerializer == null) {
this.hashKeySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashValueSerializer == null) {
this.hashValueSerializer = this.defaultSerializer;
defaultUsed = true;
}
}
if (this.enableDefaultSerializer && defaultUsed) {
Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
}
if (this.scriptExecutor == null) {
this.scriptExecutor = new DefaultScriptExecutor(this);
}
this.initialized = true;
}
《 Redis 源码地址 》
注意到 Redis 的默认序列化机制 “ defaultSerializer ” ,如果没有自定义的序列化机制,则系统默认使用的是 “ org.springframework.data.redis.serializer.JdkSerializationRedisSerializer ” ,然后有老铁又再系统中默默的自定义了 Redis 的序列化机制,部分示例代码如下:
package com.btc.common.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2jsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@EnableCaching
public class RedisConfig
extends CachingConfigurerSupport
{
@Bean
public CacheManager cacheManager(final RedisConnectionFactory redisConnectionFactory)
{
RedisCacheManager.RedisCacheManagerBuilder builder
= RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory);
return builder.build();
}
@Bean(name = "springSessionDefaultRedisSerializer")
public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer()
{
return new GenericJackson2JsonRedisSerializer();
}
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate
final RedisConnectionFactory connectionFactory
)
{
RedisTemplate
redisTemplaySwsyvte.setConnectionFactory(connectionFactory);
// 配置默认的序列化器
redisTemplate.setDefaultSerializer(getGenericJackson2JsonRedisSerializer());
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 设置 Key 的默认序列化机制
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
return redisTemplate;
}
}
在这段代码中,根据需求将 Redis Key 的序列化机制更改为了 “ org.springframework.data.redis.serializer.StringRedisSerializer ” (主要目的为避免出现乱码的象限,其实还是能正常的的使用,只是我们肉眼看到为乱码而已),并且将 redisTemplate 定义为了类型为泛型的类型。
这儿就是问题的所在,此时就不能使用原生的 “ RedisTemplate redisTemplate; ” 而需要定义为泛型的 “ RedisTemplate
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~