SSDB基础说明及使用

当时需要使用SSDB的原因有几个,首先是对于contest模块设计的时候,由于点击查询当前比赛的Rank的时候,需要多次查询,而每次查询的数据量比较大,为了能够高效的获取数据而使用SSDB数据库;第二方面是对于用户AC状态的记录,在用户登录进之后,网页需要显示用户AC了哪些题目,哪些题目尝试了但没有通过。为了必须遍历当前系统存储的所有的submit,这样的话数据量也是很大,依照前面的原则,继续采用SSDB解决。

1:那SSDB到底是什么呢?

百度了一下,没有找到百度百科,找到的一个定义是SSDB是一个开源的高性能数据库服务器, 使用Google LevelDB作为存储引擎, 支持T级别的数据。从字面意思来讲,就是这个数据库有很高的性能((/ □ \))。然后的话,我们需要用到的就是查询速度高的特点。

2:SSDB 的主要特点(条目性的统计((/ □ \)),我们主要用到的模式就是k-v模式,即键值-值):

支持 zset, map/hash, list, kv 数据结构, 可替代 Redis

特别适合存储大量集合数据, 支持丰富的数据结构: key-value, key-map, key-zset, key-list.

使用 Google LevelDB 作为存储引擎

支持主从同步, 多主同步

客户端支持 PHP, C++, Python, Lua, Java, Ruby, nodejs, Go 等

内存占用极少

3:安装及启动停止

SSDB 的建议安装?方式是源码编译安装, 建议运?行环境是主流 Linux 发?行版. 远程 SSH 登录你的服务器, 然后?用下?面的命令下载, 编译, 安装和运?行:

# 安装

$ sudo wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip

$ sudo unzip master

$ cd ssdb-master

$ sudo make

$ #optional, install ssdb in /usr/local/ssdb

$ sudo make install

# 启动

$ sudo ./ssdb-server ssdb.conf

# 启动作为守护进程

$ sudo ./ssdb-server -d ssdb.conf

# 停止

$ sudo kill `cat ./var/ssdb.pid`

SSDB 默认安装在 /usr/local/ssdb ?目录下. ssdb-server 是服务器的程序, ssdb-cli 是命令?行客户端.

4:配置

SSDB  附带的 ssdb.conf是配置文件,一般不用修改便可以使用.。标准配置文件如下:

# ssdb-server config

# MUST indent by TAB!

# relative to path of this file, directory must exists

work_dir = ./var

pidfile = ./var/ssdb.pid

server:

ip: 127.0.0.1

port: 8888

# 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

replication:

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

#ip: 127.0.0.1

#port: 8889

logger:

level: info

output: log.txt

rotate:

size: 1000000000

leveldb:

# in MB

cache_size: 500

# in KB

block_size: 32

# in MB

write_buffer_size: 64

# in MB

compaction_speed: 1000

# yes|no

compression: no

work_dir: ssdb-server 的工作目录, 启动后, 会在这个目录下生成 data 和 meta 两个目录, 用来保存 LevelDB 的数据库文件. 这个目录是相对于 ssdb.conf 的相对路径, 也可以指定绝对路径.

server: ip 和 port 指定了服务器要监听的 IP 和端口号. 如果 ip 是 0.0.0.0, 则表示绑定所有的 IP. 基于安全考虑, 可以将 ip 设置为 127.0.0.1, 这样, 只有本机可以访问了. 如果要做更严格的更多的网络安全限制, 就需要依赖操作系统的 iptables.

replication: 用于指定主从同步复制. slaveof.ip, slaveof.port 表示, 本台 SSDB 服务器将从这个目标机上同步数据(也即这个配置文件对应的服务器是 slave). 你可以参考 ssdb_slave.conf 的配制.

logger: 配置日志记录. level 是日志的级别, 可以是 trace|debug|info|error. output 是日志文件的名字, SSDB 支持日志轮转, 在日志文件达到一定大小后, 将 log.txt 改名, 然后创建一个新的 log.txt.

leveldb: 配置 LevelDB 的参数. 你一般想要修改的是 cache_size 参数, 用于指定缓存大小. 适当的缓存可以提高读性能, 但是过大的缓存会影响写性能.

在使?用?自带的 ssdb.conf 配置?文件时, SSDB ?生成的?日志?文件按体积进?行分割, 仅此?而已. 所以, 你需要编写?自?己的 crontab 进?行?日志压缩和定期清理.

如果出现服务器掉电, kernel panic 等系统故障, 在系统重新启动之后, 你需要?手动删除 ssdb的 PID ?文件 ssdb.pid, 然后才能启动。

5使用流程:

安装完成之后,在ssdb目录下执行 sudo ./ssdb-server -d ssdb.conf启动SSDB即可,这时,数据库已经在运行。

当需要存储数据时:

首先:整理需要存储的信息,比如(contestID , rank_list_proto_str)其中前者为键,后者为值。

再者:决定操作,目前我们主要涉及的操作就是对于数据的存储和查询,即insert和get操作:

在插入数据时,使用的模式是ssdb.set(key,value),如果key是一个组合的话,那么中间用‘\t‘相连,例如ssdb.set(userID + ‘\t‘ + problemID, value)。

查询的时候,主要模式是一样的,即使用ssdb.get(key)就可以得到对应的value了。如果没有对应的值,则返回空字符串。

插入:

 ssdb_api.SetContestRankListProto(contestID, contest_rank_list.SerializeToString())
ssdb_api.InsertUserProblemStatus(user.userID, submit.problemID, submit.status)

查询:

contest_rank_list = ssdb_api.GetContestRankListProto(contest_id)
status_ = ssdb_api.GetUserProblem(user.userID, problem.problemID)

上述的操作都是已经写好了操作函数,即view/ssdb_api.py中的函数

from ssdb import SSDB
import sys
import cugbacm.proto.rank_pb2

ssdb_ip = "127.0.0.1"
ssdb_port = 6666
ssdb = SSDB(host=ssdb_ip, port=ssdb_port)

 def GetContestRankListProto(contestID):
   global ssdb
   proto_str = ssdb.get(contestID)
   return proto_str

 def SetContestRankListProto(contestID, rank_list_proto_str):
   global ssdb
   try:
     ssdb.set(contestID, rank_list_proto_str)
   except:
     pass
 def InsertUserProblemStatus(userID, problemID, status):
   #AC == 1  No_pass = 2 other = 0
   global ssdb
   value = 2
   if status == "Accepted":
     value = 1
   st = str(ssdb.get(userID + '\t' + str(problemID)))
   if st == "1":
     return;
   else:
     ssdb.set(userID + '\t' + str(problemID), value)
<pre name="code" class="html">def GetUserProblem(userID, problemID):
   global ssdb
   st = ssdb.get(userID + '\t' + str(problemID))
   if str(st) != "1" and str(st) != "2":
     return "0"
   else:
     return str(st)

其中,设置这个.py之后,需要在使用SSDB的文件里面引入这个文件,主机localhost。

其余的后续补充吧(/ □ \)

时间: 2025-01-12 14:33:55

SSDB基础说明及使用的相关文章

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

b2c项目基础架构分析(一)

我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括wap站点.手机app站点. 一.现有公司技术人员现状: 1.熟悉asp.net页面级开发.页面级处理的后端人员. 基本特点:掌握小型单站.单页的相关开发技术. 技术熟练度为:asp.net原理基础.asp.net webform控件中等.jquery基础.js初步到基础.sql基础到中等. 面对大型站点可能存在的弊端: a.不熟悉大型环境的架构: b.对站点.页面在大

分布式云平台基础服务

Net 分布式云平台基础服务建设说明概要 1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根据业务的发展,调整和完善,也会不断的改进,演变及完善:当然根据目前公司的现状和对基础服务的迫切程度,基础服务各模块的定位和发展预期将如下所述. 1)     数据库中间件 公司现状: 1)     对多种类型数据库的支持需求迫切,如同时支持mysql,orc

Twemproxy代理Key-Value数据库SSDB实现数据分布式存储

SSDB是一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis或者与 Redis 配合存储十亿级别列表的数据,现在已被许多知名企业所应用.我们使用SSDB是想将现有的redis中的key迁移到SSDB以破除现有的redis 120G存储极限(当然可以扩展,但是计算了下成本就打算放弃了). Twemproxy是twtter开源的一个redis和memcache代理服务器,这里我们使用Twemproxy代理来代理SSDB集群来实现数据的分布式存储,即shared. 1.节点规划

.Net 分布式云平台基础服务

.Net 分布式云平台基础服务 1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根据业务的发展,调整和完善,也会不断的改进,演变及完善:当然根据目前公司的现状和对基础服务的迫切程度,基础服务各模块的定位和发展预期将如下所述. 1)     数据库中间件 公司现状: 1)     对多种类型数据库的支持需求迫切,如同时支持mysql,orcale,s

.Net 分布式云平台基础服务建设说明概要

1)  背景 建设云平台的基础框架,用于支持各类云服务的业务的构建及发展. 2)  基础服务 根据目前对业务的理解和发展方向,总结抽象出以下几个基础服务,如图所示 3)  概要说明 基础服务的发展会根据业务的发展,调整和完善,也会不断的改进,演变及完善:当然根据目前公司的现状和对基础服务的迫切程度,基础服务各模块的定位和发展预期将如下所述. 1)     数据库中间件 公司现状: 1)     对多种类型数据库的支持需求迫切,如同时支持mysql,orcale,sqlserver这些数据库.最多

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

MySQL数据库基础知识

day02 MySQL数据库基础知识 一.基础知识概述: 基础决定你这门课程的学习成败!只有学习好这些基础知识以后,你才能真正的运用自如.才能够对数据库有更深入的了解,道路才会越走越远. 二.基础知识: 1.数据库(database):数据库就好比是一个物理的文档柜,一个容器,把我们整理好的数据表等等归纳起来. 创建数据库命令:        create database 数据库名; 2.查看数据库         show databases; 3.打开指定的数据库         use 

【Linux系列】【基础版】第四章 Shell基础之正则表达式

4. Shell基础之正则表达式     4.1 正则就是一串有规律的字符串         4.1 grep              4.1.1 格式: grep [-cinrvABC] 'word' filename             4.1.2 -c //count,表示行数             4.1.3 -i //不区分大小写             4.1.4 -n  //显示行号             4.1.5 -r  //遍历所有子目录             4