php版redis插件,SSDB数据库,增强型的Redis管理api实例

php版redis插件,SSDB数据库,增强型的Redis管理api实例

SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储。
另外,rocksdb是FB在LevelDB的二次开发版本,因此也存在使用RocksDB作为存储引擎的SSDB版本,可以参考这里。

SSDB PHP API Documentation 官方api文档
http://ssdb.io/docs/php/index.html

SSDB入门基础-中文版pdf教程
http://ssdb.io/ssdb-get-started.pdf

php的redis原生插件有不少bug,建议使用ssdb的
-----------------------------
实战例子:
require_once "SSDB.php";

function getArticleByCode($code=''){
$query = array ();
try {
$ssdb = new SimpleSSDB(REDIS_HOST,REDIS_PORT);
$key = 'article'.$code;
// $ssdb->del($key);
$articles = $ssdb->get($key);
if(empty($articles)){
$sql = "SELECT * FROM article where status=1 and code=".$this->db->escape ( $code );
$query = $this->db2->query($sql)->result();
if(count($query)>0){
$query = $query[0];
}
$ssdb->set($key, json_encode($query));
//设置过期时间,以秒为单位
$ssdb->expire($key, 360000);
}else{
$query = json_decode($articles);
}
$ssdb->close();
} catch ( Exception $e ) {}
return $query;
}
-----------------------------
SSDB支持flushdb命令清除数据库
SSDB 提供了 flushdb 命令, 用于清除整个数据库的数据. 这是在命令行客户端实现的, 所以只在 ssdb-cli 里才能用. 因为这是一个非常危险的命令, 所以输入后, 还要用户再输入"yes"确认.
flushdb 还支持单独清理 kv, hash, zset 三种数据, 分别对应的用法是 flushdb kv, flushdb hash, flushdb zset.

==========================================
编译和安装
wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip
unzip master
cd ssdb-master
make
# 将安装在 /usr/local/ssdb 目录下
sudo make install

启动服务

# 启动主库
./ssdb-server ssdb.conf
# 或者启动为后台进程
./ssdb-server -d ssdb.conf
# 启动 ssdb 命令行客户端
./tools/ssdb-cli -p 8888
# 停止 ssdb-server
./ssdb-server ssdb.conf -s stop
# 对于旧版本
kill `cat ./var/ssdb.pid`

配置文件
ssdb.conf:

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
# auth password must be at least 32 characters
#auth: very-strong-password
replication:
binlog: yes
# Limit sync speed to *MB/s, -1: no limit
sync_speed: -1
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: debug
   # 支持的日志级别有: debug, warn, error, fatal.
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: yes

一个 ssdb-server 实例占用的内存瞬时(有可能, 而且即使达到, 也只是持续短时间)最高达到(MB):
cache_size + write_buffer_size * 66 + 32
这是对于压缩选项没有开启的情况, 如果 compression: yes, 计算公式是:
cache_size + 10 * write_buffer_size * 66 + 32
你可以调整配置参数, 限制 ssdb-server 的内存占用.



SSDB命令
与Redis类似,SSDB也支持多种数据结构(KV list, hash, soreted set),下面列出了常用命令:

dbsize           # 返回数据库占用空间,以字节为单位
flushdb           # 清空数据库
info            # 返回服务器信息
auth password      # 验证访问密码

KV结构
set key value
setx key value ttl     # 设置key的同时设置ttl
setnx key value      # 若key已存在,则不设置
multi_set key1 value1 key2 value2 ...
exists key
get key
getset key value           # 更新key,并返回旧value
multi_get key1 key2 ...
keys key_start key_end limit     # 返回指定范围内的key,左开右闭区间(SSDB的key有序存储)
rkeys key_start key_end limit
scan key_start key_end limit
rscan key_start key_end limit
expire key ttl
ttl key
del key
multi_del key1 key2 ...
substr key start size         # 返回子串
strlen key
incr key [num]
getbit key offset
setbit key offset val
bitcount key [start] [end]
countbit key start size
hashmap结构
hset name key value
multi_hset name key1 value1 key2 value2 ...
hget name key
multi_hget name key1 key2 ...
hgetall name
hkeys name key_start key_end
hscan key_start key_end limit
hrscan key_start key_end limit
hdel name key            # 删除一个字段
hclear name             # 删除所有字符
multi_hdel name key1 key2 ...
hexists name key
hsize name
hincr name key [num]
hlist name_start name_end limit      # 列出指定范围的所有hash表
hrlist name_start name_end limit



list结构
qpush_front name item1 item2 ...     # 往队头插入新元素
qpush_back name item1 item2 ...      # 往队尾插入新元素
qpop_front name size             # 从队头弹出若干个元素
qpop_back name size            # 从队尾弹出若干个元素
qtrim_front name size            # 从队头移除多个元素
qtrim_back name size           # 从队尾移除多个元素
qfront name                # 返回队头
qback name                # 返回队尾
qsize name                # 返回队长
qget name index              # 返回指定位置元素
qset name index val
qrange name offset limit          # 返回一个切片
qslice name begine end          # 返回一个切片
qclear name
qlist name_start name_end limit
qrlist name_start name_end limit



sorted set结构
zset name key socre
zget name key
zdel name key
zexists name key
zsize name
zincr name key num



导出/导入
SSDB才有LSM模型,也就是说它的key是有序存储的,因此,我们可以导出所有key的数据,也可以导出指定范围内key的数据。

1、使用ssdb-cli 命令行客户端
导出整个数据库:
# backup current database into file backup.ssdb
ssdb 127.0.0.1:8888> export backup.ssdb

按照 Key 区间导出数据库(交互模式)

ssdb 127.0.0.1:8888> export -i backup.ssdb
input KV range[start, end]:
start(inclusive, default none): a
end(inclusive, default none): z
input HASH range:
start(inclusive, default none):
end(inclusive, default none):
input ZSET range:
start(inclusive, default none):
end(inclusive, default none):
input QUEUE range:
start(inclusive, default none):
end(inclusive, default none):
命令 export -i backup.ssdb 将导出区间 [a, z] 内的 KV, 所有的 HASH, ZSET, QUEUE.

导入命令:
# import backup.ssdb into current database
ssdb 127.0.0.1:8888> import backup.ssdb
import 命令会把数据库中的相同 key 给替换。


2、SSDB 另一个专门用于导出工具是 ssdb-dump,用法如下:
./tools/ssdb-dump ip port output_folder
目录 output_folder 必须不存在, 因为 ssdb-dump 会创建这个目录. 导出之后, 这个目录里将有两个子目录, data 目录里包含着数据, 还有一个空的 meta 目录.
如果想从导出的目录恢复数据,可以将 output_folder 目录拷贝到你的服务器上面,然后修改你的 ssdb.conf 配置文件, 将 work_dir 指向 output_folder 目录, 然后重启 ssdb-server。



限制
最大 Key 长度 200 字节
最大 Value 长度 31MB
最大请求或响应长度 31MB
单个 HASH 中的元素数量 9,223,372,036,854,775,807
单个 ZSET 中的元素数量 9,223,372,036,854,775,807
单个 QUEUE 中的元素数量 9,223,372,036,854,775,807
命令最多参数个数 所有参数加起来体积不超过 31MB 大小



Replication
Redis的主从复制在主库挂了的时候就无法再写入数据了,而SSDB不但支持主-从结构,还支持多主结构。

主-从配置
#server1:
replication:
slaveof:

#server2:

replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: sync
ip: 127.0.0.1
port: 8888

主-主配置
#server1:

replication:
slaveof:
id: svc_2
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8889

#server2:

replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8888


多主配置
在一组一共包含 n 个实例的 SSDB 实例群中, 每一个实例必须 slaveof 其余的 n-1 个实例.

replication:
slaveof:
id: svc_1
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8888
slaveof:
id: svc_2
# sync|mirror, default is sync
type: mirror
ip: 127.0.0.1
port: 8889
# ... more slaveof

监控
info命令可以返回SSDB服务状态:

ssdb 127.0.0.1:8899> info
binlogs
capacity : 10000000
min_seq : 1
max_seq : 74
replication
client 127.0.0.1:55479
type : sync
status : SYNC
last_seq : 73
replication
slaveof 127.0.0.1:8888
id : svc_2
type : sync
status : SYNC
last_seq : 73
copy_count : 0
sync_count : 44

binlogs,当前实例的写操作状态:
capacity: binlog 队列的最大长度
min_seq: 当前队列中的最小 binlog 序号
max_seq: 当前队列中的最大 binlog 序号

replication,可以有多条 replication 记录. 每一条表示一个连接进来的 slave(client), 或者一个当前服务器所连接的 master(slaveof).
slaveof|client ip:port, 远端 master/slave 的 ip:port
type: 类型, sync|mirror
status: 当前同步状态, DISCONNECTED|INIT|OUT_OF_SYNC|COPY|SYNC,见下面的解释
last_seq: 上一条发送或者收到的 binlog 的序号
slaveof.id: master 的 id(这是从 slave's 角度来看的, 你永远不需要在 master 上配置它自己的 id)
slaveof.copy_count: 在全量同步时, 已经复制的 key 的数量
slaveof.sync_count: 发送或者收到的 binlog 的数量.
关于 status:
DISCONNECTED: 与 master 断开了连接, 一般是网络中断
INIT: 初始化状态
OUT_OF_SYNC: 由于短时间内在 master 有大量写操作, 导致 binlog 队列淘汰, slave 丢失同步点, 只好重新复制全部的数据
COPY: 正在复制基准数据的过程中, 新的写操作可能无法及时地同步
SYNC: 同步状态是健康的

判断同步状态
binlogs.max_seq 是指当前实例上的最新一次的写(写/更新/删除)操作的序号;
replication.client.last_seq 是指已发送给 slave 的最新一条 binlog 的序号;
所以, 如果你想判断主从同步是否已经同步到位(实时更新), 那么就判断 binlogs.max_seq 和 replication.client.last_seq 是否相等。

SSDB协议
SSDB协议与Redis的文本协议也类似:

SSDB数据包的结构:
Packet := Block+ '\n'
Block := Size '\n' Data '\n'
Size := literal_integer
Data := size_bytes_of_data

请求:
Request := Cmd Blocks*
Cmd := Block
请求命令包括: get, set, del, ...

响应:
Response := Status Block*
Status := Block
响应状态码包括: ok, not_found, error, fail, client_error

示例:
用 telnet 或者 nc 命令连接到 SSDB 服务器, 然后输入下面的代码(用最后一行空行结束):
3
get
3
key
你将看到类似这样的响应:
2
ok
3
val


SSDB 协议解析器的C实现:

#include <stdlib.h>
#include <string.h>
int len = buffer->size();
char *ptr = buffer->data();
while(len > 0){
char *data = (char *)memchr(ptr, '\n', len);
if(data == NULL){
break;
}
data += 1;
int num = data - ptr;
if(num == 1 || (num == 2 && ptr[0] == '\r')){
// Packet received.
return OK;
}
// Size received
int size = (int)strtol(ptr, NULL, 10);
len -= num + size;
ptr += num + size;
if(len >= 1 && ptr[0] = '\n'){
len -= 1;
ptr += 1;
}else if(len >= 2 && ptr[0] == '\r' && ptr[1] == '\n'){
len -= 2;
ptr += 2;
}else{
break;
}
// Data received
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加速度计和陀螺仪数据融合

本帖翻译自 IMU&#xff08;加速度计和陀螺仪设备&#xff09;在嵌入式应用中使用的指南。这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法&#xff0c;以及如何融合这两者&#xff0c;侧重算法、思想的讨论介绍本指南旨在向兴趣者介绍惯性MEMS&#xff08;微机电系统&a…

循环嵌套练习题

//BOSS://让用户输入一个奇数&#xff0c;打印菱形&#xff0c;最长的行内容个数为用户输入的个数&#xff0c;并且由英文字母拼接而成//比如用户输入了7// A// ABA// ABCBA// ABCDCBA// ABCBA// ABA// A//1、接收并判断用户输入的是不是数字 try{#region 解法一…

python leetcode_leetcode 介绍和 python 数据结构与算法学习资料

for &#xff08;刚入门的编程&#xff09;的高中 or 大学生leetcode 介绍leetcode 可以说是 cs 最核心的一门“课程”了&#xff0c;虽然不是大学开设的&#xff0c;但基本上每一个现代的高水平的程序员都修过这门“课程”&#xff08;或者类似的课程&#xff0c;比如数据结构…

平衡小车卡尔曼滤波算法

最近研究STM32的自平衡小车&#xff0c;发现有两座必过的大山&#xff0c;一为卡尔曼滤波&#xff0c;二为PID算法。 网上看了很多关于卡尔曼滤波的代码&#xff0c;感觉写得真不咋地。一怒之下&#xff0c;自己重写&#xff0c;不废话&#xff0c;贴代码 [pre lang"C&quo…

IOS 为UILabel添加长按复制功能

IOS 为UILabel添加长按复制功能 在iOS中下面三个控件&#xff0c;自身就有复制-粘贴的功能&#xff1a; 1、UITextView 2、UITextField 3、UIWebView UIKit framework提供了几个类和协议方便我们在自己的应用程序中实现剪贴板的功能。 1、UIPasteboard&#xff1a;我们可以向其…

navicat 的查询功能

navicat的查询的位置在&#xff1a; 在编辑器界面写代码&#xff0c;代码完成后点左上角的运行。 代码&#xff1a; create&#xff08;创建&#xff09; table&#xff08;一个表&#xff09; <xxx>尖括号内的内容必填——我要创建并查询一个名叫做xxx的表 &#xff08…

c++ sleep函数_Linux 多线程应用中如何编写安全的信号处理函数

关于代码的可重入性&#xff0c;设计开发人员一般只考虑到线程安全&#xff0c;异步信号处理函数的安全却往往被忽略。本文首先介绍如何编写安全的异步信号处理函数&#xff1b;然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同步的方式处理。Linux 多线程…

css特殊情况

如果一个父级div和一个子级div&#xff0c;要给父级div加&#xff08;opacity&#xff09;透明度那子级div也会继承父级元素的透明度。那给父级元素加透明度就不用opacity加透明度&#xff0c;使用background:rgba(120,120,120,0.7);实现效果&#xff0c;r,g,b分别代表红&#…

CoreAnimation (CALayer 动画)

CoreAnimation基本介绍&#xff1a; CoreAnimation动画位于iOS框架的Media层CoreAnimation动画实现需要添加QuartzCore.FrameworkCoreAnimation基本上是LayerAnimationCoreAnimation分类&#xff1a; CoreAnimation作用&#xff1a; CoreAnimation CALayer基本介绍 CALayer的常…

汇编为什么分段执行总是执行不了_iOS汇编教程(六)CPU 指令重排与内存屏障...

系列文章iOS 汇编入门教程(一)ARM64 汇编基础iOS 汇编入门教程(二)在 Xcode 工程中嵌入汇编代码iOS 汇编入门教程(三)汇编中的 Section 与数据存取iOS 汇编教程(四)基于 LLDB 动态调试快速分析系统函数的实现iOS 汇编教程(五)Objc Block 的内存布局和汇编表示前言具有 ARM 体系…

GD32 使用stm32 固件库

1、 系统 1) 晶振起振区别 描述&#xff1a;启动时间&#xff0c;GD32 与STM32 启动时间都是2ms&#xff0c;实际上GD 的执行效率快&#xff0c;所以ST 的HSE_STARTUP_TIMEOUT ((uint16_t)0x0500)是2ms&#xff0c;但是这个宏定义值在GD 上时间就更加短了&#xff0c;所以要加大…

干将莫邪

干将莫邪也为凡铁铸成&#xff0c;只是善加锻造、融入心神&#xff0c;而成上古神兵。宝剑从来都是双刃&#xff0c;正邪之道&#xff0c;存乎一心。

js反混淆还原工具_SATURN反混淆框架

本文为看雪论坛精华文章看雪论坛作者ID&#xff1a;梦野间摘要&#xff1a;近几年&#xff0c;软件的混淆强度一直在不断提升。基于编译器的混淆已经成为业界事实上的标准&#xff0c;最近的一些论文也表明软件的保护方式使用的是编译器级别的混淆。在这篇文章中&#xff0c;我…

android 弹起键盘把ui顶上去的解决办法

键盘输入框上面的ui布局必须为Relative相对布局。然后设置 <activityandroid:name".activity.HomeActivity"Android:windowSoftInputMode"adjustPan|stateHidden"></activity>转载于:https://www.cnblogs.com/zhaoleigege/p/5925831.html

python 多线程并发_寻找python大神!!!python如何多线程并发?

不是大神。尝试回答一下。 首先解释下什么叫做线程&#xff0c;什么叫做进程&#xff0c;在解释这两个概念前&#xff0c;我们还需要明白什么叫做GIL全局解释器锁。GIL 全局解释器锁&#xff1a; GIL(全局解释器锁&#xff0c;GIL 只有cpython有)&#xff1a;在同一个时刻&…

Nginx/Apache发大招

导读网站程序的上传目录通常是不需要PHP执行解释权限&#xff0c;通过限制目录的PHP执行权限可以提网站的安全性&#xff0c;减少被攻击的机率。下面和大家一起分享下如何在Apache和Nginx禁止上传目录里PHP的执行权限。 Apache下禁止指定目录运行PHP脚本在虚拟主机配置文件中增…

第二轮冲刺-Runner站立会议08

今天完成的内容&#xff1a;简单的做了一下主界面的美化和日历界面的美化 遇到的问题&#xff1a;美化按钮还不能自己自定义按钮 如何解决&#xff1a;暂无思路 明天将要进行的内容&#xff1a;调试bug 转载于:https://www.cnblogs.com/Againzg/p/5544301.html

STM32串口通信中使用printf发送数据配置方法 开发环境 Keil

STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据&#xff0c;非常的方便。可在刚开始使用的时候总是遇到问题&#xff0c;常见的是硬件访真时无法进入main主函数&#xff0c;其实…

dmp文件查看表空间_innoDb文件

一&#xff0e;文件总体概述InnoDb文件主要有以下文件1. 参数文件&#xff1a;启动需要的各种参数作2. 日志文件&#xff1a;记录mysql实例某种条件做出的响应而写入的文件&#xff0c;如错误日志、二进制日志、慢查询日志、查询日志等3. Socket文件&#xff1a;连接需要的文件…

论文笔记之:Deep Attention Recurrent Q-Network

Deep Attention Recurrent Q-Network 5vision groups 摘要&#xff1a;本文将 DQN 引入了 Attention 机制&#xff0c;使得学习更具有方向性和指导性。&#xff08;前段时间做一个工作打算就这么干&#xff0c;谁想到&#xff0c;这么快就被这几个孩子给实现了&#xff0c;自愧…