SSDB —— 开源NoSQL数据库 Redis之外的选择

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: SSDB是一个快速的用来存储十亿级别列表数据的开源 NoSQL 数据库。

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


特性

  • 替代 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.226s

==========get==========

qps:55541,time:0.180s

==========del==========

qps:46080,time:0.217s

==========hset==========

qps:42338,time:0.236s

==========hget==========

qps:55601,time:0.180s

==========hdel==========

qps:46529,time:0.215s

==========zset==========

qps:37381,time:0.268s

==========zget==========

qps:41455,time:0.241s

==========zdel==========

qps:38792,time:0.258s

在MacBook Pro 13 (Retina屏幕)上运行。

与redis的比较:

性能数据使用 ssdb-bench(SSDB) 和 redis-benchmark(Redis) 来获取。

image.png

架构

image.png


安装

下载压缩包,解压缩

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);

   iferr != 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)

           ifnot ok then

               ngx.say("failed to connect: ", err)

               return

           end

           ok, err = db:set("dog", "an animal")

           ifnot ok then

               ngx.say("failed to set dog: ", err)

               return

           end

           ngx.say("set result: ", ok)

           local res, err = db:get("dog")

           ifnot 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()

           ifnot 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

                   ifnot 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)

           ifnot 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"

intmain(int argc, char **argv){

   constchar *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");

       return0;

   }

   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;

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
21天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
13天前
|
存储 缓存 NoSQL
常见的 NoSQL 数据库有哪些?
常见的 NoSQL 数据库有哪些?
20 2
|
29天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
104 4
|
30天前
|
存储 SQL JSON
介绍一下RDBMS和NoSQL数据库之间的区别
【10月更文挑战第21天】介绍一下RDBMS和NoSQL数据库之间的区别
62 2
|
30天前
|
存储 SQL NoSQL
数据库技术深度探索:从关系型到NoSQL的演变
【10月更文挑战第21天】数据库技术深度探索:从关系型到NoSQL的演变
39 1
|
1月前
|
存储 JSON Ubuntu
时序数据库 TDengine 支持集成开源的物联网平台 ThingsBoard
本文介绍了如何结合 Thingsboard 和 TDengine 实现设备管理和数据存储。Thingsboard 中的“设备配置”与 TDengine 中的超级表相对应,每个设备对应一个子表。通过创建设备配置和设备,实现数据的自动存储和管理。具体操作包括创建设备配置、添加设备、写入数据,并展示了车辆实时定位追踪和车队维护预警两个应用场景。
61 3
|
1月前
|
存储 NoSQL 搜索推荐
nosql
【10月更文挑战第14天】nosql
21 2
|
1月前
|
NoSQL 前端开发 MongoDB
前端的全栈之路Meteor篇(三):运行在浏览器端的NoSQL数据库副本-MiniMongo介绍及其前后端数据实时同步示例
MiniMongo 是 Meteor 框架中的客户端数据库组件,模拟了 MongoDB 的核心功能,允许前端开发者使用类似 MongoDB 的 API 进行数据操作。通过 Meteor 的数据同步机制,MiniMongo 与服务器端的 MongoDB 实现实时数据同步,确保数据一致性,支持发布/订阅模型和响应式数据源,适用于实时聊天、项目管理和协作工具等应用场景。
|
15天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
17天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
30 4
下一篇
无影云桌面