ssdb支持 zset, map/hash, list, kv 数据结构,同redis差不多。下面是关于ssdb hsahmap的使用笔记

1.ssdb hashmap的命令

1.hset name key value

设置hashmap中指定key的值

2.hget name key

获取hashmap中指定key的值

3.hdel name key

删除hashmap中指定的key

4.hincr name key [num]

使hashmap中key对应的值增加num

5.hexists name key

判断指定的key是否存在于hashmap中

6.hsize name

返回hashmap中元素的个数

7.hlist name_start name_end limit

列出名字处于区间 (name_start, name_end] 的 hashmap.

8.hrlist name_start name_end limit

逆序

9.hkeys name key_start key_end

列出 hashmap 中处于区间 (key_start, key_end] 的 key 列表.

10.hgetall name

返回整个 hashmap.

11.hscan name key_start key_end limit

列出 hashmap 中处于区间 (key_start, key_end] 的 key-value 列表.

12.hrscan name key_start key_end limit

像 hscan, 逆序.

13.hclear name

删除 hashmap 中的所有 key.

14.multi_hset name key1 value1 key2 value2 ...
批量设置 hashmap 中的 key-value.

15.multi_hget name key1 key2 ...
批量获取 hashmap 中多个 key 对应的权重值.

16.multi_hdel name key1 key2 ...

指删除 hashmap 中的 key.

2.ssdb使用hashmap 存储获取的代码

  这里因为ssdb是完全兼容redis的,所以完全可以用redis的库的接口函数。因为这样的特性,使得使用redis的项目很容易的能迁移到ssdb,作者的原博客也有完整的redis迁移到ssdb的完整教程。

ssdb的连接

redisContext *conn = redisConnect(host,port);
host:连接ssdb的主机ip
port:连接端口 返回值 redisContext结构体 定义如下
/* Context for a connection to Redis */
2 typedef struct redisContext {
3 int err; /* Error flags, 0 when there is no error */
4 char errstr[128]; /* String representation of error when applicable */
5 int fd;
6 int flags;
7 char *obuf; /* Write buffer */
8 redisReader *reader; /* Protocol reader */
9
10 enum redisConnectionType connection_type;
11 struct timeval *timeout;
12
13 struct {
14 char *host;
15 char *source_addr;
16 int port;
17 } tcp;
18
19 struct {
20 char *path;
21 } unix_sock;
22
23 } redisContext; ssdb的命令执行
redisReply* reply = redisCommand(conn,cmd)
conn:redis的连接句柄
cmd:执行的命令
返回值:redisReply结构体 结构体如下:
1 /* This is the reply object returned by redisCommand() */
2 typedef struct redisReply {
3 int type; /* REDIS_REPLY_* */
4 long long integer; /* The integer when type is REDIS_REPLY_INTEGER */
5 size_t len; /* Length of string */
6 char *str; /* Used for both REDIS_REPLY_ERROR and REDIS_REPLY_STRING */
7 size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */
8 struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
9 } redisReply; 其中type元素的类型可用来判断放回结果的状态:
REDIS_REPLY_STRING 1   //返回字符串,查看str,len字段
REDIS_REPLY_ARRAY 2    //返回一个数组,查看elements的值(数组个数),通过element[index]的方式访问数组元素,每个数组元素是一个redisReply对象的指针
REDIS_REPLY_INTEGER 3  //返回整数,从integer字段获取值
REDIS_REPLY_NIL 4      //没有数据返回
REDIS_REPLY_STATUS 5   //表示状态,内容通过str字段查看,字符串长度是len字段
REDIS_REPLY_ERROR 6    //表示出错,查看出错信息,如上的str,len字段

redisReply的释放
freeReplyObject(reply); 
用来释放执行命令后所占用的内存 ssdb连接的释放
redisFree(conn);
完整代码如下:

 redisContext*  ssdb_init(const char* host,uint16_t port) {
redisContext *conn = redisConnect(host,port);
if(conn->err) {
printf("connection error:%s\n",conn->errstr);
redisFree(conn);
return NULL;
}
return conn;
} void ssdb_finit(redisContext *conn) {
if (conn)
redisFree(conn);
} redisReply* ssdb_command(redisContext *conn,char *cmd) {
redisReply* reply = NULL;
if(NULL != conn && cmd != NULL) {
reply = redisCommand(conn,cmd);
} else {
printf("redis err\n");
return NULL;
}
return reply;
} int main(){
char buf[] = {};
char name[] = {};
char key[] = {};
char value[] = {};
redisReply* reply = NULL;
redisContext *ssdb_conn = ssdb_init("127.0.0.1",);
if(ssdb_conn == NULL){
printf("ssdb conn err...\n");
return ;
}
memcpy(name,"mymap",);
memcpy(key,"name",);
memcpy(value,"wangwu",);
snprintf(buf,sizeof(buf),"hset %s %s %s",name,key,value);
reply = ssdb_command(ssdb_conn,buf);
if(reply != NULL){
if(reply->type == REDIS_REPLY_ERROR)
printf("commd err:%s\n",reply->str);
freeReplyObject(reply);
} //根据指定key获取value值
memset(buf,,sizeof(buf));
memcpy(buf,"hget mymap name",sizeof(buf));
reply = ssdb_command(ssdb_conn,buf);
if(reply == NULL)
return ;
if(reply->type == REDIS_REPLY_ERROR){
printf("commd err:%s\n",reply->str);
freeReplyObject(reply);
return -;
}
printf("the value this is:%s\n",reply->str);
freeReplyObject(reply); //获取mymap里所有的key-value值
memset(buf,,sizeof(buf));
memcpy(buf,"hgetall mymap",sizeof(buf));
reply = ssdb_command(ssdb_conn,buf);
if(reply == NULL)
return ;
int i = ;
     /*此处对于获取的hashmap来说这个返回的数组每个key-value是占有两个元素的第一个元素为key 后一个元素为前一个元素的值*/
for(i = ;i < reply->elements;i+=){
printf("key:%s values:%s\n",reply->element[i]->str,reply->element[i + ]->str);
} freeReplyObject(reply);
return ;
}

执行效果图如下:

基于C语言的ssdb笔记 ----hashmap的简单实例的更多相关文章

  1. 第一单元总结:基于基础语言、继承和接口的简单OOP

    前情提要 到目前为止,OO课程已经完成了前三次的作业,分别为: 第一次作业:简单多项式的构造和求导.[正则表达式][数据结构][排序] 第二次作业:含三角函数因子的复杂多项式的构造.求导和化简.[递归 ...

  2. R语言入门视频笔记--2--一些简单的命令

    一.对象 1.列举当前内存中的对象 ls() 2.删除不需要的对象 rm(某对象名称) 3.查看向量长度 length(某向量名称) 4.查看向量类型 mode(某向量名称) 二.函数 1.seq函数 ...

  3. Hibernate笔记——第一个简单实例

     1. 首先进行框架配置 导包 hibernate配置xml文件 ======================= 2. 创建并配置POJO类 Hibernate是操作持久化层的框架,和数据库打交道,其 ...

  4. 关于《selenium2自动测试实战--基于Python语言》

    关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...

  5. 《Selenium2自动化测试实战--基于Python语言》 --即将面市

    发展历程: <selenium_webdriver(python)第一版>   将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...

  6. Gogs - 基于 Go 语言的自助 Git 服务

    Gogs(Go Git Service) 是一个基于 Go 语言的自助 Git 服务.Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...

  7. 基于ruby的watir自动化测试 笔记二

    基于ruby的watir自动化测试 笔记一的补充版,新增加了些特殊的控件捕获方法.还在更新中.... attribute_value 获取当前控件的属性 Value = ie.link(:id=> ...

  8. Ggoogle Protocol Buffer的使用 (基于C++语言)

    首先说明的是Protocol Buffle是灵活高效的.它的一个很好的优点(很重要的,我认为)就是后向兼容性--当我们扩展了了.proto文件后,我们照样可以用它来读取之前生成的文件. 之前已经写了关 ...

  9. C语言细节总结笔记

    C语言细节总结笔记 */--> C语言细节总结笔记 Table of Contents 1. 三步异或法交换数字 2. 做差法交换数字 3. 按n位置位 4. 求余求商求积 5. 辗除法求最大公 ...

随机推荐

  1. 0420模块 序列化模块 hashlib模块

    复习:内置方法 __len__ len(obj)的结果依赖于obj.__len__()的结果,计算对象的长度__hash__ hash(obj)的结果依赖于obj.__hash__()的结果,计算对象 ...

  2. web框架之Django<一、初识>

    一.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...

  3. while 读取文件内容

    exec < filename while read line;do echo $line done 方法1 while read line;do echo $line done<$ 方法 ...

  4. Python习题-统计日志中访问次数超过限制的IP

    #1.1分钟之内ip访问次数超过200次的,就给他的ip加入黑名单#需求分析: #1.读日志,1分钟读一次 #2.获取这1分钟之内所有访问的ip #3.判断ip出现的次数,如果出现200次,那么就加入 ...

  5. 201621123014《JAVA程序设计》第1周学习总结

    1. 本章学习总结 关键字:JAVA特点.JDK.JVM.JRE.class.编译工具.JDK是JAVA的开发工具包,拥有JAVA需要的环境和各类JAVA工具,是JAVA的核心:JVM是JAVA虚拟机 ...

  6. alt+shift+j 自动添加类的文档注释 Myeclipse

    alt+shift+j  自动添加类的文档注释 Myeclipse ctrl+shift+y 将选中的内容大写换成小写 +x是转换成大写

  7. hdu-1025 Constructing Roads In JGShining's Kingdom(二分查找)

    题目链接: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)     Memory Li ...

  8. PostgreSQL聚合函数的filter子句

    一张表存储了学生id,科目,分数三个字段,求每个学生60分以下与参加的总科目占比.(今天电脑不好用,图片总是这样) 其实一个count(*) filter  就可以查出来,但是没用过PG的一个人竟然说 ...

  9. BeanUtils介绍及使用

    JavaBeans事实上有三层含义.首先,JavaBeans是一种规范,一种在Java(包括JSP)中可重复使用的Java组件的技术规范,也可以说成我们常说的接口.其次,JavaBeans是一个Jav ...

  10. Gym 101142G : Gangsters in Central City(DFS序+LCA+set)

    题意:现在有一棵树,1号节点是水源,叶子节点是村庄,现在有些怪兽会占领一些村庄(即只占领叶子节点),现在要割去一些边,使得怪兽到不了水源.给出怪兽占领和离开的情况,现在要割每次回答最小的割,使得怪兽不 ...