cache调用hincrby返回 ERR hash value is not an integer

目前在使用JFinal提供的RedisPlugin,使用cache确实方便,但是cache并没有封装所有的jedis方法,如pipeline等,而且cache使用了FstSerializer进行序列化和反序列化,使用原生jedis方法时需同样使用FstSerializer进行序列化

我使用如下代码在redis中存放一个hash

cache.hmset(key, (Map) record.getColumns());

使用如下代码为hash中的一个属性自增

cache.hincrBy(record, "like_num", 1);

就会提示:ERR hash value is not an integer

我猜想是由于cache.hmset()设置"like_num"属性的value时进行了序列化,所以在执行cache.hincrBy()时,调用的jedis.hincrBy(keyToBytes(key), fieldToBytes(field), value)方法虽然找到了"like_num"属性,但是无法将"like_num"的value转换为int

不知道猜想是否正确,如果正确该如何解决此问题,如果不正确又是什么原因导致的?请前辈们指点

评论区

JFinal

2017-08-09 11:33

hmset 进去数据是序列化过的,不能调用它的 hincrBy,一直用 hincrBy 就好,不要换着用

pfjia

2017-08-09 15:51

@JFinal 那用hmset就没有办法存放hash的value是integer的情况,如果一个record中有的value是integer,有的value不是integer,那就需要hmset存放所有域,然后用hdel删除value是integer的域,然后再使用hincrBy存放integer的域,这样需要三个操作,有没有简便一点的方法?

JFinal

2017-08-09 16:24

@pfjia 写个工具类叫 RedisExt,然后写个工具方法,通过 Redis.use().getJedis() 获取底层 jedis 连接,然后再调用底层的方法进行操作

只要有无法满足的需求,通过 getJedis() 都是可以抵达的

pfjia

2017-08-09 18:05

@JFinal 嗯嗯,谢谢站长

pfjia

2017-08-14 18:40

@JFinal 站长,我找到了新的解决方法了 : )
http://www.jfinal.com/share/389

热门反馈

扫码入社