首先说一下背景,在双十一的时候,我们系统接受X宝的订单推送,同事原先的实现方式是使用redis的List作为推送数据的承载,在非大促的场景下,

一切运行正常,内存占用大概3-4G,机器是16G内存。由于提前预计不足,在双十一来临的时候,订单瞬时量达到了平时的10X倍,内存非常吃紧,情况算

是非常紧急了,采取的临时解决方案就是再开一个redis,将程序中的redis地址指向这台新的,重启一下程序,把数据暂时引导过去。

一:分析

redis确实是一个好东西,一个如此强大的内存数据结构服务器,全内存存储,有些场景,恰恰你会死在全内存上,而且相对ssd硬盘来说,内存还是

太小了。内存很便宜,但是内存和ssd比起来很贵,况且有些场景你可能根本不需要使用全内存,使用硬盘也许会更能帮助我们节省成本,你可能会说,现

在业界标准已经差不多是kafka了,有时候我们还需要redis里面的hash,也就是说我现在需要kafka + redis 的一个综合体的产品,这就是本篇和大家说到的

ssdb,当然ssdb和kafka还是不能相提并论的哈,毕竟我是在选择一个轻量级的解决方案。

二:ssdb说明

ssdb是一个使用leveldb做为底层存储的nosql数据库,好处就是可以利用redis中的所有数据结构,而且数据还是基于硬盘的,所以可以存储的数据比

redis大的不要太多,官方文档的说法就是用来替代redis的,而且让你眼前一亮的就是,它对.net还是比较友好的,一个很不错的解决方案,不过成熟度不

如redis,大家前期可以当缓存用用,或者存储一些非关键性数据,节省节省内存空间。目前我在项目中用起来了。

1. 使用hash来存customerID 和customerNick的映射关系。

2. 使用List来承载X宝的订单推送。

三:快速搭建

官方下载:http://ssdb.io, 有一点要注意的就是官方文档明确表示,CentOS7的文件句柄设置问题,建议不要在centos7上进行搭建,具体的说明

可以看看这个:http://ssdb.io/docs/zh_cn/config.html ,大家可以用用centos6.5或者ubantu吧。

1. wget下载和unzip解压。

[root@localhost apps]# wget https://codeload.github.com/ideawu/ssdb/zip/master

---- ::-- https://codeload.github.com/ideawu/ssdb/zip/master

Resolving codeload.github.com (codeload.github.com)... 192.30.255.120, 192.30.255.121

Connecting to codeload.github.com (codeload.github.com)|192.30.255.120|:... connected.

HTTP request sent, awaiting response...  OK

Length:  (1.5M) [application/zip]

Saving to: ‘master’

%[==================================================================>] ,, .3KB/s in 36s

-- :: (43.7 KB/s) - ‘master’ saved [/]

[root@localhost apps]#unzip master

[root@localhost apps]# ls

master ssdb-master

2. 使用make对C++代码进行编译

[root@localhost ssdb-master]# make

3. 编译完之后,一泡尿的功夫,这个ssdb-server可执行文件就出来了。

[root@localhost ssdb-master]# ls
api ChangeLog Dockerfile Makefile ssdb.conf tools version
build_config.mk data docs README.md ssdb-server var
build.sh deps LICENSE src ssdb_slave.conf var_slave

4.然后我们把ssdb.conf配置一下

这里面有三个配置要注意下:

<1> work_dir: 存放data和meta的目录,可以在ssdb-master文件夹下mkdir data文件夹。

<2> ip:设为0.0.0.0,让所有的主机都能够连接上来。

<3> port  8888 :这个是默认的ssdbserver端口号,大家可以看情况修改。

完整配置如下:

# ssdb-server config
# MUST indent by TAB! # absolute path, or relative to path of this file, directory must exists
work_dir = /usr/apps/ssdb-master/data
pidfile = ./var/ssdb.pid server:
ip: 0.0.0.0
port:
# bind to public ip
#ip: 0.0.0.0
# format: allow|deny: all|ip_prefix
# multiple allows or denys is supported
#deny: all
#allow: 127.0.0.1
#allow: 192.168
# auth password must be at least characters
#auth: very-strong-password
#readonly: yes
# in ms, to log slowlog with WARN level
#slowlog_timeout: replication:
binlog: yes
# Limit sync speed to *MB/s, -: no limit
sync_speed: -
slaveof:
# to identify a master even if it moved(ip, port changed)
# if set to empty or not defined, ip:port will be used.
#id: svc_2
# sync|mirror, default is sync
#type: sync
#host: localhost
#port: logger:
level: debug
output: log.txt
rotate:
size: leveldb:
# in MB
cache_size:
# in MB
write_buffer_size:
# in MB/s
compaction_speed:
# yes|no
compression: yes

5. 启动ssdb-server,指定一下配置文件,采取静默启动

[root@localhost ssdb-master]# ./ssdb-server ./ssdb.conf -d
ssdb-server 1.9.
Copyright (c) - ssdb.io [root@localhost ssdb-master]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 192.168.122.1: 0.0.0.0:* LISTEN /dnsmasq
tcp 0.0.0.0: 0.0.0.0:* LISTEN /sshd
tcp 127.0.0.1: 0.0.0.0:* LISTEN /cupsd
tcp 0.0.0.0:8888 0.0.0.0:* LISTEN /./ssdb-server
tcp 127.0.0.1: 0.0.0.0:* LISTEN /master
tcp6 ::: :::* LISTEN /sshd
tcp6 ::: :::* LISTEN /cupsd
tcp6 ::: :::* LISTEN /master
[root@localhost ssdb-master]#

可以看到,上面的8888端口已经成功开启,没毛病。

四:使用C#客户端

http://ssdb.io/docs/zh_cn/clients.html上面列出了各个语言的客户端SDK,这里我就选择C#的SDK:https://github.com/ssdb/dotnetssdb

可以看到,里面没啥东西,就三个破文件,里面并没有实现ssdb应该有的所有功能,所以大家可以根据自己的需要进行封装,连接池啥的都要

你自己根据需要实现吧,好了,接下来我用hash简单的测试一下:

    class Program
{
static void Main(string[] args)
{
Client client = new Client("192.168.23.153", ); client.hset("customerHash", "customerID", ""); string val = string.Empty; client.hget("customerHash", "customerID", out val); Debug.WriteLine("customerID= " + val); client.close();
}
}

好了,本篇先就说到这里,希望对你有帮助。

最新文章

  1. Go build constraints
  2. ES6转换器之Babel
  3. HTML/Elements/base
  4. LintCode Find Minimum In Rotated Sorted Array
  5. linux下使用tar命令(转)
  6. string中find函数的使用
  7. Spring框架中的单例Beans是线程安全的么?
  8. 为centos6.5系统添加epel源
  9. C#控件系列--文本类控件
  10. nginx+redis实现session的共享
  11. 在线预览-Java 使用 Print2Flash 实现Office文档在线阅读
  12. border边框属性
  13. 【kindle笔记】读书记录-总
  14. JAVA项目中常用的异常处理情况
  15. 转载:VC++6.0注释快捷键设置,略有修改
  16. kafka系列六、java管理kafka Topic
  17. vi学习
  18. Web挂马方式整理
  19. C语言面试题3
  20. BEAUTIFUL

热门文章

  1. 【Spring】构建Spring Web应用
  2. 小技巧:Oracle:sqlplus 显示行列字符数
  3. LeetCode Questions List (LeetCode 问题列表)- Java Solutions
  4. leaflet+esri-leaflet+heatmap实现热力图
  5. CentOS7安装GitLab、汉化及使用
  6. 本地存储之localStorage
  7. HDU1150 Machine Schedule(二分图最大匹配、最小点覆盖)
  8. Codeforces Round #380 (Div. 2)D. Sea Battle
  9. AngularJS学习篇(一)
  10. Problem F: 多少个最大值?