博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于C语言的ssdb笔记 ----hashmap的简单实例
阅读量:5754 次
发布时间:2019-06-18

本文共 5144 字,大约阅读时间需要 17 分钟。

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);
完整代码如下:
 
1 redisContext*  ssdb_init(const char* host,uint16_t port) { 2      redisContext *conn = redisConnect(host,port); 3      if(conn->err) { 4         printf("connection error:%s\n",conn->errstr); 5         redisFree(conn); 6         return NULL;   7     } 8     return conn;     9 }10 11 void ssdb_finit(redisContext *conn) { 12      if (conn)13          redisFree(conn);14 }15 16 redisReply* ssdb_command(redisContext *conn,char *cmd) {17      redisReply* reply = NULL;18      if(NULL != conn && cmd != NULL) {19          reply = redisCommand(conn,cmd);20      } else {21          printf("redis err\n");22          return NULL;23      }24      return reply;25 }26 27 int main(){28      char buf[1024] = {
0};29 char name[1024] = {
0};30 char key[1024] = {
0};31 char value[1024] = {
0};32 redisReply* reply = NULL;33 redisContext *ssdb_conn = ssdb_init("127.0.0.1",8888);34 if(ssdb_conn == NULL){35 printf("ssdb conn err...\n");36 return 0;37 }38 memcpy(name,"mymap",5);39 memcpy(key,"name",4);40 memcpy(value,"wangwu",6);41 snprintf(buf,sizeof(buf),"hset %s %s %s",name,key,value);42 reply = ssdb_command(ssdb_conn,buf);43 if(reply != NULL){44 if(reply->type == REDIS_REPLY_ERROR)45 printf("commd err:%s\n",reply->str);46 freeReplyObject(reply);47 }48 49 //根据指定key获取value值50 memset(buf,0,sizeof(buf));51 memcpy(buf,"hget mymap name",sizeof(buf)); 52 reply = ssdb_command(ssdb_conn,buf);53 if(reply == NULL)54 return 0;55 if(reply->type == REDIS_REPLY_ERROR){56 printf("commd err:%s\n",reply->str);57 freeReplyObject(reply);58 return -1;59 }60 printf("the value this is:%s\n",reply->str);61 freeReplyObject(reply);62 63 //获取mymap里所有的key-value值64 memset(buf,0,sizeof(buf));65 memcpy(buf,"hgetall mymap",sizeof(buf));66 reply = ssdb_command(ssdb_conn,buf);67 if(reply == NULL)68 return 0;69 int i = 0;      /*此处对于获取的hashmap来说这个返回的数组每个key-value是占有两个元素的第一个元素为key 后一个元素为前一个元素的值*/70 for(i = 0;i < reply->elements;i+=2){71 printf("key:%s values:%s\n",reply->element[i]->str,reply->element[i + 1]->str);72 }73 74 freeReplyObject(reply);75 return 0;76 }

执行效果图如下:

 

 

转载于:https://www.cnblogs.com/piaoyang/p/9267551.html

你可能感兴趣的文章
MFC多线程的创建,包括工作线程和用户界面线程
查看>>
我的友情链接
查看>>
FreeNAS8 ISCSI target & initiator for linux/windows
查看>>
PostgreSQL数据库集群初始化
查看>>
++重载
查看>>
Rainbond 5.0.4版本发布-做最好用的云应用操作系统
查看>>
nodejs 完成mqtt服务端
查看>>
sql server 触发器
查看>>
[工具]前端自动化工具grunt+bower+yoman
查看>>
关于完成生鲜电商项目后的一点总结
查看>>
noip2012 普及组
查看>>
第二阶段 铁大Facebook——十天冲刺(10)
查看>>
Java判断是否为垃圾_Java GC如何判断对象是否为垃圾
查看>>
多项式前k项和java_多项式朴素贝叶斯softmax改变
查看>>
java数组只能交换0下标和n_编程练习-只用0交换排序数组
查看>>
centos7安装mysql视频教程_centos7安装mysql(完整)
查看>>
php图片赋值,php如何优雅地赋值
查看>>
【探索HTML5第二弹01】HTML5的前世今生以及来世
查看>>
Failed to connect to remote VM. Connection refused. Connection refused: connect
查看>>
freeze
查看>>