报错

redis 报错

  [plaintext]
1
ERR hash value is not an integer

代码

其实是通过 redis 操作

  [java]
1
redisTemplate.incr("key", String.valueOf(dbVo.getCount()))

dbVo 是从数据库获取的数据,count 对应的字段类型是 BigDecimal。

在 oracle 该字段定义是 Number,对应的 mysql 是 Decimal(20, 2)

原因分析

redis 的 incr

  [plaintext]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 值

  [java]
1
redisTemplate.incr("key", String.valueOf(dbVo.getCount().intValue()))

参考资料