我想通过只指定字段来检索多个哈希映射值,因此我选择了Redis管道。
在测试下面的代码时,我发现
当我查看代码并发现以下内容时,其中:
a)
b)
在测试下面的代码时,我发现
redisResponse1
始终为空,而 redisResponse2
有值。 getRedisTemplate().executePipelined(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
List<byte[]> redisResponse1 = connection.hMGet(key.getBytes(), params);
List<byte[]> redisResponse2 = getRedisTemplate().getConnectionFactory().getConnection().hMGet(key.getBytes(), specificParams);
return null;
}
});
当我查看代码并发现以下内容时,其中:
a)
redisResponse2
没有使用 pipeline 选项执行b)
redisResponse1
使用 pipeline 执行(isPipelined() == true),但始终返回 null。public List<byte[]> hMGet(byte[] key, byte[]... fields) {
try {
if (isPipelined()) {
pipeline(new JedisResult(pipeline.hmget(key, fields)));
return null;
}
if (isQueueing()) {
transaction(new JedisResult(transaction.hmget(key, fields)));
return null;
}
return jedis.hmget(key, fields);
} catch (Exception ex) {
throw convertJedisAccessException(ex);
}
}
问题如下:
1)如何使用管道选项实现我的用例?
2)在这个RedisCallback中访问getRedisTemplate().getConnectionFactory().getConnection()
会有什么影响?
3)整个管道的概念是如何工作的?它像动态Lua一样吗?Java代码被转换为Lua脚本并作为脚本发送到Redis,在Redis中执行并返回?惊讶于在这个回调中,代码还访问/更新外部类变量,那么所有这些变量会发生什么?所有这些外部类变量也会在Lua中发送到Redis吗?
4)我看到很多关于doInRedis
API返回null
的示例;为什么会这样?如何从中返回/获取有效的对象?