视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
SSDBRedis替代品
2020-11-09 13:08:07 责编:小采
文档


SSDB是一个快速的用来存储十亿级别列表数据的开源 NoSQL 数据库。项目地址:https://github.com/ideawu/ssdbhttp://ssdb.io/ 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ 开发 Redis API 兼容, 支持 Redis 客户端 适合存储集

SSDB是一个快速的用来存储十亿级别列表数据的开源 NoSQL 数据库。 项目地址:https://github.com/ideawu/ssdb http://ssdb.io/

特性

  • 替代 Redis 数据库, Redis 的 100 倍容量
  • LevelDB 网络支持, 使用 C/C++ 开发
  • Redis API 兼容, 支持 Redis 客户端
  • 适合存储集合数据, 如 list, hash, zset...
  • 客户端 API 支持的语言包括: C++、PHP、Python、Cpy、Java、NodeJS、Ruby、Go。
  • 持久化的队列服务
  • 主从复制, 负载均衡
  • 性能

    1000请求:
    writeseq : 0.546 ms/op 178.7 MB/s
    writerand : 0.519 ms/op 188.1 MB/s
    readseq : 0.304 ms/op 321.6 MB/s
    readrand : 0.310 ms/op 315.0 MB/s
    并发:
    ========== set ==========
    qps: 44251, time: 0.226 s
    ========== get ==========
    qps: 55541, time: 0.180 s
    ========== del ==========
    qps: 46080, time: 0.217 s
    ========== hset ==========
    qps: 42338, time: 0.236 s
    ========== hget ==========
    qps: 55601, time: 0.180 s
    ========== hdel ==========
    qps: 46529, time: 0.215 s
    ========== zset ==========
    qps: 37381, time: 0.268 s
    ========== zget ==========
    qps: 41455, time: 0.241 s
    ========== zdel ==========
    qps: 38792, time: 0.258 s
    在MacBook Pro 13 (Retina屏幕)上运行。 与redis的比较: 性能数据使用 ssdb-bench(SSDB) 和 redis-benchmark(Redis) 来获取。

    架构

    安装

    下载压缩包,解压缩
    wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
    unzip master
    cd ssdb-master
    编译
    make
    安装(可选)
    sudo make install
    运行
    ./ssdb-server ssdb.conf
    或者以后台的方式运行
    ./ssdb-server -d ssdb.conf
    ssdb命令行
    ./tools/ssdb-cli -p 8888
    停止ssdb-server
    kill `cat ./var/ssdb.pid`

    使用

    PHP

    getMessage());
    }
    $ret = $ssdb->set('key', 'value');
    if($ret === false){
     // error!
    }
    echo $ssdb->get('key');

    Python

    使用pyssdb
    >>> import pyssdb
    >>> c = pyssdb.Client()
    >>> c.set('key', 'value')
    1
    >>> c.get('key')
    'value'
    >>> c.hset('hash', 'item', 'value')
    1
    >>> c.hget('hash', 'item')
    'value'
    >>> c.hget('hash', 'not exist') is None
    True
    >>> c.incr('counter')
    1
    >>> c.incr('counter')
    2
    >>> c.incr('counter')
    3
    >>> c.keys('a', 'z', 1)
    ['counter']
    >>> c.keys('a', 'z', 10)
    ['counter', 'key']

    Ruby

    使用ssdb-rb
    require "ssdb"
    ssdb = SSDB.new url: "ssdb://1.2.3.4:88"
    ssdb.set("mykey", "hello world")
    # => true
    ssdb.get("mykey")
    # => "hello world"
    ssdb.batch do
     ssdb.set "foo", "5"
     ssdb.get "foo"
     ssdb.incr "foo"
    end
    # => [true, "5", 6]

    Go

    package main
    import (
     "fmt"
     "os"
     "./ssdb"
     )
    func main(){
     ip := "127.0.0.1";
     port := 8888;
     db, err := ssdb.Connect(ip, port);
     if(err != nil){
     os.Exit(1);
     }
     var val interface{};
     db.Set("a", "xxx");
     val, err = db.Get("a");
     fmt.Printf("%s\n", val);
     db.Del("a");
     val, err = db.Get("a");
     fmt.Printf("%s\n", val);
     db.Do("zset", "z", "a", 3);
     db.Do("multi_zset", "z", "b", -2, "c", 5, "d", 3);
     resp, err := db.Do("zrange", "z", 0, 10);
     if err != nil{
     os.Exit(1);
     }
     if len(resp) % 2 != 1{
     fmt.Printf("bad response");
     os.Exit(1);
     }
     fmt.Printf("Status: %s\n", resp[0]);
     for i:=1; i
    

    ngx_lua

    使用lua-resty-ssdb
    lua_package_path "/path/to/lua-resty-ssdb/lib/?.lua;;";
    server {
     location /test {
     content_by_lua '
     local ssdb = require "resty.ssdb"
     local db = ssdb:new()
     db:set_timeout(1000) -- 1 sec
     local ok, err = db:connect("127.0.0.1", 8888)
     if not ok then
     ngx.say("failed to connect: ", err)
     return
     end
     ok, err = db:set("dog", "an animal")
     if not ok then
     ngx.say("failed to set dog: ", err)
     return
     end
     ngx.say("set result: ", ok)
     local res, err = db:get("dog")
     if not res then
     ngx.say("failed to get dog: ", err)
     return
     end
     if res == ngx.null then
     ngx.say("dog not found.")
     return
     end
     ngx.say("dog: ", res)
     db:init_pipeline()
     db:set("cat", "Marry")
     db:set("horse", "Bob")
     db:get("cat")
     db:get("horse")
     local results, err = db:commit_pipeline()
     if not results then
     ngx.say("failed to commit the pipelined requests: ", err)
     return
     end
     for i, res in ipairs(results) do
     if type(res) == "table" then
     if not res[1] then
     ngx.say("failed to run command ", i, ": ", res[2])
     else
     -- process the table value
     end
     else
     -- process the scalar value
     end
     end
     -- put it into the connection pool of size 100,
     -- with 0 idle timeout
     local ok, err = db:set_keepalive(0, 100)
     if not ok then
     ngx.say("failed to set keepalive: ", err)
     return
     end
     -- or just close the connection right away:
     -- local ok, err = db:close()
     -- if not ok then
     -- ngx.say("failed to close: ", err)
     -- return
     -- end
     ';
     }
    }

    C++

    #include 
    #include 
    #include 
    #include 
    #include "SSDB.h"
    int main(int argc, char **argv){
     const char *ip = (argc >= 2)? argv[1] : "127.0.0.1";
     int port = (argc >= 3)? atoi(argv[2]) : 8888;
     ssdb::Client *client = ssdb::Client::connect(ip, port);
     if(client == NULL){
     printf("fail to connect to server!\n");
     return 0;
     }
     ssdb::Status s;
     s = client->set("k", "hello ssdb!");
     if(s.ok()){
     printf("k = hello ssdb!\n");
     }else{
     printf("error!\n");
     }
     delete client;
     return 0;
    }
    下载本文
    显示全文
    专题