RedisPlugin bug

Redis.use().setex("test",100,1);

Redis.use().incr("test");    


增加1时报错,查看redis值,应该是初始值1被valueToBytes编码出问题

1和“1”都试过,均报错

评论区

JFinal

2016-08-20 15:55

正确的用法是先用 incr("test"); 或者 incrBy("test", xxx) 进行初始化,然后后面再接着 incr("test") 或者 incrBy("test", xxx),由于 redis plugin 采用了序列化,所以通过 setex(...) 放入的数据已被序列化

canx

2016-08-20 17:15

多谢,试试

canx

2016-12-22 15:46

经测试,incr("test") 或者 incrBy("test", xxx) 这种也会有问题,反向get还是会报错,为何要用序列化呢?
计次场景,无奈只能用Jedis jedis =Redis.use().getJedis(); 希望完善这个问题

canx

2016-12-22 16:00

public Long getCounter(Object key) {
Jedis jedis = getJedis();
try {
return Long.parseLong((String)jedis.get(keyNamingPolicy.getKeyName(key)));
}
finally {close(jedis);}
}
get到null值,报错,这个地方处理下应该就可以了

JFinal

2016-12-22 16:31

@canx getCounter(...) 这个也有错误?这里是没有进行反向序列化的。很久不用 redis,这个方法我倒是忘记了,这个方法当时就是为 incr 这类方法而设计的

JFinal

2016-12-22 16:48

@canx 刚仔细看一下了 redis 文档,getCounter 方法是 redis 不存在的,而是 jfinal 专为 incr、incrBy、decr、decrBy 来设计返回计数器值的,应该是可以用的,希望你再试一下,反馈一下结果

这个方法并没有做过反向序列化,只是将取到的值转成 Long 型, redis 内部没有整型数据类型,而是用 string 去保存整型数据

canx

2016-12-22 18:29

嗯,有值的时候是可以的。我的场景是可能会为空,null转Long.parseLong 报错

热门反馈

扫码入社