是否有计划支持在连接到Redis集群版本时为Spring Data Redis库提供“流水线”操作。管道化和非管道化操作之间存在相当大的性能差异。如果没有这样的计划,还有哪些可行的选项?
是否有计划支持在连接到Redis集群版本时为Spring Data Redis库提供“流水线”操作。管道化和非管道化操作之间存在相当大的性能差异。如果没有这样的计划,还有哪些可行的选项?
Spring Data Redis不支持在集群上使用pipeline。因此,我们可以在应用程序中自己实现。如果您使用spring-data-redis和Jedis库。
所以为了实现这一点,我们必须间接地从Jedis池中获取Jedis连接。现在,如果您只知道集群的键,那么首先需要找出与键相关联的槽位。您可以通过以下方式获得它。
int slot = JedisClusterCRC16.getSlot(hKey);
JedisClusterConnection jedisClusterConnection = (JedisClusterConnection)stringRedisTemplate.getConnectionFactory().getClusterConnection();
JedisCluster jedisCluster = jedisClusterConnection.getNativeConnection();
public JedisSlotBasedConnectionHandler getConnectionHandler() {
return (JedisSlotBasedConnectionHandler) this.connectionHandler;
}
getJedisConnectionFromSlot(slot)
方法来获取Jedis连接。JedisSlotBasedConnectionHandler jedisClusterConnectionHandler = jedisCluster.getConnectionHandler();
Jedis connection = jedisClusterConnectionHandler.getConnectionFromSlot(slot);
Pipeline pipeline = connection.pipelined();
pipeline.somecommand....
pipeline.sync();
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
@Override public void openPipeline() { throw new UnsupportedOperationException("Pipeline is currently not supported for JedisClusterConnection."); }
我正在使用版本1.7.7。我已经查看了1.8和2.0的代码,似乎都不支持流水线操作。 - undefinedRedirect: slot 16034 to x.x.x.x:6379.; nested exception is redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 16034 x.x.x.x:6379
,这基本上意味着我正在使用一个集群;很奇怪为什么只有少量条目被持久化了?Spring Data Redis专家有任何评论吗? - undefined