是否有计划在连接到redis集群版本时支持弹簧数据redis库的“流水线”操作。流水线操作的流水线操作有很大的性能差异。如果没有这样的计划,其他可行的选择是什么?spring data redis集群管道支持
回答
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在返回之前使用其值,散列键和散列值序列化程序对所有结果进行反序列化,因此上面示例中返回的项目将是Strings。还有另外的executePipelined方法,允许您为流水线结果传递自定义序列化程序。
请注意,从RedisCallback返回的值必须为空,因为此值将被丢弃,以支持返回流水线命令的结果。
参考:http://docs.spring.io/spring-data/redis/docs/current/reference/html/#pipeline
春Redis的数据不支持群集的管道。所以我们可以在我们的应用程序中通过我们自己做到。如果你使用spring-data-redis和Jedis库。
因此,我们必须从Jedis Pool间接获取Jedis Connection。现在,如果您只知道群集的密钥,那么首先需要找出与密钥关联的插槽。你可以通过以下方式得到它。
int slot = JedisClusterCRC16.getSlot(hKey);
其次,您可以通过以下方式
JedisClusterConnection jedisClusterConnection = (JedisClusterConnection)stringRedisTemplate.getConnectionFactory().getClusterConnection();
JedisCluster jedisCluster = jedisClusterConnection.getNativeConnection();
得到JedisCluster连接现在你有JedisCluster连接,但它不是足以让Jedis从Jedis池连接。由于JedisCluster不直接暴露连接处理程序和JedisSlotConnectionHandler
分类具有从插槽返回jedis连接的方法。所以为此,我们必须将BinaryJedisCluster
类中的类从包redis.clients.jedis
复制到具有相同类和包名称的应用程序中,并且必须添加以下方法来公开连接处理程序。
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();
- 1. spring-data-redis是否支持redis集群?
- 2. Spring Red Data支持Redis BRPOPLPUSH
- 3. Redis中的Redis集群支持2.8.19
- 4. socket.io-redis是否支持redis集群?
- 5. Spring Data Redis - 支持命令PUBSUB CHANNELS
- 6. Spring Data Redis
- 7. Spring Data MongoDB BigDecimal支持
- 8. Spring Data支持Calendar吗?
- 9. Spring Data Elasticsearch支持@Embedded
- 10. Spring Data Jpa不支持Groupby
- 11. Spring Data Redis - 存储库中的@Transactional支持
- 12. Spring集成DSL通道支持
- 13. 对Apache Geode(spring-data-geode)的Spring支持
- 14. Spring引导的Redis集群配置
- 15. Redis的集群不支持多个主节点
- 16. HSQLDB集群/复制支持?
- 17. 支持Memcache的MySQL集群
- 18. XA Transactions支持MySQL集群?
- 19. 支持Kerberos的Hadoop集群中的Spring Cloud数据流
- 20. Spring数据redis存储库不支持集合查询?
- 21. Spring Data Elasticsearch是否支持Amazon Elasticsearch?
- 22. 支持spring-data-mongodb中的可审计?
- 23. Ignite Vs Redis Websession集群
- 24. Redis集群和zsets
- 25. Spring Data Redis NullPointerException with @Cacheable
- 26. spring-data-redis Jackson系列化
- 27. Spring Data Redis:设置密码
- 28. Spring Data Redis过期密钥
- 29. Nodejs HTTP/1.1管道支持
- 30. Azcopy是否支持管道?
我知道流水线方法;问题是对[cluster]使用pipelined(http://docs.spring.io/spring-data/redis/docs/current/reference/html/#cluster)当在启用了redis的集群上使用流水线操作时,它会抛出例外;这来自JedisClusterConnection \t'@覆盖 \t公共无效openPipeline(){ \t \t抛出新UnsupportedOperationException异常( “目前不支持JedisClusterConnection管道。”); \t}'我正在使用1.7.7版本。我已经看了1.8和2的代码。0以及它似乎不被支持。 – punjabicoder
我也尝试了在集群上列出主节点,然后建立到节点的直接连接,并使用流水线执行将该节点作为回调连接工厂传递给其余模板。它通过并保存了很少的条目“sortedset”后抛出一个例外'重定向:插槽16034到x.x.x.x:6379。嵌套异常是redis.clients.jedis.exceptions.JedisMovedDataException:MOVED 16034 x.x.x.x:6379'这基本上意味着我正在使用一个集群;感到惊讶的是有几个条目持续存在?春季数据redis专家有何评论? – punjabicoder
你可能会发现这个http://www.jacarrichan.com/Spring-Data-Redis-Add-Support-For-Redis-Cluster/有趣 – mhshimul