Redis操作报错ERR hash value is not an integer

Blade 未结 1 3626
4137063
4137063 剑童 2020-02-15 18:04


一、该问题的重现步骤是什么?

1. 项目需要自动生成单号功能,想用redis的incr功能来做,但是incr总报这个错。

2. 

   @GetMapping("/ss")
public R<String> ss() {
   boolean exist = redisCache.exists("bill_code");
   if (!exist) {
      Map<Object, Object> map = new HashMap<>();
      map.put("SA", 10);
      map.put("LO", 11);
      redisCache.hMset("bill_code", map);
   } else {
      redisCache.getHashOps().increment("bill_code", "SA", 1);
   }
   return R.status(true);
}

3.

{

    "code"500,

    "success"false,

    "data": {},

    "msg""Error in execution; nested exception is io.lettuce.core.RedisCommandExecutionException: ERR hash value is not an integer"

}


网上很多资料说是序列化的问题,改为StringRedisSerializer就会正常,但是看blade-starter-redis里面有这样一段注解:

          

/**
* 将redis key序列化为字符串
*
* <p>
*     spring cache中的简单基本类型直接使用 StringRedisSerializer 会有问题
* </p>
*
* @author L.cm
*/

1条回答
  • 2020-02-17 15:35

    测试了一波,貌似只有StringRedisSerializer才能正常使用,但是整体框架并不推荐全部改成StringRedisSerializer。

    建议以下两种方案:

     1. 手动新建一个RedisTemplate,保证和其他的不冲突,采用StringRedisSerializer,模仿BladeRedisCache封装一个建议的专门用于incr的方法,这样就不影响全局又可以使用incr方法了

     2. 不使用redis的api,采用其他的第三方自增插件


    1 讨论(0)
提交回复