Redis C语言操作封装
#ifndef BOYAA_FOURLANDLORD_REDISCLASS_H_20130217 #define BOYAA_FOURLANDLORD_REDISCLASS_H_20130217 #include "hiredis.h" #include <string> #include <vector> using namespace std; typedef struct RedisConf { char pszServer[32]; int nPort; RedisConf() { memset(this, 0, sizeof(RedisConf)); } }TRedisConf; class CRedisClass { public: CRedisClass(string& host, int& port, unsigned short second = 5); ~CRedisClass(); int ConnectRedis(const char* host, const unsigned short& port, const unsigned short second = 5); int ConnectRedis(); int SetValue(const string &key, const string &value); string &GetValue(const string &key, string &value); bool DelValue(string &key); bool ExiKey( string &key); int Enqueue(const string &queue, const string &value); string &Dequeue(const string &queue, string &value); int Push(const string &stack, const string &value); string &Pop(const string &stack, string &value); bool IsActived(); bool Expire(const string& key, unsigned int sec); bool ZRange(string& key, int start, int end, vector<string> & ret); int ZSize(const string& key); int ZAdd(const string& key, const int value, const string& menber); bool ZRemRangeByRank(const string& key, int min, int max); string ZScore(const string& key, const string& member, string& score); int ZRank(const string& key, const string& member); int ZRevRank(const string& key, const string& member); bool SetByte(const string & key, char * buf, int len); int GetByte(const string & key, char * buf, int len); bool SAdd(const string & key, const string & menber); bool SRem(const string & key, const string & menber); bool SMembers(const string & key, vector<string> & ret); bool LPush(const string & key, const string & menber); bool RPush(const string & key, const string & menber); bool LPop(const string & key, string & value); bool RPop(const string & key, string & value); bool RRange(const string & key, vector<string> & ret); bool LRem(const string & key, const string & menber); int LLen(const string & key); private: TRedisConf m_RedisConf; //redis配置 redisContext *m_Redis; redisReply *m_Reply; struct timeval timeout; string redisHost; unsigned short redisPort; void freeReply(); bool ping(); CRedisClass(const CRedisClass& /*rhs*/){} }; #endif
#include "RedisClass.h" #include <string> using namespace std; CRedisClass::CRedisClass(string& host, int& port,unsigned short second/* = 5*/) { m_Reply = NULL; redisHost = host; redisPort = port; timeout.tv_sec = second; timeout.tv_usec = 0; m_Redis = redisConnectWithTimeout(redisHost.c_str(), redisPort, timeout); } CRedisClass::~CRedisClass() { if(m_Reply) { freeReply(); } if(m_Redis) { redisFree(m_Redis); } } int CRedisClass::ConnectRedis(const char* host, const unsigned short& port, const unsigned short second/* = 5*/) { if (m_Redis) { redisFree(m_Redis); } struct timeval tv = {second, 0}; m_Redis = redisConnectWithTimeout(host, port, tv); return m_Redis ? 0 : 1; } int CRedisClass::ConnectRedis() { if (m_Redis) { redisFree(m_Redis); } m_Redis = redisConnectWithTimeout(redisHost.c_str(), redisPort, timeout); return m_Redis ? 0 : 1; } int CRedisClass::SetValue(const string& key, const string& value) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SET %s %s", key.c_str(), value.c_str())); int result = 1; if(m_Reply != NULL) { result = m_Reply ? m_Reply->integer : 1; } freeReply(); return result; } string& CRedisClass::GetValue(const string& key, string& value) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "GET %s", key.c_str())); if(m_Reply != NULL && NULL != m_Reply->str) { value = m_Reply->str; } freeReply(); return value; } int CRedisClass::Enqueue(const string& queue, const string& value) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "rpush %s %s", queue.c_str(), value.c_str())); int result = 1; if(m_Reply != NULL) { result = m_Reply ? m_Reply->integer : 1; } freeReply(); return result; } string& CRedisClass::Dequeue(const string& queue, string& value) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "lpop %s", queue.c_str())); if (m_Reply) { if (m_Reply->type == 1) { value = m_Reply->str; } freeReply(); } return value; } int CRedisClass::Push(const string& stack, const string& value) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "rpush %s %s", stack.c_str(), value.c_str())); int result = 1; if(m_Reply != NULL) { result = m_Reply ? m_Reply->integer : 1; } freeReply(); return result; } string& CRedisClass::Pop(const string& stack, string& value) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "rpop %s", stack.c_str())); if(m_Reply != NULL) { value = m_Reply->str; } freeReply(); return value; } bool CRedisClass::DelValue(string& key) { m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "DEL %s ", key.c_str())); if(m_Reply != NULL) { freeReply(); return true; } return false; } bool CRedisClass::ExiKey(string& key) { int rec = 0; m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "EXISTS %s", key.c_str())); if(m_Reply != NULL) { rec = m_Reply->integer; freeReply(); return rec==1 ? true : false; } return false; } bool CRedisClass::IsActived() { return ping(); } void CRedisClass::freeReply() { if(m_Reply) { freeReplyObject(m_Reply); m_Reply = NULL; } } bool CRedisClass::ping() { if (!m_Redis) { return false; } m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ping")); bool IsActviced = false; if (m_Reply != NULL) { IsActviced = strcmp("PONG", m_Reply->str) == 0 ? true : false; freeReply(); } return IsActviced; } bool CRedisClass::ZRange(string& key, int start, int end, vector<string> & ret) { m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "ZREVRANGE %s %d %d", key.c_str(), start, end)); if(m_Reply != NULL) { for (int i = 0; i < m_Reply->elements; i++) { redisReply *r = m_Reply->element[i]; ret.push_back(r->str); } freeReply(); return true; } return false; } int CRedisClass::ZSize(const string& key) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZCARD %s", key.c_str())); int result = 0; if(m_Reply != NULL) { result = m_Reply ? m_Reply->integer : 0; freeReply(); } return result; } int CRedisClass::ZAdd(const string& key, const int value, const string& menber) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZADD %s %d %s", key.c_str(), value, menber.c_str())); int result = 1; if(m_Reply != NULL) { result = m_Reply ? m_Reply->integer : 1; freeReply(); } return result; } bool CRedisClass::ZRemRangeByRank(const string& key, int min, int max) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZREMRANGEBYRANK %s %d %d", key.c_str(), min, max)); int result = 1; if(m_Reply != NULL) { result = m_Reply ? m_Reply->integer : 1; freeReply(); } return result; } string CRedisClass::ZScore(const string& key, const string& member, string& score) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZSCORE %s %s", key.c_str(), member.c_str())); if(m_Reply != NULL) { if (NULL != m_Reply->str) { score = m_Reply->str; } freeReply(); } return score; } int CRedisClass::ZRank(const string& key, const string& member) { int ret = 1000000; m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZREVRANK %s %s", key.c_str(), member.c_str())); if(m_Reply != NULL && 3 == m_Reply->type) { ret = m_Reply->integer; freeReply(); } return ret; } int CRedisClass::ZRevRank(const string& key, const string& member) { int ret = 1000000; m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "ZREVRANK %s %s", key.c_str(), member.c_str())); if(m_Reply != NULL && 3 == m_Reply->type) { ret = m_Reply->integer; freeReply(); } return ret; } bool CRedisClass::Expire(const string& key, unsigned int sec) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "EXPIRE %s %d", key.c_str(), sec)); bool result = false; if(m_Reply != NULL) { result = true; freeReply(); } return result; } bool CRedisClass::SetByte(const string & key, char * buf, int len) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SET %b %b", key.c_str(), key.length(), buf, len)); int result = false; if(m_Reply != NULL) { result = true; freeReply(); } return result; } int CRedisClass::GetByte(const string & key, char * buf, int len) { if (NULL != buf) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "GET %s", key.c_str())); if (NULL != m_Reply && len >= m_Reply->len) { memcpy(buf, m_Reply->str, m_Reply->len); int iRet = m_Reply->len; freeReply(); return iRet; } } return 0; } bool CRedisClass::SAdd(const string & key, const string & menber) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SADD %s %s", key.c_str(), menber.c_str())); bool result = false; if(m_Reply != NULL) { if (1 == m_Reply->integer) { result = true; } freeReply(); } return result; } bool CRedisClass::SRem(const string & key, const string & menber) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "SREM %s %s", key.c_str(), menber.c_str())); bool result = false; if(m_Reply != NULL) { if (1 == m_Reply->integer) { result = true; } freeReply(); } return result; } bool CRedisClass::SMembers(const string & key, vector<string> & ret) { m_Reply = reinterpret_cast<redisReply*>(redisCommand(m_Redis, "SMEMBERS %s", key.c_str())); if(m_Reply != NULL) { for (int i = 0; i < m_Reply->elements; i++) { redisReply *r = m_Reply->element[i]; ret.push_back(r->str); } freeReply(); return true; } return false; } bool CRedisClass::LPush(const string & key, const string & menber) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LPUSH %s %s", key.c_str(), menber.c_str())); bool result = false; if(m_Reply != NULL) { if (0 < m_Reply->integer) { result = true; } freeReply(); } return result; } bool CRedisClass::RPush(const string & key, const string & menber) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "RPUSH %s %s", key.c_str(), menber.c_str())); bool result = false; if(m_Reply != NULL) { if (0 < m_Reply->integer) { result = true; } freeReply(); } return result; } bool CRedisClass::LPop(const string & key, string & value) { value = ""; m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LPOP %s", key.c_str())); if(m_Reply != NULL && NULL != m_Reply->str) { value = m_Reply->str; } freeReply(); if (value.empty()) { return false; } return true; } bool CRedisClass::RPop(const string & key, string & value) { value = ""; m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "RPOP %s", key.c_str())); if(m_Reply != NULL && NULL != m_Reply->str) { value = m_Reply->str; } freeReply(); if (value.empty()) { return false; } return true; } bool CRedisClass::RRange(const string & key, vector<string> & ret) { string value; while (RPop(key, value)) { ret.push_back(value); } return true; } bool CRedisClass::LRem(const string & key, const string & menber) { m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LREM %s %s", key.c_str(), menber.c_str())); bool result = false; if(m_Reply != NULL) { if (1 == m_Reply->integer) { result = true; } freeReply(); } return result; } int CRedisClass::LLen(const string & key) { int ret = 0; m_Reply = static_cast<redisReply*>(redisCommand(m_Redis, "LLEN %s", key.c_str())); bool result = false; if(m_Reply != NULL) { ret = m_Reply->integer; freeReply(); } return ret; }
Redis C语言操作封装的更多相关文章
- Go语言操作Redis
Go语言操作Redis Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上.除此之外,通过复制.持久化和客 ...
- GO学习-(24) Go语言操作Redis
Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据 ...
- python之redis和memcache操作
Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...
- Spring Boot 整合 Redis 实现缓存操作
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 产品没有价值,开发团队再优秀也无济于事 – <启示录> 』 本文提纲 ...
- c语言实现封装、继承和多态
1. 概述 C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是 ...
- Go语言操作MySQL数据库
Go语言操作MySQL数据库 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用 ...
- Redis 以及 Python操作Redis
Redis Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis有以下特点: -- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可 ...
- Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置
Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...
- 简谈Java语言的封装
简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...
随机推荐
- CocoaPods | iOS详细使用说明
一:介绍 在iOS开发中,经常会使用到第三方库,[CocoaPods](https://github.com/CocoaPods/CocoaPods)可以用来方便的统一管理这些第三方库. 下面就和大家 ...
- (4)ASP.NET HttpRequest 类
HttpRequest 类的主要作用是读取客户端在 Web 请求期间发送的 HTTP 值. https://msdn.microsoft.com/zh-cn/library/system.web.ht ...
- 【UTR #2】题目排列顺序
题目描述 "又要出题了." 宇宙出题中心主任 -- 吉米多出题斯基,坐在办公桌前策划即将到来的 UOI. 这场比赛有 $n$ 道题,吉米多出题斯基需要决定这些题目的难度,然后再在汪 ...
- layDate 日期与时间组件 入门
首先第一步 在官方下载layDate文件.layUI官网:http://layer.layui.com/ https://www.layui.com/laydate/ layDate文件的下载步 ...
- 正确使用Block避免Cycle Retain和Crash
Block简介 Block作为C语言的扩展,并不是高新技术,和其他语言的闭包或lambda表达式是一回事.需要注意的是由于Objective-C在iOS中不支持GC机制,使用Block必须自己管理内存 ...
- Boost.Asio c++ 网络编程翻译(18)
同步服务端 同步服务端也相当简单.它须要两个线程,一个负责接收新的client.另外一个负责处理已经存在的client. 它不能使用单线程:等带一个新的client是一个堵塞操作,所以我们须要另外一个 ...
- STM32串行通信USART解说笔记
STM32串行通信USART程序例举链接:http://blog.csdn.net/dragon12345666/article/details/24883111 1.STM32串行通信USART的相 ...
- java开始到熟悉105-107
1,HashMap基本用法 package list; import java.util.HashMap; import java.util.Map; /** * 测试map的基本用法 * @auth ...
- idea主要设置大纲图
idea修改主题和字体大小: 对菜单栏进行调整,不过貌似没什么用: 一般设置:
- 如何学习Java?
一点感悟 java作为一门编程语言,在各类编程语言中作为弄潮儿始终排在前三的位置,这充分肯定了java语言的魅力,在实际项目应用中,我们已经无法脱离javaa(Ps当然你可以选择不使用),但它的高性能 ...