`
kavy
  • 浏览: 891110 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SSDB Redis替代品

 
阅读更多

本文地址: http://www.ttlsa.com/redis/ssdb-redis-alternatives/
除非注明,博客文章均为"运维生存时间"原创,转载请标明本文地址

 

SSDB是一个快速的用来存储十亿级别列表数据的开源 NoSQL 数据库。

项目地址:https://github.com/ideawu/ssdb

http://ssdb.io/

特性

  • 替代 Redis 数据库, Redis 的 100 倍容量
  • LevelDB 网络支持, 使用 C/C++ 开发
  • Redis API 兼容, 支持 Redis 客户端
  • 适合存储集合数据, 如 list, hash, zset…
  • 客户端 API 支持的语言包括: C++、PHPPython、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) 来获取。

redis

架构

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

<?php
include_once('SSDB.php');
try{
    $ssdb = new SimpleSSDB('127.0.0.1', 8888);
}catch(Exception $e){
    die(__LINE__ . ' ' . $e->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:8889"
 
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<len(resp); i+=2{
        fmt.Printf("  %s : %3s\n", resp[i], resp[i+1]);
    }
    return;

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 <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
#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;
}
<iframe id="aswift_0" style="left: 0px; position: absolute; top: 0px;" name="aswift_0" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="728" height="90"></iframe>
 
分享到:
评论

相关推荐

    ssdb-redis

    SSDB-Redis是一款高效、可替代Redis的数据存储系统,它主要设计用于解决Redis在面对大数据量时可能遇到的内存不足问题。SSDB的核心优势在于其数据完全离线存储,这意味着它可以将数据保存到硬盘上,而不仅仅依赖于...

    SSDB - 快速 NoSQL 数据库,Redis 的替代品.zip

    SSDB - Redis-compatible NoSQL database stored on disk高性能的键值(key-string、key-zset、key-hashmap)NoSQL 数据库,是 Redis 的替代品。SSDB性能稳定,已投入生产,并被包括奇虎360在内的多家互联网公司广泛...

    性能超越Redis的NoSQL数据库SSDB.zip

    SSDB 是一个 C/C 语言开发的高性能 NoSQL 数据库, 支持 zset(sorted set), map(hash), kv, list 等数据结构, 用来替代或者与 Redis 配合存储十亿级别列表的数据. SSDB 在 QIHU 360 被大量使用, 同时也被国内外业界...

    Python-ssdbya又一个ssdb的Python客户端用来替代Redis的NoSQL数据库

    Python SSDBYA是针对SSDB数据库的Python接口,它旨在作为Redis的NoSQL数据库替代品。SSDB(Simple Scalable Database)是一款高性能、可扩展的键值存储系统,适用于大量数据的场景。Python SSDBYA客户端为Python...

    互联网分布式缓存技术(redis、memcached、ssdb)

    互联网分布式缓存技术 课程主讲: 互联网应用高级架构师 白贺翔涉及技术: Redis、SSDB、Memcached课程描述: 介绍互联网分布式技术的重要性、背景、应用范围;目前互联网行业使用分布 式缓存进行设计的比例,...

    第三章 Redis/SSDB+Twemproxy安装与使用

    Redis和SSDB是两种常用的键值存储系统,广泛应用于数据缓存、消息队列等场景。Twemproxy,又称为Nutcracker,是一款轻量级的代理服务,用于在多台Redis或SSDB服务器之间分发请求,提高系统的可扩展性和可用性。本...

    ssdb:SSDB-快速的NoSQL数据库,可替代Redis

    SSDB-磁盘上存储的Redis兼容NoSQL数据库 SSDB是高性能键值(key-string,key-zset,key-hashmap)NoSQL数据库,是Redis的替代产品。 SSDB稳定,可立即投入生产,并被包括QIHU 360在内的许多互联网公司广泛使用。特征...

    ssdb的java SDK

    SSDB 支持 Redis 网络协议, 所以你可以用 Redis 的客户端来连接 SSDB 服务器. 但是, 使用 SSDB 客户端是最高效的方式. 所有的 SSDB 客户端 API 都是支持二进制数据的, 二进制数据即是字符串, 字符串就是二进制数据...

    Ruby-迁移SSDB到RedisPika工具集Ruby实现

    SSDB是一个高性能、可替代Redis的键值存储系统,设计用于处理大量数据。它支持多种数据结构,如字符串、列表、哈希表和有序集合,这使得它在许多应用场景下非常有用。 接着,我们来谈谈Redis。Redis是一个开源的、...

    SSDB详细解说

    其目标是作为Redis的替代品或补充,特别是在面对十亿级别列表数据存储时。SSDB利用Google LevelDB作为存储引擎,以实现高效的读写性能和内存占用优化。 1. SSDB的特点: - **数据结构**:SSDB提供了与Redis类似的...

    ssdb for windows

    SSDB(Simple Scalable Database)是一款高性能、可扩展的NoSQL数据库系统,主要设计用于替代Redis,尤其是在Windows操作系统上的应用场景。SSDB的核心特性包括键值存储、哈希表、集合、有序集合等数据结构,支持...

    跨平台redisproxy代理服务器RedisProxy.zip

    介绍dbproxy是一个采用C 11编写的代理服务器,支持redis和 ssdb数据库。 其主要用于扩容和提高系统负载。使用lua控制sharding,把不同的key-value映射到不同的后端redis或ssdb服务器。构建dbproxy支持windwos和linux...

    ssdb Java 驱动

    SSDB(Simple Scalable Database)是一款高性能、分布式、键值对存储系统,主要设计用于替代Redis,尤其是在处理大规模数据时,SSDB在性能上表现出显著优势。本文将深入探讨SSDB Java驱动,以及如何利用它在Java应用...

    Redis学习笔记.pdf

    代表产品包括Redis、SSDB、Voldemort、Oracle BDB等。 列存储数据库将数据存储为列族的形式,适合于分布式存储的海量数据,优势在于可以对某一列进行高效地读写操作。代表产品有Cassandra、HBase、Riak等。 文档型...

    Python-SSDB可视化界面管理工具ssdbwebmanagertool

    SSDB是一种高性能、轻量级的NoSQL数据库,常用于替代Redis,特别是在对大数据量处理有需求但资源有限的场景下。 在Python开发领域,SSDBAdmin利用Python的强大灵活性和丰富的库支持,实现了与SSDB数据库的高效交互...

    ssdb的java驱动

    SSDB 是一个高性能 NoSQL 数据库, 使用 LevelDB 作为存储引擎, 支持 Redis 协议.... SSDB一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis...

    ssdb备份(快速删除文件)

    SSDB(Simple Scalable Database)是一款高性能、高可用性的NoSQL数据库,主要设计用于替代Redis。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合,且具有良好的扩展性,适用于大规模分布式环境。在管理...

    cavedb:用leveldb包装的仿制的redis进展内部数据库,必须以redis或ssdb主要库使用。适合用于多读少写的服务器数据

    这是一个实现了ssdb和redis同步协议的同步工具,它可以从ssdb或redis同步数据。目前同步redis还有bug,从比较大的redis同步的时候会出现被主库中断连接的情况,所以实际同步不支持redis的列表和ssdb的队列容器。遇到...

    redis-admin-web:redis, ssdb 管理页面

    SSDB,即Simple Scalable Database,是一个高性能的Key-Value数据库,设计目标是对Redis的一种平价替代。SSDB支持多种数据类型,包括字符串、哈希表、列表、排序集等,同时提供了类似Redis的命令接口。SSDB在持久化...

    SSDB入门基础.docx

    作为 Redis 的替代品,SSDB 提供了类似 Redis 的 API,并且支持多种编程语言的客户端,如 PHP、C++、Python、Java、Lua、Ruby 和 Node.js。 在 SSDB 中,有三种主要的数据类型:KV(Key-value)、Hashmap 和 Zset...

Global site tag (gtag.js) - Google Analytics