返回顶部
首页 > 资讯 > 精选 >SpringBoot使用RedisTemplate.delete删除指定key失败怎么解决
  • 653
分享到

SpringBoot使用RedisTemplate.delete删除指定key失败怎么解决

2023-06-29 16:06:41 653人浏览 薄情痞子
摘要

本篇内容介绍了“SpringBoot使用RedisTemplate.delete删除指定key失败怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔

本篇内容介绍了“SpringBoot使用RedisTemplate.delete删除指定key失败怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

问题概述

关于这个问题呢,还是主要出现在项目开发的管理上面,先描述哈项目环境:

Java 使用的 jdk-1.8

Spring Boot 使用的 spring Boot-2.0.3

Redis 使用的是 2.0.8

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@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失败怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: SpringBoot使用RedisTemplate.delete删除指定key失败怎么解决

本文链接: https://lsjlt.com/news/325506.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot使用RedisTemplate.delete删除指定key失败怎么解决
    本篇内容介绍了“SpringBoot使用RedisTemplate.delete删除指定key失败怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔...
    99+
    2023-06-29
  • SpringBoot使用RedisTemplate.delete删除指定key失败的解决办法
    目录问题概述解决办法问题概述 关于这个问题呢,还是主要出现在项目开发的管理上面,先描述哈项目环境: 1、Java 使用的 JDK-1.8 2、Spring Boot 使用的 Spri...
    99+
    2024-04-02
  • mongodb删除表失败怎么解决
    如果在MongoDB中删除表失败,可以尝试以下方法解决问题:1. 检查权限:确保你有足够的权限删除表。使用管理员账户或具有适当权限的...
    99+
    2023-08-23
    mongodb
  • redis删除缓存失败怎么解决
    针对 redis 删除缓存失败的问题,原因及解决方案如下:键不存在:使用 exists 命令检查键是否存在。键类型错误:确保键是字符串键。可使用 type 命令检查。服务器内部错误:检查...
    99+
    2024-04-20
    redis 超时异常 网络问题
  • PHP怎么删除Array数组指定key
    小编给大家分享一下PHP怎么删除Array数组指定key,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!方法:首先用array_search("key名&...
    99+
    2023-06-14
  • redis中怎么批量删除指定key
    在Redis中,可以使用DEL命令批量删除指定的key。DEL命令可以同时删除一个或多个key,只要将需要删除的key作为参数传递给...
    99+
    2023-09-06
    redis
  • sqlserver删除数据库失败怎么解决
    解决SQL Server删除数据库失败的方法如下: 检查权限:确保当前登录用户具有足够的权限来删除数据库。如果没有足够的权限,你...
    99+
    2023-10-22
    sqlserver 数据库
  • MongoDB删除数据库失败怎么解决
    如果 MongoDB 删除数据库失败,可以尝试以下几种解决方法: 检查权限:确保当前用户具有足够的权限来删除数据库。可以使用管理...
    99+
    2024-05-22
    mongodb
  • springboot指定profiles启动失败问题及解决
    目录springboot指定profiles启动失败凡事总有意外比较其他项目springboot Profiles、配置文件加载优先级事例代码总结springboot指定profil...
    99+
    2023-05-15
    springboot指定profiles profiles启动失败 profiles启动
  • mysql删除用户失败如何解决
    这篇文章主要介绍“mysql删除用户失败如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“mysql删除用户失败如何解决”文章能帮助大家解决问题。 ...
    99+
    2023-02-14
    mysql
  • springboot指定profiles启动失败问题如何解决
    这篇文章主要讲解了“springboot指定profiles启动失败问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“springboot指定profiles启动失败问题如何解决”吧...
    99+
    2023-07-05
  • plsql恢复删除的数据失败怎么解决
    当 PL/SQL 恢复删除的数据失败时,可以尝试以下解决方法: 检查是否有备份:首先检查是否有备份可以恢复删除的数据。如果有备份...
    99+
    2024-04-09
    plsql
  • mysql里删除用户失败怎么办
    mysql里删除用户失败的原因:可能是未选择数据库或未指定表,导致用户删除失败解决方法:首先,在命令行中启动MySQL服务;service mysql start  MySQL服务启动后,在命令行中输入mysql的用户名和密码登录到MySQ...
    99+
    2024-04-02
  • redis删除key不释放内存怎么解决
    在Redis中,当删除一个key时,它实际上并不会立即释放内存,而是通过惰性删除来释放内存。这意味着Redis会在需要空间时才会释放...
    99+
    2024-04-02
  • springboot使用@value注入配置失败的解决
    目录springboot使用@value注入配置文件失败问题解决方向一问题解决方向二@Value注入失败,注入值为null的问题大概就是下面这样结果不知道为什么,@Value注入一直...
    99+
    2024-04-02
  • 使用php怎么删除指定的html标签
    今天就跟大家聊聊有关使用php怎么删除指定的html标签,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。php删除指定html标签的方法$str='<p><p...
    99+
    2023-06-15
  • SpringBoot怎么解决TypeAliases配置失败问题
    这篇文章主要介绍“SpringBoot怎么解决TypeAliases配置失败问题”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么解决TypeAliases配置失败问题”文章能帮...
    99+
    2023-06-08
  • 怎么用python删除指定文件
    您可以使用`os`模块来删除指定文件。以下是一个示例代码:```pythonimport os# 要删除的文件路径file_path...
    99+
    2023-10-08
    python
  • redis批量删除key值的问题怎么解决
    这篇文章主要讲解了“redis批量删除key值的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis批量删除key值的问题怎么解决”吧!遇到的问题:在开发过程中,会遇到要批量...
    99+
    2023-06-29
  • 如何使用SpringBoot解决TypeAliases配置失败问题
    本文小编为大家详细介绍“如何使用SpringBoot解决TypeAliases配置失败问题”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何使用SpringBoot解决TypeAliases配置失败问题”文章能帮助大家解决疑惑,下面跟着小...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作