是否有计划在连接到redis群集版本时支持spring data redis库的“流水线”操作。流水线和流水线之间存在相当大的性能差异。非流水线操作。如果没有这样的计划,还有什么其他可行的选择?
答案 0 :(得分:0)
Spring Data Redis提供了几种RedisTemplate方法,用于在管道中执行命令。如果您不关心流水线操作的结果,可以使用标准的execute方法,为pipeline参数传递true。 executePipelined方法将在管道中执行提供的RedisCallback或SessionCallback并返回结果。例如:
//pop a specified number of items from a queue
List<Object> results = stringRedisTemplate.executePipelined(
new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConn = (StringRedisConnection)connection;
for(int i=0; i< batchSize; i++) {
stringRedisConn.rPop("myqueue");
}
return null;
}
});
上面的示例从管道中的队列执行批量右侧弹出的项目。结果列表包含所有弹出的项目。 RedisTemplate使用其值,散列键和散列值序列化程序在返回之前反序列化所有结果,因此上面示例中返回的项将是字符串。还有其他executePipelined方法,允许您为流水线结果传递自定义序列化程序。
请注意,RedisCallback返回的值必须为null,因为此值将被丢弃,以支持返回流水线命令的结果。
参考:http://docs.spring.io/spring-data/redis/docs/current/reference/html/#pipeline
答案 1 :(得分:0)
Spring数据redis不支持集群上的管道。所以我们可以在我们的应用程序中自己做。如果你使用spring-data-redis和Jedis库。
因此,我们必须间接从Jedis Pool获取Jedis Connection。现在,如果您只知道群集的密钥,那么首先需要找出与密钥相关联的槽。你可以通过以下方式获得它。
int slot = JedisClusterCRC16.getSlot(hKey);
其次,您可以通过以下方式获得JedisCluster连接
JedisClusterConnection jedisClusterConnection = (JedisClusterConnection)stringRedisTemplate.getConnectionFactory().getClusterConnection();
JedisCluster jedisCluster = jedisClusterConnection.getNativeConnection();
现在你有JedisCluster连接但是从Jedis池获取Jedis连接是不够的。因为JedisCluster没有直接暴露连接处理程序而JedisSlotConnectionHandler
分类有从槽中返回jedis连接的方法。所以我们必须将BinaryJedisCluster
类从包redis.clients.jedis
复制到具有相同类和包名的应用程序中,并且必须添加以下方法来公开连接处理程序。
public JedisSlotBasedConnectionHandler getConnectionHandler() {
return (JedisSlotBasedConnectionHandler) this.connectionHandler;
}
最后,您可以通过调用getJedisConnectionFromSlot(slot)
方法
JedisSlotBasedConnectionHandler jedisClusterConnectionHandler = jedisCluster.getConnectionHandler();
Jedis connection = jedisClusterConnectionHandler.getConnectionFromSlot(slot);
Pipeline pipeline = connection.pipelined();
pipeline.somecommand....
pipeline.sync();