迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:hydrogen-ssdb开源软件地址:https://gitee.com/yidinghe/hydrogen-ssdb开源软件介绍:hydrogen-ssdbJava 编写的 SSDB 客户端。 交流为了更快速的解决 issue,所以建立了一个 QQ 群。 群名称:hydrogen-ssdb群号:1148460774 介绍hydrogen-ssdb 是一个 Java 编写的 SSDB 客户端,支持多线程并发请求和多服务器的负载均衡(客户端分发请求)。 SSDB 是一个类似 Redis 的 NOSQL 数据库,兼容 Redis 的数据结构和部分命令,且支持多线程,内存占用小。 hydrogen-ssdb 是一个 SSDB 客户端,具有以下特性:
【负载均衡的抽象和实现】hydrogen-ssdb 将负载均衡抽象为 在 hydrogen-ssdb 缺省实现了基于一致性哈希环的负载均衡方式。如果这种方式不适合您的实际情况,您可以自己实现 MySharding mySharding = ... // 自定义 ShardingSsdbClient client = new SsdbClient(mySharding); 下面介绍 hydrogen-ssdb 缺省实现的负载均衡的原理。 【基于一致性哈希环的负载均衡】【对某些命令的处理】在多服务器环境下,某些命令会发送给所有的 cluster,然后收集结果,例如 还有些命令仅仅在单服务器下执行,例如 【对单点故障的处理】在负载均衡当中,每个节点都负责整个一致性哈希环中的一部分(称为哈希段)。当负载均衡当中出现单点故障时,故障节点对应的哈希段将无法执行存取操作,于是有两种处理方式:
hydrogen-ssdb 缺省情况下使用第一种方式来处理。如果需要修改,可以以下面的方式: ConsistentHashSharding sharding = (ConsistentHashSharding)ssdbClient.getSharding();sharding.setSpofStrategy(SPOFStrategy.PreserveKeySpaceStrategy); 【如何添加 Cluster】对于一致性哈希环,每一个 Cluster 的哈希段都是固定的,所以每添加一个新的 Cluster,都只会给当前的其中 1 个 Cluster 减负,而不是给所有的 Cluster 减负。例如当前有 A、B、C 三个 Cluster,那么当添加一个 D 到 A 和 B 之间,形成 “A-D-B-C” 时,它只会分担 A 的一部分哈希段,B 和 C 的哈希段没有改变,也就是说 B 和 C 的负载没有变化。
由此可知,在添加 Cluster 之前,你需要明确的了解每个 Cluster 当前的负载情况,找到负载最重的 Cluster,将新的 Cluster 加在它后面。 所以, 新加入的 Cluster 和原有的 Cluster 将根据双方的权重值重新分配原来的哈希段。假设两个 Cluster 的权重相同,则平分原来的哈希段。这个过程和其他的 Cluster 权重无关。 项目依赖hydrogen-ssdb 依赖于下面两个框架:
使用方法依赖关系在 <dependency> <groupId>com.github.yiding-he</groupId> <artifactId>hydrogen-ssdb</artifactId> <version>${hydrogen-ssdb.version}</version></dependency> 基本使用方法SsdbClient client = new SsdbClient(host, port);client.set("key", "value");System.out.println(client.get("key")); // output "value"client.close(); // 应用结束时需要调用 close() 方法,也可以配置在 Spring 的 destroy-method 中 配置主从服务器List<Server> servers = Arrays.asList( new Server("192.168.1.180", 8888, true), // 主服务器 new Server("192.168.1.180", 8889, false) // 从服务器);SsdbClient client = SsdbClient.fromSingleCluster(servers);client.set("name", "hydrogen-ssdb"); // 写入请求一定会发送给主服务器System.out.println(client.get("name")); // 读取请求会随机发送给任意一台服务器 配置负载均衡Sharding sharding = new ConsistentHashSharding(Arrays.asList( new Cluster(new Server("192.168.1.180", 8888), 100), // 100 和 200 这两个参数指的是权重, new Cluster(new Server("192.168.1.180", 8889), 200) // 权重越大的 Cluster 所保存的 key 越多。));SsdbClient ssdbClient = new SsdbClient(sharding); 使用注意线程安全
误用导致内存占用过高因为一个 更新
![]() |
请发表评论