终于, SSDB 支持 Redis 协议了! 这表示, 你可以用目前所有成熟的 Redis 客户端来连接 SSDB 服务器, 包括 hiredis, phpredis, redigo 等等.
SSDB 支持 Redis 网络协议, 既是一个技术问题, 也有技术之外的考虑.
首先, Redis 的网络协议对手工输入不够友好. 它采用的是前置长度(块数量)信息的报文格式, 这种数据格式是比较原始的 Linux 配置文件的格式. 相比较, SSDB 采用的是类似 HTTP 报头与报体分隔的方式 - 空白行, 这种方式在输入的时候十分自然, 按两次回车表示请求结束, 并且和响应的输出也能在视觉上分开.
其次, Redis 的网络协议不干净, 也就是不透明. Redis 将报文分为请求和响应两种, 如果仅有这两种, 那也就算了. 要命的是, 它的响应竟然分了5种类型, 导致协议的实现者要做许多的 if-else 判断. 在实现 Redis 协议的过程, 发现这种划分根本没有任何实际意义, 还不如改成统一协议(unified protocol).
所以, SSDB 的网络协议在设计过程中避免了这些繁琐的细节. 这种设计的结果是, 即使用 C 语言来实现一个 SSDB 协议的解析器, 也只有区区不到 100 行代码!
另外, SSDB 在以前不支持 Redis 协议, 也是因为两者实现的原理不同, 有些操作是无法共通的.
最近在 3W 咖啡和大家交流时, 大家纷纷表示希望 SSDB 能支持 Redis 协议, 以便能降低他们试用 SSDB 的门坎. 从这个角度来看, SSDB 确实应该支持 Redis 协议. 所以, SSDB 就支持 Redis 协议了!
当然, 不是所有的命令都支持, 完整的列表见这里: http://www.ideawu.com/ssdb/docs/zh_cn/redis-to-ssdb.html
目前, redis-cli 和 phpredis 已经经过测试, 其它的语言和 Redis 客户端还没有测试, 欢迎大家使用并反馈.
删除整个db Reply
想在yii项目中使用ssdb 这个吴兄能不能实现一个 由你实现最好啦 ^-^
只要支持这些对应的redis命令就可以了:
https://github.com/yiisoft/yii2/blob/master/extensions/redis/Cache.php Reply
你搭建一个 ssdb 来测试只需要 1 分钟, 而我搭一个 yii 的测试环境可能要半个小时. 所以, 这个工作交给你来实现最好. 而且, 我对 yii 的代码协作方式不了解, 不愿意把时间放在这上面. 所以, 还是你来吧. Reply
以前也是听说 最近想试试而以。
祝此项目越来越好! Reply
SSDB支持Redis协议后,用Perl的Redis模块调用,绝大部分命令正常运行,但用zrangebyscore命令时遇到问题,运行正常,没有报错,返回值总是空数组,而zremrangebyscore命令正常,查看作者Blog中的文章,似乎是命令参数规格问题,SSDB provides zscan, which is similar to zRangeByScore.
Redis:zRangeByScore(name, score_start, score_end, options);SSDB:zscan(name, key_start, score_start, score_end, limit);依此各种参数方式都试过,Perl Redis模块试过Redis、redis::Client、Mojo::Redis,结果一样。使用的SSDB版本是ssdb-server-1.6.8.6,Window XP。 Reply
麻烦给予答复,谢谢! Reply
jedis连接的代码如下:
package com.jxx.coo;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
/**
* Created by xx on 2014/5/21.
*/
public class SSDBJedis {
public static void main(String[] args) {
String testKey = "hello";
String value = "redis";
JedisShardInfo jedisShardInfo = new JedisShardInfo("192.168.193.247",8888);
Jedis jedis = new Jedis(jedisShardInfo);
String jedisSetResult = jedis.set(testKey, value);
System.out.println("jedisSetResult = " + jedisSetResult);
}
}
连不上出现的异常信息如下:
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
at redis.clients.jedis.Connection.connect(Connection.java:134)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:69)
at redis.clients.jedis.Connection.sendCommand(Connection.java:79)
at redis.clients.jedis.BinaryClient.set(BinaryClient.java:86)
at redis.clients.jedis.Client.set(Client.java:21)
at redis.clients.jedis.Jedis.set(Jedis.java:50)
at com.jd.coo.SSDBJedis.main(SSDBJedis.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at redis.clients.jedis.Connection.connect(Connection.java:129)
… 11 more
用jedis连接需要做别的特殊配置吗? Reply
最近一直在选型,从原postgres转KVS, 参考了TT-TC /KT-KC(只能千万级别,胜在主主模式) ,Redis(复制机制蛋痛),mongoDB(传闻丢数据),HyperDex(有点自吹自擂)……
然后发现了SSDB !! very good Reply