Redis HASH 操作类型封装

本文介绍了作者在项目中为Redis的HASH数据类型封装的操作类,详细列出对HASH的所有操作,经测试验证功能正常。

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

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

头文件

#pragma once

class redisOperator
{

private:	
	//一个操作redis数据库的句柄
	redisContext *c;
public:	
	redisOperator(void);

	//HDELL 删除key中的一个或者多个域,成功返回删除的个数(返回值可能和num不一致)
	int hashHdel(string& key,const int& num,const char** value);
	
	//HEXISTS 查看哈希表中是否存在给定域,存在返回1 否则 0
	int hashHexists(const string& key,const string& field);
	
	//HGET 返回哈希表 key 中给定域 field 的值。成功返回给定的域,否则NULL
	string hashHget(const string& key,const string& field);
	
	//HGETALL key 返回哈希表 key 中,所有的域和值。
	//成功返回true 否则false
	string hashHgetall(const string& key);
	
	//HINCRYBY为哈希表中的field域的值加上增量
	//返回值:field域的值(出错返回原值,写一条信息到log中)
	int hashHincrby(const string& key,const string& field,unsigned int incr);

	//HINCRBYFLOAT 为哈希表中的field域加上浮点增量incr
	//返回值:field域的值(出错写一条信息到log中)
	string hashHincrbyfloat(const string& key,const string& field ,float incr);

	//HKEYS 返回哈希表key中的所有域
	//不成功返回NULL
	string hashHkeys(const string& key);

	//HLEN 返回哈希表中域的数量
	//成功返回非0值
	int hashHlen(const string& key);

	//HMGET 返回哈希表key中一个或多个给定域的值
	//返回值:一个包含多个给定于的关联值的字符串,不存在的域返回NULL
	string hashHmset(const string& key,const int& num,const char**argc);

	//HMSET 同时将多个field-value对设置到哈希表key中
	void hashHmset(string& key,int num,char** field,char**value);

	//HSET 将哈希表key中的field的值设置为value
	//返回1 表示新建域,返回0 表示新值覆盖旧值
	bool hashHset(string& key,string& field ,const string& value);

	//HSETNX 将哈希表key中的field的值设置为value
	//成功返回1 否则 0
	bool hashHsetnx(string& key,string& field ,const string& value); 
	
	//HVALS 返回哈希表key中所有域的值
	//key不存在返回空
	string hashHvals(const string& key);

	//析构函数
	virtual ~redisOperator(void);
private:
	redisOperator(const redisOperator&);
	redisOperator& redisOpeartor=(const redisOperator&);
};

实现文件

#include "redisOperator.h"

redisOperator::redisOperator(void)
{
	const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1";
	int port = (argc > 2) ? atoi(argv[2]) : 6379;
	struct timeval timeout = { 1, 500000 }; // 1.5 seconds
	c = redisConnectWithTimeout(hostname, port, timeout);
	cacheHandle handle(c,hostname);
	if (c == NULL || c->err)
	{
		if (c)
		{
			cout<<"Connection error: %s\n", c->errstr;
			redisFree(c);
		}
		else
		{
			cout<<"Connection error: can't allocate redis context\n";
		}
		exit(-1);
	}
}

//HDELL 删除key中的一个或者多个域,成功返回删除的个数(返回值可能和num不一致)
int redisOperator::hashHdel(string& key,const int& num,const char** value)
{
	int tmp = 0;
	redisReply *reply;
	for(int i= 1 ;i < num;i++)
	{
		reply = (redisReply*)redisCommand(c,"HDEL %s %s",key.c_str(),value[i]);
		if(reply->type == REDIS_REPLY_INTEGER)
			tmp += teply -> integer;
	}
	freeReplyObject(reply);
	return tmp;	
}

//HEXISTS 查看哈希表中是否存在给定域,存在返回1 否则 0
int hashHexists(const string& key,const string& field)
{
	int tmp = 0;
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HEXISTS %s %s",key.c_str(),field.c_str());
	if(reply->type == REDIS_REPLY_INTEGER)
		tmp = reply->integer;
	freeReplyObject(reply);
	return tmp;
}

//HGET 返回哈希表 key 中给定域 field 的值。成功返回给定的域,否则NULL
string redisOperator::hashHget(const string& key,const string& field)
{
	string tmp("");
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HGET %s %s",key.c_str(),field.c_str());
	if(reply->type == REDIS_REPLY_STRING)
		tmp = reply->str;
	freeReplyObject(reply);
	return tmp;
}

//HGETALL key 返回哈希表 key 中,所有的域和值。
//成功返回true 否则false
string redisOperator::hashHgetall(const string& key)
{
	string tmp("");
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HGETALL %s ",key.c_str());
	if(reply->type == REDIS_REPLY_ARRAY)
	{
		for(int j = 0 ; j< reply->elements;j++)
		{  
			tmp += reply->element[j]->str;
			tmp += "\n";
			tmp += hashHget(key,reply->element[j]->str);
			tmp += "\n";
			j++;
		}
		freeReplyObject(reply);
		tmp=tmp.substr(0,tmp.length()-1);		
	}
	else

	return tmp;
}

//HINCRYBY为哈希表中的field域的值加上增量
//返回值:field域的值(出错返回-1,写一条信息到log中)
int redisOperator::hashHincrby(const string& key,const string& field,unsigned int incr)
{
	int tmp = -1;
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HINCRBY %s %s %d",key.c_str(),field.c_str(),incr);
	if(reply->type == REDIS_REPLY_INTEGER)
	{
		tmp=reply->integer;
	}
	else

	freeReplyObject(reply);
	return tmp;
}

//HINCRBYFLOAT 为哈希表中的field域加上浮点增量incr
//返回值:field域的值(出错写一条信息到log中)
string redisOperator::hashHincrbyfloat(const string& key,const string& field ,float incr)
{
	string tmp("");
	reply = (redisReply*)redisCommand(c,"HINCRBYFLOAT %s %s %f",key.c_str(),field.c_str(),incr);
	if(reply->type == REDIS_REPLY_STRING)
	{
		tmp=reply->str;
	}

	freeReplyObject(reply);
	return tmp;
}

//HKEYS 返回哈希表key中的所有域
//不成功返回NULL
string redisOperator::hashHkeys(const string& key)
{
	string tmp("");
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HKEYS %s ",key.c_str());
	if(reply->type == REDIS_REPLY_ARRAY)
	{
		for(int j = 0 ; j< reply->elements;j++)
		{
			tmp += reply->element[j]->str;
			tmp += "\n";
		}
		tmp=tmp.substr(0,tmp.length()-1);
	}

	return tmp;
}

//HLEN 返回哈希表中域的数量
//成功返回非0值
int redisOperator::hashHlen(const string& key)
{
	int tmp = 0;
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HLEN %s ",key.c_str());
	if(reply->type == REDIS_REPLY_INTEGER)
	{
		tmp = reply->integer;
	}
	return tmp;
}

//HMGET 返回哈希表key中一个或多个给定域的值
//返回值:一个包含多个给定于的关联值的字符串,不存在的域不反回
string redisOperator::hashHmget(const string& key,const int& num,const char**field)
{
	string tmp("");
	for(int i = 0;i< num;i++)
	{
		reply = (redisReply*)redisCommand(c,"HGET %s %s",key.c_str(),field[i]);
		if(reply->type == REDIS_REPLY_STRING)
		{
			tmp += reply->str;
			tmp += "\n";
		}
		freeReplyObject(reply);
	}
	tmp = tmp.substr(0,tmp.length()-1);
	return tmp;
}

//HMSET 同时将多个field-value对设置到哈希表key中
void redisOperator::hashHmset(string& key,int num,char**field,char**value)
{
	redisReply *reply;
	for(int i= 0 ;i < num;i++)
	{
		reply = (redisReply*)redisCommand(c,"HSET %s %s %s",key.c_str(),field[i],value[i]);
		if(reply->type == REDIS_REPLY_ERROR)
		{
			//错误处理
			cout<<"an err occur"<<endl;
			abort();
		}
		freeReplyObject(reply);
	}
}

//HSET 将哈希表key中的field的值设置为value
//返回1 表示新建域,返回0 表示新值覆盖旧值
bool redisOperator::redisOperator::hashHset(string& key,string& field ,const string& value)
{
	int tmp=0;
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HSET %s %s %s",key.c_str(),field.c_str(),value.c_str());
	if(reply->type == REDIS_REPLY_INTEGER)
		tmp += reply -> integer;
	freeReplyObject(reply);
	return tmp!=0?true:false;
}

//HSETNX 将哈希表key中的field的值设置为value
//成功返回1 否则 0
bool redisOperator::hashHsetnx(string& key,string& field ,const string& value) 
{
	int tmp=0;
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HSETNX %s %s %s",key.c_str(),field.c_str(),value.c_str());
	if(reply->type == REDIS_REPLY_INTEGER)
		tmp += reply -> integer;
	freeReplyObject(reply);
	return (tmp!=0?true:false);
}

//HVALS 返回哈希表key中所有域的值
//key不存在返回空
//NOTE 该函数测试未通过
string redisOperator::hashHvals(const string& key)
{
	string tmp("");
	redisReply *reply;
	reply = (redisReply*)redisCommand(c,"HGETALL %s ",key.c_str());
	if(reply->type == REDIS_REPLY_ARRAY)
	{
		for(int j = 0 ; j< reply->elements;j++)
		{  
			tmp += hashHget(key,reply->element[j]->str);
			tmp += "\n";
			j++;
		}
		freeReplyObject(reply);
		tmp=tmp.substr(0,tmp.length()-1);		
	}
	return tmp;
}

//析构函数
virtual redisOperator::~redisOperator(void)
{
	redisFree(c);
}
redisOperator::redisOperator(const redisOperator&)
{
}
redisOperator& redisOperator::redisOpeartor=(const redisOperator&)
{
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值