首页 > 数据库 >SSDB Redis替代品

SSDB Redis替代品

时间:2023-08-11 15:39:25浏览次数:47  
标签:set err SSDB db Redis ssdb time 替代品 qps


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) 来获取。

SSDB Redis替代品_#include

架构

SSDB Redis替代品_ruby_02

安装

下载压缩包,解压缩


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
<?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;
}

标签:set,err,SSDB,db,Redis,ssdb,time,替代品,qps
From: https://blog.51cto.com/u_16087105/7048250

相关文章

  • Redis/SSDB+Twemproxy安装与使用
    目前对于互联网公司不使用Redis的很少,Redis不仅仅可以作为key-value缓存,而且提供了丰富的数据结果如set、list、map等,可以实现很多复杂的功能;但是Redis本身主要用作内存缓存,不适合做持久化存储,因此目前有如SSDB、ARDB等,还有如京东的JIMDB,它们都支持Redis协议,可以支持Redis客户端......
  • 揭秘华为云GaussDB(for Redis)丨大key治理
    本文分享自华为云社区《华为云GaussDB(forRedis)揭秘第31期:大key治理》,作者:高斯Redis官方博客。从DBA的视角看,大Key无疑是引起Redis线上问题的常见原因。为了解决大Key隐患,业务首先要遵守合理的开发规范,减少大Key的产生和访问依赖。但有时大Key是在程序运行过程中悄悄产生的,让......
  • 揭秘华为云GaussDB(for Redis)丨大key治理
    本文分享自华为云社区《华为云GaussDB(forRedis)揭秘第31期:大key治理》,作者:高斯Redis官方博客。从DBA的视角看,大Key无疑是引起Redis线上问题的常见原因。为了解决大Key隐患,业务首先要遵守合理的开发规范,减少大Key的产生和访问依赖。但有时大Key是在程序运行过程中悄悄产生的,让人......
  • GaussDB(DWS)函数不同写法引发的结果差异
    本文分享自华为云社区《GaussDB(DWS)函数结果差异案例之greatest》,作者:你是猴子请来的救兵吗。GaussDB(DWS)支持多种兼容模式,为了兼容目标数据库,各模式之间或多或少存在一些行为差异。这里分享一个mysql兼容模式下的表达式函数因不同写法引发的结果差异案例。问题背景问题版本 Gau......
  • Redis:单机、哨兵、集群、主从复制
    学习自:redis的4种模式,单机,哨兵、主从复制、集群_redis单机和集群_本郡主是喵的博客-CSDN博客深入理解Redis的单机、主从、哨兵、集群四种模式为什么redis被称为redis服务器?因为redis在运行时是被注册为一个进程(服务),我们将其称为redis服务器。1、单机模式安装redis,启动服务后,......
  • redis持久化
    redis持久化RDB过程:redis使用fork函数复制一份当前进程(父进程)的副本(子进程)父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件当子进程写完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成在执行fork的时候操作系统会......
  • 在Java中操作Redis_Spring Data Redis使用方式_其他类型的数据操作
        ......
  • 在Centos-linux上下载安装redis
    一、下载参考redis官网提供的操作指南。官网地址https://redis.io/download创建目录下载压缩包wgethttps://download.redis.io/releases/redis-7.0.7.tar.gz解压tarxzfredis-7.0.7.tar.gz二、安装进入文件夹目录,进行编译(注意:此目录下有redis说明文件“README.md”,有时......
  • 在Java中操作Redis_Spring Data Redis使用方式_操作字符串类型的数据
        ......
  • 在Java中操作Redis_Spring Data Redis使用方式_环境搭建
        ......