使用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中没有字段,而且完美无缺。
有什么建议吗?
答案 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");