Redis HASH 操作类型封装

本文介绍了一个针对Redis数据库中Hash表操作的C++封装类。该类提供了如HDEL、HEXISTS、HGET等常用Hash操作的方法实现,并通过示例展示了如何使用这些方法进行增删查改等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如下是我项目中用到的,Redis操作hash表时的类,自我封装了所有对hash的操作.经过测试通过

头文件

[cpp]  view plain  copy
 print ?
  1. #pragma once  
  2.   
  3. class redisOperator  
  4. {  
  5.   
  6. private:      
  7.     //一个操作redis数据库的句柄  
  8.     redisContext *c;  
  9. public:   
  10.     redisOperator(void);  
  11.   
  12.     //HDELL 删除key中的一个或者多个域,成功返回删除的个数(返回值可能和num不一致)  
  13.     int hashHdel(string& key,const int& num,const char** value);  
  14.       
  15.     //HEXISTS 查看哈希表中是否存在给定域,存在返回1 否则 0  
  16.     int hashHexists(const string& key,const string& field);  
  17.       
  18.     //HGET 返回哈希表 key 中给定域 field 的值。成功返回给定的域,否则NULL  
  19.     string hashHget(const string& key,const string& field);  
  20.       
  21.     //HGETALL key 返回哈希表 key 中,所有的域和值。  
  22.     //成功返回true 否则false  
  23.     string hashHgetall(const string& key);  
  24.       
  25.     //HINCRYBY为哈希表中的field域的值加上增量  
  26.     //返回值:field域的值(出错返回原值,写一条信息到log中)  
  27.     int hashHincrby(const string& key,const string& field,unsigned int incr);  
  28.   
  29.     //HINCRBYFLOAT 为哈希表中的field域加上浮点增量incr  
  30.     //返回值:field域的值(出错写一条信息到log中)  
  31.     string hashHincrbyfloat(const string& key,const string& field ,float incr);  
  32.   
  33.     //HKEYS 返回哈希表key中的所有域  
  34.     //不成功返回NULL  
  35.     string hashHkeys(const string& key);  
  36.   
  37.     //HLEN 返回哈希表中域的数量  
  38.     //成功返回非0值  
  39.     int hashHlen(const string& key);  
  40.   
  41.     //HMGET 返回哈希表key中一个或多个给定域的值  
  42.     //返回值:一个包含多个给定于的关联值的字符串,不存在的域返回NULL  
  43.     string hashHmset(const string& key,const int& num,const char**argc);  
  44.   
  45.     //HMSET 同时将多个field-value对设置到哈希表key中  
  46.     void hashHmset(string& key,int num,char** field,char**value);  
  47.   
  48.     //HSET 将哈希表key中的field的值设置为value  
  49.     //返回1 表示新建域,返回0 表示新值覆盖旧值  
  50.     bool hashHset(string& key,string& field ,const string& value);  
  51.   
  52.     //HSETNX 将哈希表key中的field的值设置为value  
  53.     //成功返回1 否则 0  
  54.     bool hashHsetnx(string& key,string& field ,const string& value);   
  55.       
  56.     //HVALS 返回哈希表key中所有域的值  
  57.     //key不存在返回空  
  58.     string hashHvals(const string& key);  
  59.   
  60.     //析构函数  
  61.     virtual ~redisOperator(void);  
  62. private:  
  63.     redisOperator(const redisOperator&);  
  64.     redisOperator& redisOpeartor=(const redisOperator&);  
  65. };  

实现文件

[cpp]  view plain  copy
 print ?
  1. #include "redisOperator.h"  
  2.   
  3. redisOperator::redisOperator(void)  
  4. {  
  5.     const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1";  
  6.     int port = (argc > 2) ? atoi(argv[2]) : 6379;  
  7.     struct timeval timeout = { 1, 500000 }; // 1.5 seconds  
  8.     c = redisConnectWithTimeout(hostname, port, timeout);  
  9.     cacheHandle handle(c,hostname);  
  10.     if (c == NULL || c->err)  
  11.     {  
  12.         if (c)  
  13.         {  
  14.             cout<<"Connection error: %s\n", c->errstr;  
  15.             redisFree(c);  
  16.         }  
  17.         else  
  18.         {  
  19.             cout<<"Connection error: can't allocate redis context\n";  
  20.         }  
  21.         exit(-1);  
  22.     }  
  23. }  
  24.   
  25. //HDELL 删除key中的一个或者多个域,成功返回删除的个数(返回值可能和num不一致)  
  26. int redisOperator::hashHdel(string& key,const int& num,const char** value)  
  27. {  
  28.     int tmp = 0;  
  29.     redisReply *reply;  
  30.     for(int i= 1 ;i < num;i++)  
  31.     {  
  32.         reply = (redisReply*)redisCommand(c,"HDEL %s %s",key.c_str(),value[i]);  
  33.         if(reply->type == REDIS_REPLY_INTEGER)  
  34.             tmp += teply -> integer;  
  35.     }  
  36.     freeReplyObject(reply);  
  37.     return tmp;   
  38. }  
  39.   
  40. //HEXISTS 查看哈希表中是否存在给定域,存在返回1 否则 0  
  41. int hashHexists(const string& key,const string& field)  
  42. {  
  43.     int tmp = 0;  
  44.     redisReply *reply;  
  45.     reply = (redisReply*)redisCommand(c,"HEXISTS %s %s",key.c_str(),field.c_str());  
  46.     if(reply->type == REDIS_REPLY_INTEGER)  
  47.         tmp = reply->integer;  
  48.     freeReplyObject(reply);  
  49.     return tmp;  
  50. }  
  51.   
  52. //HGET 返回哈希表 key 中给定域 field 的值。成功返回给定的域,否则NULL  
  53. string redisOperator::hashHget(const string& key,const string& field)  
  54. {  
  55.     string tmp("");  
  56.     redisReply *reply;  
  57.     reply = (redisReply*)redisCommand(c,"HGET %s %s",key.c_str(),field.c_str());  
  58.     if(reply->type == REDIS_REPLY_STRING)  
  59.         tmp = reply->str;  
  60.     freeReplyObject(reply);  
  61.     return tmp;  
  62. }  
  63.   
  64. //HGETALL key 返回哈希表 key 中,所有的域和值。  
  65. //成功返回true 否则false  
  66. string redisOperator::hashHgetall(const string& key)  
  67. {  
  68.     string tmp("");  
  69.     redisReply *reply;  
  70.     reply = (redisReply*)redisCommand(c,"HGETALL %s ",key.c_str());  
  71.     if(reply->type == REDIS_REPLY_ARRAY)  
  72.     {  
  73.         for(int j = 0 ; j< reply->elements;j++)  
  74.         {    
  75.             tmp += reply->element[j]->str;  
  76.             tmp += "\n";  
  77.             tmp += hashHget(key,reply->element[j]->str);  
  78.             tmp += "\n";  
  79.             j++;  
  80.         }  
  81.         freeReplyObject(reply);  
  82.         tmp=tmp.substr(0,tmp.length()-1);         
  83.     }  
  84.     else  
  85.   
  86.     return tmp;  
  87. }  
  88.   
  89. //HINCRYBY为哈希表中的field域的值加上增量  
  90. //返回值:field域的值(出错返回-1,写一条信息到log中)  
  91. int redisOperator::hashHincrby(const string& key,const string& field,unsigned int incr)  
  92. {  
  93.     int tmp = -1;  
  94.     redisReply *reply;  
  95.     reply = (redisReply*)redisCommand(c,"HINCRBY %s %s %d",key.c_str(),field.c_str(),incr);  
  96.     if(reply->type == REDIS_REPLY_INTEGER)  
  97.     {  
  98.         tmp=reply->integer;  
  99.     }  
  100.     else  
  101.   
  102.     freeReplyObject(reply);  
  103.     return tmp;  
  104. }  
  105.   
  106. //HINCRBYFLOAT 为哈希表中的field域加上浮点增量incr  
  107. //返回值:field域的值(出错写一条信息到log中)  
  108. string redisOperator::hashHincrbyfloat(const string& key,const string& field ,float incr)  
  109. {  
  110.     string tmp("");  
  111.     reply = (redisReply*)redisCommand(c,"HINCRBYFLOAT %s %s %f",key.c_str(),field.c_str(),incr);  
  112.     if(reply->type == REDIS_REPLY_STRING)  
  113.     {  
  114.         tmp=reply->str;  
  115.     }  
  116.   
  117.     freeReplyObject(reply);  
  118.     return tmp;  
  119. }  
  120.   
  121. //HKEYS 返回哈希表key中的所有域  
  122. //不成功返回NULL  
  123. string redisOperator::hashHkeys(const string& key)  
  124. {  
  125.     string tmp("");  
  126.     redisReply *reply;  
  127.     reply = (redisReply*)redisCommand(c,"HKEYS %s ",key.c_str());  
  128.     if(reply->type == REDIS_REPLY_ARRAY)  
  129.     {  
  130.         for(int j = 0 ; j< reply->elements;j++)  
  131.         {  
  132.             tmp += reply->element[j]->str;  
  133.             tmp += "\n";  
  134.         }  
  135.         tmp=tmp.substr(0,tmp.length()-1);  
  136.     }  
  137.   
  138.     return tmp;  
  139. }  
  140.   
  141. //HLEN 返回哈希表中域的数量  
  142. //成功返回非0值  
  143. int redisOperator::hashHlen(const string& key)  
  144. {  
  145.     int tmp = 0;  
  146.     redisReply *reply;  
  147.     reply = (redisReply*)redisCommand(c,"HLEN %s ",key.c_str());  
  148.     if(reply->type == REDIS_REPLY_INTEGER)  
  149.     {  
  150.         tmp = reply->integer;  
  151.     }  
  152.     return tmp;  
  153. }  
  154.   
  155. //HMGET 返回哈希表key中一个或多个给定域的值  
  156. //返回值:一个包含多个给定于的关联值的字符串,不存在的域不反回  
  157. string redisOperator::hashHmget(const string& key,const int& num,const char**field)  
  158. {  
  159.     string tmp("");  
  160.     for(int i = 0;i< num;i++)  
  161.     {  
  162.         reply = (redisReply*)redisCommand(c,"HGET %s %s",key.c_str(),field[i]);  
  163.         if(reply->type == REDIS_REPLY_STRING)  
  164.         {  
  165.             tmp += reply->str;  
  166.             tmp += "\n";  
  167.         }  
  168.         freeReplyObject(reply);  
  169.     }  
  170.     tmp = tmp.substr(0,tmp.length()-1);  
  171.     return tmp;  
  172. }  
  173.   
  174. //HMSET 同时将多个field-value对设置到哈希表key中  
  175. void redisOperator::hashHmset(string& key,int num,char**field,char**value)  
  176. {  
  177.     redisReply *reply;  
  178.     for(int i= 0 ;i < num;i++)  
  179.     {  
  180.         reply = (redisReply*)redisCommand(c,"HSET %s %s %s",key.c_str(),field[i],value[i]);  
  181.         if(reply->type == REDIS_REPLY_ERROR)  
  182.         {  
  183.             //错误处理  
  184.             cout<<"an err occur"<<endl;  
  185.             abort();  
  186.         }  
  187.         freeReplyObject(reply);  
  188.     }  
  189. }  
  190.   
  191. //HSET 将哈希表key中的field的值设置为value  
  192. //返回1 表示新建域,返回0 表示新值覆盖旧值  
  193. bool redisOperator::redisOperator::hashHset(string& key,string& field ,const string& value)  
  194. {  
  195.     int tmp=0;  
  196.     redisReply *reply;  
  197.     reply = (redisReply*)redisCommand(c,"HSET %s %s %s",key.c_str(),field.c_str(),value.c_str());  
  198.     if(reply->type == REDIS_REPLY_INTEGER)  
  199.         tmp += reply -> integer;  
  200.     freeReplyObject(reply);  
  201.     return tmp!=0?true:false;  
  202. }  
  203.   
  204. //HSETNX 将哈希表key中的field的值设置为value  
  205. //成功返回1 否则 0  
  206. bool redisOperator::hashHsetnx(string& key,string& field ,const string& value)   
  207. {  
  208.     int tmp=0;  
  209.     redisReply *reply;  
  210.     reply = (redisReply*)redisCommand(c,"HSETNX %s %s %s",key.c_str(),field.c_str(),value.c_str());  
  211.     if(reply->type == REDIS_REPLY_INTEGER)  
  212.         tmp += reply -> integer;  
  213.     freeReplyObject(reply);  
  214.     return (tmp!=0?true:false);  
  215. }  
  216.   
  217. //HVALS 返回哈希表key中所有域的值  
  218. //key不存在返回空  
  219. //NOTE 该函数测试未通过  
  220. string redisOperator::hashHvals(const string& key)  
  221. {  
  222.     string tmp("");  
  223.     redisReply *reply;  
  224.     reply = (redisReply*)redisCommand(c,"HGETALL %s ",key.c_str());  
  225.     if(reply->type == REDIS_REPLY_ARRAY)  
  226.     {  
  227.         for(int j = 0 ; j< reply->elements;j++)  
  228.         {    
  229.             tmp += hashHget(key,reply->element[j]->str);  
  230.             tmp += "\n";  
  231.             j++;  
  232.         }  
  233.         freeReplyObject(reply);  
  234.         tmp=tmp.substr(0,tmp.length()-1);         
  235.     }  
  236.     return tmp;  
  237. }  
  238.   
  239. //析构函数  
  240. virtual redisOperator::~redisOperator(void)  
  241. {  
  242.     redisFree(c);  
  243. }  
  244. redisOperator::redisOperator(const redisOperator&)  
  245. {  
  246. }  
  247. redisOperator& redisOperator::redisOpeartor=(const redisOperator&)  
  248. {  
  249. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值