我正在将Jedis用于使用Redis的Java项目。该代码给我一个问题的想法是将obj插入redis的哈希集中。如果该类型的对象已在redis中插入,我想复制redis条目并将该对象写入重复的行。
第一个循环创建将对象写入键的列表,第二个循环将对象写入键。
出现一个问题,jedis hexists方法抛出此错误:
redis.clients.jedis.exceptions.JedisDataException: ERR wrong number of arguments for 'hset' command
我尝试重写代码以使用hgetsall并在生成的映射上进行迭代,但是随后错误仅移至hgetsall方法。我认为使用hexists方法该错误没有任何意义,并且是在其他地方引起的。我不知道在哪里。
要注意的另一件事是,该方法在抛出错误之前可以多次运行。
因此,这是导致问题的代码:
protected void generalProcessing(WebtrekkFileModel obj, Jedis jedis) {
try{
List<String> newKeys = new ArrayList<>();
List<String> toWrite = new ArrayList<>();
keyHandler.matchKeys(obj.getSid(), obj.getEid(), obj.getRid())
.forEach(k -> {
if (existsInRedis(jedis, obj, k)) {
newKeys.add("+" + k);
toWrite.add("+" + k);
jedis.hset("+" + k, jedis.hgetAll(k));
} else {
toWrite.add(k);
}
});
keyHandler.addKeys(newKeys, obj);
Pipeline pipe = jedis.pipelined();
toWrite.forEach(k -> {
pipe.hset(k, obj.toHashMap());
});
pipe.sync();
}catch (Exception e){
e.printStackTrace();
LOG.error("Something went wrong connecting during the processing loop: " + e.getMessage());
}
}
protected boolean existsInRedis(Jedis jedis, WebtrekkFileModel obj, String key){
try {
return Boolean.TRUE.equals(jedis.hexists(key, obj.toHashMap().keySet().iterator().next())); //this is line 92
}catch (JedisDataException e){
LOG.error("Error checking existence of obj " + obj.getPrefix() + " in key " + key, e );
return false;
}
}
这是产生的错误:
redis.clients.jedis.exceptions.JedisDataException: ERR wrong number of arguments for 'hset' command at ... impl.Workers.impl.AbstractWorker.existsInRedis(AbstractWorker.java:92)
我将不胜感激,非常感激。 谢谢。