报错
redis 报错
ERR hash value is not an integer
代码
其实是通过 redis 操作
redisTemplate.incr("key", String.valueOf(dbVo.getCount()))
dbVo 是从数据库获取的数据,count 对应的字段类型是 BigDecimal。
在 oracle 该字段定义是 Number,对应的 mysql 是 Decimal(20, 2)
原因分析
redis 的 incr
127.0.0.1:6379> set "intVal" 1
OK
127.0.0.1:6379> get "intVal"
"1"
127.0.0.1:6379> incr "intVal"
(integer) 2
127.0.0.1:6379> set "strVal" "1"
OK
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> get "strVal"
"1"
127.0.0.1:6379> incr "strVal"
(integer) 2
127.0.0.1:6379> set "doubleVal" 16.00
OK
127.0.0.1:6379> incr "doubleVal"
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set "doubleStrVal" "16.00"
OK
127.0.0.1:6379> incr "doubleStrVal"
(error) ERR value is not an integer or out of range
会发现 redis 的 incr 命令只支持 int 类型,或者对应的字符串 int。
数据库的差异
在 count 存储时,oracle 对于数字比如 16,返回处理时应该是 16,但是 mysql 会被处理为 16.00。
导致 redis incr 报错。
解决方案
直接把代码调整一下,确认取 int 值
redisTemplate.incr("key", String.valueOf(dbVo.getCount().intValue()))