redis setIfAbsent返回null的问题及解决

目录
  • 起因
  • 原因
  • 解决

起因

今天在写业务代码的时候,用到了StringRedisTemplate中redisTemplate.opsForValue().setIfAbsent()中并不是我期望的true或者false而是返回了null,起初我还以为是因为Returns:null when used in pipeline / transaction.这个原因,但是我并没有在业务中使用到事务。

原因

遂使用谷歌大法,才搜到原来这是因为Redisson的bug,网友给出的解决方案是去掉就好了,但是不可能因为这个问题就不使用Redisson,看来又看但一个帖子,说这是redisson的bug。

看到这里,我就想到去看看github中是不是有相关的issue呢?

解决

果然,我们可以看到有两个issue是关于setIfAbsent返回null的问题,让我们去看一下回复数多的那一条

其中提到在#2811中修复

也可以明确看到关于此bug的修复代码

让我们一起看看这个BooleanNullSafeReplayConvertor是何方神圣,怎么解决的返回值为null的bug.

其实解决的方式也很简单暴力,就是把之前的obj == null return null改为了obj == null return false并且去掉了泛型。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Redisson如何解决Redis分布式锁提前释放问题

    目录 前言: 一.问题描述: 二.原因分析: 三.解决方案: 1.思考: 2.Redisson简单配置: 3.使用样例: 四.源码分析 1.lock加锁操作 2.unlock解锁操作 总结: 相关参考: 前言: 在分布式场景下,相信你或多或少需要使用分布式锁来访问临界资源,或者控制耗时操作的并发性. 当然,实现分布式锁的方案也比较多,比如数据库.redis.zk 等等.本文主要结合一个线上案例,讲解 redis 分布式锁的相关实现. 一.问题描述: 某天线上出现了数据重复处理问题,经排查后发现,

  • Redis分布式锁防止缓存击穿的实现

    缓存击穿 和缓存穿透不同的是,缓存击穿是指:缓存中没有,但是数据库中存在的热点数据. 例如:首页的热点新闻,并发访问量非常大的热点数据,如果缓存过期失效,服务器会去查询DB,这时候如果大量的并发去查询DB,可能会瞬间压垮DB. 画了个简图,如下所示: 解决方案:DB查询加分布式锁. 未加锁的情况 解决问题之前,先看一下不做处理的代码和运行情况. 根据商品ID查询商品详情代码 清空Redis缓存,开启5个线程去并发访问测试,测试代码如下: 我们预期希望DB只查询一次,后面4个查询从Redis缓存中

  • Redis分布式锁的使用和实现原理详解

    模拟一个电商里面下单减库存的场景. 1.首先在redis里加入商品库存数量. 2.新建一个Spring Boot项目,在pom里面引入相关的依赖. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <gr

  • redis setIfAbsent返回null的问题及解决

    目录 起因 原因 解决 起因 今天在写业务代码的时候,用到了StringRedisTemplate中redisTemplate.opsForValue().setIfAbsent()中并不是我期望的true或者false而是返回了null,起初我还以为是因为Returns:null when used in pipeline / transaction.这个原因,但是我并没有在业务中使用到事务. 原因 遂使用谷歌大法,才搜到原来这是因为Redisson的bug,网友给出的解决方案是去掉就好了,但

  • PHP处理Json字符串解码返回NULL的解决方法

    本文实例讲述了PHP处理Json字符串解码返回NULL的解决方法.分享给大家供大家参考之用.具体方法如下: 一般来说,php对json字符串解码使用json_decode()函数,第一个参数传字符串,第二个参数若为true,返回array:若为false,返回object.如果返回NULL,说明报错,输出json_last_error(),得到的整数值对应错误提示.如下图所示: json_last_error()比较常见的是整数4, 是json字符串在json_decode之前已不完整,所以语法

  • 解决mybatis执行SQL语句部分参数返回NULL问题

    今天在写代码的时候发现一个问题:mybatis执行sql语句的时候返回bean的部分属性为null,在数据库中执行该sql语句能够正常返回,把相关代码反反复复翻了个遍,甚至都重启eclipse了,依旧没解决问题,后来网上搜了一下,还真有类似的问题. 闲话少说,直接说问题,该sql语句是自己写的,resultType直接用了该bean全名称,最终导致部分属性显示为null, 原来的写法: <select id="selectByArticle" parametertype=&quo

  • showModalDialog在谷歌浏览器下会返回Null的解决方法

    showModalDialog的返回值在IE.火狐下面都能够获取返回值,但是在谷歌浏览器下面会返回Null,下面介绍解决方法 父页面: 复制代码 代码如下: function openwindows(){ var obj = new Object(); //打开模态子窗体,并获取返回值 var retval = window.showModalDialog("ordervideo.jsp?rderIds="+"0010,0020,0030",obj,"di

  • AndroidGUI27中findViewById返回null的快速解决办法

    在用Eclipse进行Android的界面开发,通过findViewById试图获取界面元素对象时,该方法有时候返回null,造成这种情况主要有以下两种情形. 第一种情形是最普通的. 比如main.xml如下,其中有一个ListView,其id为lv_contactbook <?xml version="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.a

  • 解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    同事在学mybatis时,遇到了一个问题就是,使用char类型字段作为查询条件时一直都查不出数据,其他类型的则可以. 使用的数据库是oracle,查询条件字段类型是char(50),java代码对应的是String类型. 后来经过排查,是由于在oracle中,char类型字段,如果内容长度不够,会自动以空格方式补足长度.如字段 name char(5),若值为sgl,那么oracle会自动用空格补足长度,最终值为sgl. 一.解决方法: 方法1:先用trim()函数把值去掉两边空格再作为条件查询

  • 解决mybatis返回boolean值时数据库返回null的问题

    常规情况,我们使用数据库判断 true or false.所写的语句是select count(id) from 表名: 这种常用情况下,只有当查询语句查到数据 且 只有一条时才会返回 true; 还有一种情况,就是数据库中返回判断句,比如 返回的对错将以1或0表示: 但是当返回值为null,或者多个值的时候 会怎么样呢,0 1 还是报错? 测试表示这种情况下会报错: 希望大家使用 boolean 返回时 也能格外小心. 这里简单做了更改方法,可能不是最优化的,有更好的意见还请不吝赐教. 补充知

  • MyBatis查询数据返回null的解决

    MyBatis查询返回null 可能原因 SQL语句查询条件有问题 数据库中没数据 返回字段与Entity的属性不对应 解决方案 针对 SQL语句查询条件有问题.数据库中没数据 建议将SQL手动拼接之后去数据库中运行一下看看结果. 针对 返回字段与Entity的属性不对应,检查entity属性是否是因为驼峰命名导致字段不对应返回了null: 可以去配置一下开启驼峰,这里不做详解:或者用resultMap作为返回结果,如图 到此这篇关于MyBatis查询数据返回null的解决的文章就介绍到这了,更

  • 解决Map集合使用get方法返回null抛出空指针异常问题

    目录 前言 空指针问题 原因 map.get,小心get出一个空指针 前言 1.Map里面只能存放对象,不能存放基本类型,例如int,需要使用Integer 2.Map集合取出时,如果变量声明了类型,会先进行拆箱,再进行转换. 空指针问题 如图,在程序执行到27行时,出现了空指针异常.按道理来讲,对于Map集合是有Key和Value的,Collection集合是只有Value.如果执行get()方法,当不存在key时,对应的应该返回null. map.get(s.charAt(i)); 因此 由

  • redis setIfAbsent和setnx的区别与使用说明

    redis setIfAbsent和setnx的区别与使用 如果为空就set值,并返回1 如果存在(不为空)不进行操作,并返回0 setIfAbsent 和 setnx 使用范围 setIfAbsent 是java中的方法 setnx 是 redis命令中的方法 setnx 例子 redis> SETNX testkey "test" (integer) 1 redis> SETNX testkey "test" (integer) 0 redis>

随机推荐