需要一些建议"增量"在" jedis"

时间:2015-03-01 21:03:10

标签: java redis jedis

使用jedis 2.6.1和2.6.2进行测试。

redisTemplate.opsForHash().put("mykey", "myhashkey", 1);

127.0.0.1:6379> hkeys "mykey"
1) "\xac\xed\x00\x05t\x00\tmyhashkey"

127.0.0.1:6379> hget "mykey" "\xac\xed\x00\x05t\x00\tmyhashkey"
"\xac\xed\x00\x05sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x01"

然后我试图增加我的价值

redisTemplate.opsForHash().increment("mykey", "myhashkey", 1);

但是我遇到了以下问题:

org.springframework.dao.InvalidDataAccessApiUsageException: ERR hash value is not an integer; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR hash value is not an integer

当我做

redisTemplate.opsForHash().increment("mykey", "myhashkey1", 1);

并且redis中没有字段,而且完美无缺。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

redisTemplate.opsForHash().put("mykey", "myhashkey", 1);结果执行hget后,您可以看到结果是默认的JDK序列化程序。如果要将哈希值保存为原始值,则应使用StringRedisSerializer作为序列方法。

例如,您应该在xml中配置redisTemplate部分,如下所示:

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="keySerializer">
    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
</property>
<property name="hashKeySerializer">
    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="hashValueSerializer">
    <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>

然后,如果您执行redisTemplate.opsForHash().put("mykey", "myhashkey", 1),然后执行redisTemplate.opsForHash().increment("mykey", "myhashkey1", 1);,则可行。因为使用StringRedisSerializer,它会将1保存到"1",默认的JDK Serializer会将1保存到序列中,例如"\xac\xed\x00\x0"

答案 1 :(得分:0)

答案就在你的帖子里!

hget "mykey" "\xac\xed\x00\x05t\x00\tmyhashkey"

存储在哈希键#{1}}中的值不是整数,它是

  

&#34; \ XAC \固定的\ X00 \ x05sr \ X00 \ x11java.lang.Integer \ X12 \ XE2 \ XA0 \ XA4 \ XF7 \ X81 \ x878 \ X02 \ X00 \ x01I \ X00 \ x05valuexr \ X00 \ x10java.lang.Number \ 86 \ XAC \ X95 \ X1D \ X0B \ X94 \ xe0 \ x8b \ X02 \ X00 \ x00xp \ X00 \ X00 \ X00 \ X01&#34;

(似乎是java对象的序列化)。

如果您\xac\xed\x00\x05t\x00\tmyhashkey,然后发出增量,则应该有效。

我仍然需要研究你的客户是如何工作的,我只用PHPRedis来处理,这很棒。让我们看看我能找到什么。

答案 2 :(得分:0)

像这样设置散列键和值序列化器:

redisTemplate.setHashKeySerializer(new StringRedisSerializer(StandardCharsets.UTF_8));
redisTemplate.setHashValueSerializer(new StringRedisSerializer(StandardCharsets.UTF_8));

并设置如下值:

redisTemplate.opsForHash().increment("mykey", "myhashkey", "1");