参考文档: https://docs.spring.io/spring-data/redis/docs/2.0.3.RELEASE/reference/html/
Redis中文教程: http://www.redis.net.cn/tutorial/3501.html
Redis官方中文文档之Redis集群教程: http://ifeve.com/redis-cluster-tutorial/
RedisTemplate的一般用途请参阅5.5: http://blog.csdn.net/michaelehome/article/details/79485661
7. Redis Cluster
使用Redis群集Redis Cluster需要Redis Server 3.0+版本,并提供了一套自己的特性和功能。 有关更多信息,请参阅群集教程Cluster Tutorial。
7.1. Enabling Redis Cluster
群集支持基于与非群集通信相同的构建块。RedisClusterConnection是RedisConnection的扩展,用于处理与Redis集群的通信,并将错误转换为Spring DAO异常层次结构。 RedisClusterConnection通过RedisConnectionFactory创建,必须使用相应的RedisClusterConfiguration进行设置。示例1. Redis群集的示例RedisConnectionFactory配置
@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class ClusterConfigurationProperties {
/*
* spring.redis.cluster.nodes[0] = 127.0.0.1:7379
* spring.redis.cluster.nodes[1] = 127.0.0.1:7380
* ...
*/
List<String> nodes;
/**
* Get initial collection of known cluster nodes in format {@code host:port}.
*
* @return
*/
public List<String> getNodes() {
return nodes;
}
public void setNodes(List<String> nodes) {
this.nodes = nodes;
}
}
@Configuration
public class AppConfig {
/**
* Type safe representation of application.properties
*/
@Autowired ClusterConfigurationProperties clusterProperties;
public @Bean RedisConnectionFactory connectionFactory() {
return new JedisConnectionFactory(
new RedisClusterConfiguration(clusterProperties.getNodes()));
}
}
RedisClusterConfiguration
可以通过 PropertySource
定义
spring.redis.cluster.nodes
: 逗号分隔host:portspring.redis.cluster.max-redirects
: 允许cluster重定向的数量
初始配置将驱动程序库指向初始集群节点集。 活动群集重新配置所产生的更改只会保留在本机驱动程序中,而不会写回配置。
7.2. Working With Redis Cluster Connection
如上所述,Redis集群的行为与单个节点Redis或Sentinel监控的主从环境有所不同。这是由将自动分片映射到跨节点分布的16384个插槽中的一个插槽的原因。 因此,涉及多个密钥的命令必须声明所有密钥都映射到完全相同的插槽以避免交叉插槽执行错误。 进一步说,因此一个集群节点只提供一组专用密钥,对一台特定服务器发出的命令只返回服务器提供的那些密钥的结果。 作为一个非常简单的例子,使用KEYS命令。 当发布到集群环境中的服务器时,它仅返回请求发送到的节点所服务的密钥,而不一定是集群内的所有密钥。 因此,要获取群集环境中的所有密钥,至少需要从所有已知主节点读取密钥。尽管重定向到相应的插槽服务节点的特定密钥由驱动程序库处理,但高级函数(如收集跨节点的信息)或将命令发送到群集中由RedisClusterConnection覆盖的所有节点。从上面的例子中,我们可以看到,当获取结果和返回的一组键值时,key(pattern)方法获取集群中的每个主节点,并同时对每个主节点执行KEYS命令。仅仅请求单个节点的密钥,RedisClusterConnection为那些(如密钥(节点,模式))提供重载。
RedisClusterNode可以从RedisClusterConnection.clusterGetNodes获得,也可以使用主机和端口或节点ID构建。
Example 2. Sample of Running Commands Across the Cluster
当所有密钥映射到同一个插槽时,本地驱动程序库会自动为跨插槽请求(如MGET)提供服务。但是,一旦情况并非如此,RedisClusterConnection将针对插槽服务节点执行多个并行GET命令,并再次返回累计结果。显然,这比单个插槽执行的性能差,因此应该小心使用。 如有疑问,请在{my-prefix} .foo和{my-prefix} .bar这样的大括号中提供一个前缀,将它们映射到相同的插槽编号,从而考虑将密钥固定到同一个插槽。
Example 3. Sample of Cross Slot Request Handling
以上提供了简单的例子来演示Spring Data Redis遵循的一般策略。 请注意,某些操作可能需要将大量数据加载到内存中才能计算所需的命令。此外,并非所有的交叉插槽请求都可以安全地移植到多个单插槽请求中,并且如果使用不当(例如PFCOUNT),则会出错。
7.3. Working With RedisTemplate and ClusterOperations
RedisTemplate的一般用途请参阅5.5: http://blog.csdn.net/michaelehome/article/details/79485661
使用任何JSON-RedisSerializer设置RedisTemplate#keySerializer时请小心,因为更改json结构会对散列槽计算产生直接影响。
RedisTemplate可通过RedisTemplate.opsForCluster()获取的ClusterOperations接口提供对集群特定操作的访问。 这允许在集群内的单个节点上明确执行命令,同时保留为模板配置的解除/序列化功能,并提供管理命令,例如CLUSTER MEET或更高级别的操作。resharding。
Example 4. Accessing RedisClusterConnection via RedisTemplate