yiding-he / hydrogen-ssdb Goto Github PK
View Code? Open in Web Editor NEWJava 编写的 SSDB 客户端,支持负载均衡
License: Apache License 2.0
Java 编写的 SSDB 客户端,支持负载均衡
License: Apache License 2.0
官方hlist接口文档写的好像不对,返回的应该是hash name的集合
官方hlist接口没有key这个参数,如果有了key参数,那和hscan是一样的了
public List hlist(String key, String startExclude, String endInclude, int limit) {
return sendRequest("hlist", key, startExclude, endInclude, limit).getKeyValues();
}
public List hrlist(String key, String startExclude, String endInclude, int limit) {
return sendRequest("hrlist", key, startExclude, endInclude, limit).getKeyValues();
}
感谢
导致过大的score出现解析异常:
java.lang.NumberFormatException: For input string: "6832770000"
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
java.lang.Integer.parseInt(Integer.java:495)
java.lang.Integer.parseInt(Integer.java:527)
com.hyd.ssdb.protocol.Response.getIdScores(Response.java:130)
com.hyd.ssdb.SsdbClient.zrrange(SsdbClient.java:435)
zset接口定义
public void zset(String key, String id, long score) {
sendWriteRequest("zset", key, id, score);
}
IdScore定义
private String id;
private int score;
没有 找到该方法
因为某种原因 ,没有实现 该方法吗?
com.hyd.ssdb.SsdbNoClusterAvailableException: NO CLUSTER AVAILABLE
CAUSE:null
at com.hyd.ssdb.sharding.ConsistentHashSharding.getClusterByKey(ConsistentHashSharding.java:281)
at com.hyd.ssdb.conn.ConnectionPoolManager.getConnection(ConnectionPoolManager.java:77)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:116)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:94)
at com.hyd.ssdb.SsdbClient.multiGetBytes(SsdbClient.java:343)
at tools.Ssdb.multiGetBytes(Ssdb.java:174)
at runnable.SsdbQueue.run(SsdbQueue.java:105)
at java.lang.Thread.run(Thread.java:748)
请问这个错误是什么原因呀 目前是一主一从,但是从没有请求,内存是6G,连接主的偶尔会报这个错误
Response的getBytes方法实现不正确,不应该调用toBytes方法,盼修正
public byte[] getBytes() {
return this.body.isEmpty() ? new byte[0] : this.body.get(0).toBytes();
}
偶尔发现放进去的 key 取不出来,近期修复
我这么初始化的 SsdbClient ssdbClient = new SsdbClient("10.1.8.16", 8000, 3, "xxxxx");
但是请求量大了就会报com.hyd.ssdb.SsdbNoClusterAvailableException: NO CLUSTER AVAILABLE错误。是我使用的方式不对吗
第一:设计问题
public int getIntResult() {
if (header.equals("not_found")) {
return -1;
} else {
return Integer.parseInt(firstBlock());
}
}
返回 -1 ,在语义层面是有两个问题:
第二:接口异常
接口 zget
在获取不存在数据的时候,会抛异常。其他类似接口应该也有同样问题。
最后: 修改建议
int
long
分别修改成 Integer
Long
。通过 null 表示查询的结果不存在。正常ssdb命令参数应该是"name,key_start,score_start,score_end,limit",但ssdbclient里面的是"key,startExclude,endInclude,limit"参数错误,执行会报client_error.
实际上ssdb server返回的错误是
server.cpp(340): w:0.061,p:0.007, req: zscan key1 "" "" 10, resp: client_error wrong number of arguments
建议后续大家使用更改如下:
public List<IdScore> zscan(String name,String keyStart, Long scoreStart, Long scoreEnd, int limit)
{
return sendRequest("zscan", name, keyStart, scoreStart==null?"":scoreStart.longValue(), scoreEnd==null?"":scoreEnd.longValue(), limit).getIdScores();
}
public List<KeyValue> hgetall(String key) {
return sendRequest("hgtall", key).getKeyValues();
}
public Map<String, String> hgetallmap(String key) {
return sendRequest("hgtall", key).getBlocksAsMap();
}
为啥不发布到maven**仓库?
hello 请问qslice 是否支持可以返回List
[yiding-he] 需要为下列命令添加二进制数据支持:
ssdb关键配置参数如下:
leveldb:
# in MB
cache_size: 500
# in MB
write_buffer_size: 64
# in MB/s
compaction_speed: 1000
# yes|no
compression: yes
m1、m2、m3是ssdb集群的三个replication,数据库文件大小如下:
[root@iZbp15qbhzylu7lbul26qqZ ~]# du -h --max-depth=1 /data/ssdb/bak/
1.7G /data/ssdb/bak/m2
1.7G /data/ssdb/bak/m3
584M /data/ssdb/bak/m1
3.9G /data/ssdb/bak/
我通过hydrogen-ssdb连接ssdb时,发现只能读取数据,无法set和del,然后连接大约600秒钟后,出现SocketTimeout错误。
请问一下这个可能是什么问题引发的?
尝试连接发送数据时,返回“noauth”异常。
初始化Client时已经设置pass参数,且对应参数本地terminal多次尝试均没有问题。
SsdbClient client = new SsdbClient('127.0.0.1', 18888,"pass");
client.set("key", "value");//noauth error
仔细阅读源码后发现并没有在send数据前进行auth操作,不知是否是此处有问题。
如果是我的问题希望可以在README中加入关于校验密码的Demo,感谢!
报错信息如下
[2020-02-28 03:01:40]java.lang.NullPointerException
CAUSE:null
at com.hyd.ssdb.protocol.Request.readTokens(Request.java:71)
at com.hyd.ssdb.protocol.Request.<init>(Request.java:37)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:94)
at com.hyd.ssdb.SsdbClient.getBytes(SsdbClient.java:110)
at tools.Ssdb.get(Ssdb.java:81)
at tools.ssdb.SsdbReportLog.arrToLog(SsdbReportLog.java:28)
at tools.ssdb.SsdbReportLog.reportToLog(SsdbReportLog.java:180)
at tools.SsdbReports.main(SsdbReports.java:254)
升级了最新的jar包,但是测试时,仍不能解决服务器故障,恢复不了的问题,请问下,还需要什么配置的吗
长时间运行,有时会出现下面的报错(有可能几天出现一次)。ssdb 监测并没发现问题。
建立方式 client = new SsdbClient(host,port,timeout, auth);
使用版本1.2.2
[2020-07-29 11:00:11]com.hyd.ssdb.SsdbNoClusterAvailableException: NO CLUSTER AVAILABLE
CAUSE:null
at com.hyd.ssdb.sharding.ConsistentHashSharding.getClusterByKey(ConsistentHashSharding.java:281)
at com.hyd.ssdb.conn.ConnectionPoolManager.getConnection(ConnectionPoolManager.java:77)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:116)
at com.hyd.ssdb.AbstractClient.sendRequest(AbstractClient.java:94)
at com.hyd.ssdb.SsdbClient.getBytes(SsdbClient.java:110)
KeyValue 的 Value 不支持bytes[]。希望可以支持
你好, 我今天把代码down下来看了下. 在测试的时候发现报错.
SsdbClient client = new SsdbClient(Sharding.fromServerList(servers));
client.set("name", "hydrogen-ssdb"); // 写入请求一定会发送给主服务器
System.out.println(client.get("name")); // 读取请求会随机发送给任意一台服务器
案例中的 Sharding.fromServerList(servers)方法报错.
我看了下源代码, Sharding类里边没有找到这个方法.
这个方法是不用了没有更新使用demo吗? 还是其他原因?
现在的实现,一旦网络出现异常,就会把对应的服务器下线。这个策略对于生产环境是不可以接受的,所以我就修改了实现——删除 Cluster.markInvalid 的实现。
网络波动的问题,也是这个修改出现的。具体是出现在了连接池的使用上面。链接失败的时候,会对 available 赋值成 false。预期是告诉连接池,后面不要再用这个连接。 但是在使用连接池的时候,没有设置 testOnBorrow。borrowObject 时看到 ideal 的资源就会返回调用者。
if (p != null && (getTestOnBorrow() || create && getTestOnCreate())) {
boolean validate = false;
Throwable validationThrowable = null;
try {
validate = factory.validateObject(p);
} catch (Throwable t) {
PoolUtils.checkRethrow(t);
validationThrowable = t;
}
if (!validate) {
try {
destroy(p);
destroyedByBorrowValidationCount.incrementAndGet();
} catch (Exception e) {
// Ignore - validation failure is more important
}
p = null;
if (create) {
NoSuchElementException nsee = new NoSuchElementException(
"Unable to validate object");
nsee.initCause(validationThrowable);
throw nsee;
}
}
}
目前,我的解决方案是创建连接池的时候,设置上 testOnBorrow.
private ConnectionPool getConnectionPool(final Server server) {
synchronized (server) {
if (connectionPoolMap.containsKey(server)) {
return connectionPoolMap.get(server);
}
ConnectionPool connectionPool = createConnectionPool(server);
connectionPool.setTestOnBorrow(true); // 新增代码
connectionPoolMap.put(server, connectionPool);
return connectionPool;
}
}
Conection 类的 receivePacket 方法里,对字节流做了解析,但是输出的还是字节流。
真正使用的时候,需要在Response中再解析一次。这样会影响性能
我测试了一下,ssdb数据库会将同一个socket连接在同时发生的操作的结果放在一个输出流中,导致了其他操作返回为null的情况,请问下除了对每个socket连接加个锁这种方式,还有其他什么好的办法
public void reportInvalidConnection(String host, int port) {
Server toInvalidate = new Server(host, port);
for (Cluster cluster : sharding.getClusters()) {
if (cluster.containsServer(toInvalidate)) {
cluster.markInvalid(toInvalidate);
}
}
}
这段代码, 标记不可用的时候,new了一个server. 默认是master.
从节点也会被当成master标记为不可用,恢复从节点时, 从节点会恢复成主节点.
状态机处理,未考虑到空字符串的情况
话说你这个
`
protected List clusters = new ArrayList();
Cluster cluster = clusters.get(i);
int min, max;
if (i == clusters.size() - 1) {
min = ((int) (pointer + Integer.MIN_VALUE) + 1);
max = (Integer.MAX_VALUE);
setClusterRange(cluster, min, max);
} else {
min = i == 0 ? Integer.MIN_VALUE : (int) (pointer + Integer.MIN_VALUE) + 1;
weightcounter += cluster.getWeight();
pointer = maxrange * weightcounter / maxWeight;
max = ((int) (pointer + Integer.MIN_VALUE));
setClusterRange(cluster, min, max);
}`
这个应该和你放入的顺序有关了吧,假设你的顺序更换了,我所有的分片都会乱掉了。
最好支持可以带名称的集群
配置类:HydrogenSsdbAutoConfiguration
配置前缀:hssdb.*
你好,我编译的时候报了缺少文件的错误,能帮忙看看吗,正确的编译方式,编译命令是什么呀
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ClusterConf.java:[3,14] package lombok does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ClusterConf.java:[8,2] cannot find symbol
symbol: class Data
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[5,14] package lombok does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[7,51] package org.springframework.boot.context.properties does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[9,2] cannot find symbol
symbol: class Data
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[3,14] package lombok does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[4,51] package org.springframework.boot.context.properties does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[9,2] cannot find symbol
symbol: class ConfigurationProperties
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConf.java:[10,2] cannot find symbol
symbol: class Data
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[7,56] package org.springframework.boot.autoconfigure.condition does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[8,51] package org.springframework.boot.context.properties does not exist
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[15,2] cannot find symbol
symbol: class EnableConfigurationProperties
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[20,6] cannot find symbol
symbol: class NestedConfigurationProperty
location: class com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[23,6] cannot find symbol
symbol: class NestedConfigurationProperty
location: class com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[21,6] cannot find symbol
symbol: class ConditionalOnMissingBean
location: class com.hyd.ssdb.springboot.HydrogenSsdbConfigurator
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/ServerConf.java:[21,50] createDefaultPoolConfig() has private access in com.hyd.ssdb.conf.Server
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[24,23] cannot find symbol
symbol: method getClusters()
location: variable config of type com.hyd.ssdb.springboot.HydrogenSsdbConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[30,39] cannot find symbol
symbol: method getServers()
location: variable clusterConf of type com.hyd.ssdb.springboot.ClusterConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[36,40] cannot find symbol
symbol: method getPool()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[37,42] cannot find symbol
symbol: method getSocket()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[38,36] cannot find symbol
symbol: method isMaster()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[39,34] cannot find symbol
symbol: method getHost()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[40,34] cannot find symbol
symbol: method getPort()
location: variable serverConf of type com.hyd.ssdb.springboot.ServerConf
[ERROR] /home/jenkins_data/workspace/ssdbcli-jar/src/main/java/com/hyd/ssdb/springboot/HydrogenSsdbConfigurator.java:[41,34] cannot find symbol
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.