redistemplate删除所有key,

  redistemplate删除所有key,

  00-1010问题概述解决方案

  00-1010这个问题呢,还是主要出现在项目开发的管理上?首先,描述项目环境:

  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的native API删除缓存中的Key后,系统没有错误信息,会提示删除成功。然后,您将进入Redis服务器,检查应该删除的键是否仍然存在。太蠢了!

  00-1010经过一段时间的硬BUG排查,加上各种姿势检查Redis源代码,终于解决了问题,贴了一段Redis源代码如下:

  public void afterproperties set(){ super . afterproperties set();boolean defaultUsed=falseif(this . default serializer==null){ this . default serializer=new jdkserializationrediserializer(this . class loader!=null?this . class loader : this . getclass()。get class loader());} if(this . enabledefaultserializer){ if(this . keyserializer==null){ this . keyserializer=this . defaultserializer;defaultUsed=true} if(this . value serializer==null){ this . value serializer=this . default serializer;defaultUsed=true} if(this . hashkey serializer==null){ this . hashkey serializer=this . default serializer;defaultUsed=true} if(this . hashvalueserializer==null){ this . hashvalueserializer=this . defaultserializer;defaultUsed=true} } if(this . enabledefaultserializer defaultUsed){ assert . not null(this . default serializer,默认序列化程序为空,并且不是所有序列化程序都已初始化);} if(this . script executor==null){ this . script executor=new defaultscript executor(this);} this.initialized=true} 《Redis 源码地址》

  注意Redis的默认序列化机制是“defaultSerializer”。如果没有自定义的序列化机制,系统将使用“org。spring framework . data . redis . serializer . JDK serialization rediserizer”默认,然后会有老铁然后会隐藏在系统里。

  默的自定义了 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@EnableCachingpublic 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<Object, Object> getRedisTemplate( final RedisConnectionFactory connectionFactory ) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.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 <Object,Object> redisTemplate; 了,因为当我们再次新增的 key 的时候,使用的是 StringRedisSerializer 序列化机制,但是在 delete 操作的时候是使用的是原生 API ,redis 中的 redisTemplate 默认序列化机制采用的是 JdkSerializationRedisSerializer ,这样以来,即使你使用 hasKey 方法也会发现 redis 中存在这个 key ,但是实际 hasKey 返回 false,所以就会出现删除成功,但是实际的数据依然存在 Redis 服务器上咯。

  到此这篇关于SpringBoot使用RedisTemplate.delete删除指定key失败的解决办法的文章就介绍到这了,更多相关SpringBoot RedisTemplate.delete删除指定key内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • 关于redis数据库入门详细介绍图片,redis数据库的使用,关于Redis数据库入门详细介绍
  • redis队列操作命令,redis 循环队列
  • redis队列操作命令,redis 循环队列,redis实现简单队列
  • redis部署应用服务器上,redis如何启动服务器
  • redis部署应用服务器上,redis如何启动服务器,搭建Redis服务器步骤详细介绍
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决
  • redis缓存穿透和击穿解决方案,redis缓存穿透,缓存雪崩解决,redis缓存穿透解决方法
  • Redis缓存,redis和缓存
  • Redis缓存,redis和缓存,Redis缓存详解
  • redis的配置,启动,操作和关闭方法有哪些,关闭redis的命令,Redis的配置、启动、操作和关闭方法
  • redis的主从配置方法详解图,Redis主从配置
  • redis的主从配置方法详解图,Redis主从配置,redis的主从配置方法详解
  • redis界面工具,mac安装redis可视化工具
  • redis界面工具,mac安装redis可视化工具,推荐几款 Redis 可视化工具(太厉害了)
  • redis正确使用的十个技巧是什么,redis正确使用的十个技巧有哪些
  • 留言与评论(共有 条评论)
       
    验证码: