Linux下Redis C++操作的封装
安装和启动Redis服务...略!很粗糙的版本,待改进...
Redis Client C++示例代码...略!
/**
* Time: 14-3-10
* File: RedisCache.h
* Author: wbhuang
* Description: none
*/
#ifndef __REDIS_CACHE_H__
#define __REDIS_CACHE_H__
#include <string>
#include <boost/date_time.hpp>
#include "redisclient.h"
using namespace std;
using namespace boost;
class RedisMediator {
public:
static const int DEFAULT_EXPIRE_TIME = 0;
virtual string getKey() = 0;
virtual string getValue() = 0;
int getTime() { return 0; }
bool getIsSetDefaultValue() { return false; }
string getDefaultValue() { return "none"; }
};
class RedisCache {
private:
string host, port;
bool clusterMode;
shared_ptr<redis::client> client;
public:
RedisCache();
virtual ~RedisCache();
RedisCache(string host, string port);
string set(string key, string value);
string get(string key);
string del(string key);
string getAndSet(RedisMediator *redisMediator);
bool exists(string key);
vector<string> mGet(vector<string> *keys);
vector<string> mSet(vector<string> *keys, vector<string> *values);
vector<string> mGetAndSet(vector<RedisMediator*> *redisMediators);
string hashSet(string key, string field, string value);
string hashGet(string key, string field);
string hashDel(string key, string field);
string hashGetAndSet(string key, RedisMediator *redisMediator);
bool hashExists(string key, string field);
int hashLen(string key);
string sAdd(string key, string value);
string sPop(string key);
string sDel(string key);
string rPush(string key, string value);
string lPush(string key, string value);
int lLen(string key);
string lIndex(string key, int index);
string lSet(string key, int index, string value);
string lPop(string key);
string rPop(string key);
void flushAll();
void flushDb();
protected:
};
#endif /*__REDIS_CACHE_H__*/
/**
* Time: 14-3-1
* File: RedisCache.cpp
* Author: wbhuang
* Description: none
*/
#include "RedisCache.h"
#define VALUE_NULL "**nonexistent-key**"
RedisCache::RedisCache()
{
char *charHost= getenv("REDIS_HOST");
if(charHost) {
host = string(charHost);
} else {
host = string("localhost");
}
client = shared_ptr<redis::client>( new redis::client(host) );
}
RedisCache::RedisCache(string host, string port):host(host), port(port)
{
client = shared_ptr<redis::client>( new redis::client(this->host) );
}
RedisCache::~RedisCache()
{
}
string RedisCache::set(string key, string value)
{
if (key.empty())
return "";
client->set(key, value);
return value;
}
string RedisCache::get(string key)
{
string value;
if (key.empty())
return "";
if (exists(key))
value = client->get(key);
return value;
}
string RedisCache::del(string key)
{
string value;
value = get(key);
client->del(key);
return value;
}
string RedisCache::getAndSet(RedisMediator *redisMediator)
{
if (NULL == redisMediator)
return "";
string key, value;
key = redisMediator->getKey();
value = get(key);
if (value.empty())
{
value = redisMediator->getValue();
set(key, value);
int time = redisMediator->getTime();
if (0 != time)
client->expire(key, time);
}
return value;
}
bool RedisCache::exists(string key)
{
return client->exists(key);
}
vector<string> RedisCache::mGet(vector<string> *keys)
{
redis::client::string_vector vals;
client->mget(*keys, vals);
return vals;
}
vector<string> RedisCache::mSet(vector<string> *keys, vector<string> *values)
{
for (int i = 0; i < keys->size(); i++)
{
client->set((*keys)[i], (*values)[i]);
}
return *values;
}
vector<string> RedisCache::mGetAndSet(vector<RedisMediator*> *redisMediators)
{
string key, value;
vector<string> values;
for (int i = 0; i < redisMediators->size(); i++)
{
key = (*redisMediators)[i]->getKey();
value = get(key);
if (value.empty())
{
value = (*redisMediators)[i]->getKey();
set(key, value);
}
values.push_back(value);
}
return values;
}
string RedisCache::hashSet(string key, string field, string value)
{
if(key.empty() || field.empty())
return "";
client->hset(key, field, value);
return value;
}
string RedisCache::hashGet(string key, string field)
{
if (key.empty() || field.empty())
return "";
string value;
if (hashExists(key, field))
value = client->hget(key, field);
return value;
}
string RedisCache::hashDel(string key, string field)
{
string value;
value = hashGet(key, field);
client->hdel(key, field);
return value;
}
string RedisCache::hashGetAndSet(string key, RedisMediator *redisMediator)
{
if (key.empty() || NULL == redisMediator)
return "";
string field, value;
field = redisMediator->getKey();
value = hashGet(key, field);
if (value.empty())
{
value = redisMediator->getValue();
hashSet(key, field, value);
}
return value;
}
bool RedisCache::hashExists(string key, string field)
{
return client->hexists(key, field);
}
int RedisCache::hashLen(string key)
{
return client->hlen(key);
}
string RedisCache::sAdd(string key, string value)
{
if (key.empty() || value.empty())
return "";
client->sadd(key, value);
return value;
}
string RedisCache::sPop(string key)
{
string value;
value = client->spop(key);
if (VALUE_NULL == value)
value = "";
return value;
}
string RedisCache::sDel(string key)
{
if (key.empty())
return "";
return sPop(key);
}
string RedisCache::rPush(string key, string value)
{
if (key.empty())
return "";
client->rpush(key, value);
return value;
}
string RedisCache::lPush(string key, string value)
{
if (key.empty())
return "";
client->lpush(key, value);
return value;
}
int RedisCache::lLen(string key)
{
if (key.empty())
return 0;
return client->llen(key);
}
string RedisCache::lIndex(string key, int index)
{
if (key.empty() || index < 0 || index >= lLen(key))
return "";
string value = client->lindex(key, index);
if (VALUE_NULL == value)
value ="";
return value;
}
string RedisCache::lSet(string key, int index, string value)
{
if (key.empty() || index < 0 || index >= lLen(key))
return "";
client->lset(key, index, value);
return value;
}
string RedisCache::lPop(string key)
{
if (key.empty())
return "";
string value = client->lpop(key);
if (VALUE_NULL == value)
value = "";
return value;
}
string RedisCache::rPop(string key)
{
if (key.empty())
return "";
string value = client->rpop(key);
if (VALUE_NULL == value)
value = "";
return value;
}
void RedisCache::flushAll()
{
client->flushall();
}
void RedisCache::flushDb()
{
client->flushdb();
}
#include "RedisCache.h"
#include <iostream>
int main()
{
RedisCache* cache = new RedisCache();
cache->set("foo", "wbhuang");
string value = cache->get("foo");
cout<<"after set foo:"<<value<<endl;
cache->del("foo");
value = cache->get("foo");
cout<<"after del foo:"<<cache->get("foo")<<endl;
vector<string> vecKey, vecValue;
vecKey.push_back("foo1");
vecValue.push_back("val1");
vecKey.push_back("foo2");
vecValue.push_back("val2");
cache->mSet(&vecKey, &vecValue);
cout<<"after mset foo2:"<<cache->get("foo2")<<endl;
vector<string> vecRet = cache->mGet(&vecKey);
cout<<"after mget foo1:"<<vecRet[0]<<endl;
string hKey = "hfoo";
string hField = "hfield";
cache->hashSet(hKey, hField, "wbhuang");
cout<<"after hset len:"<<cache->hashLen(hKey)<<endl;
string hValue = cache->hashGet(hKey, hField);
cache->hashDel(hKey, hField);
//cache->del(hKey);
cout<<"after hdel len:"<<cache->hashLen(hKey)
<<",value"<<cache->hashGet(hKey, hField)<<endl;
string sKey = "sKey";
string sValue = "sValue";
cache->sAdd(sKey, sValue);
cout<<"after sAdd value:"<<cache->sPop(sKey)<<endl;
cache->sDel(sKey);
cout<<"after sDel value:"<<cache->sPop(sKey)<<endl;
string rKey = "rfoo";
string rValue = "rValue", lValue = "lValue";
cache->rPush(rKey, rValue);
cout<<"test rPush end"<<endl;
cache->lPush(rKey, lValue);
cout<<"test lPush end"<<endl;
string rRet;
rRet = cache->lIndex(rKey, 1);
cout<<"test lIndex end rRet:"<<rRet<<endl;
int llen = cache->lLen(rKey);
cout<<"test lLen end len:"<<llen<<endl;
cout<<"test lIndex end 1:"<<rRet<<endl;
rRet = cache->lPop(rKey);
cout<<"after lPop ret:"<<rRet<<endl;
cache->lSet(rKey, 0, "wbh");
rRet = cache->rPop(rKey);
cout<<"after lset rPop ret:"<<rRet<<endl;
rRet = cache->rPop(rKey);
cout<<"empty stack len:"<<cache->lLen(rKey)<<",ret:"<<cache->rPop(rKey)<<endl;
cout<<"empty statck 0:"<<cache->lIndex(rKey, 0)<<endl;
cache->flushDb();
delete cache;
return 0;
}
Linux下Redis C++操作的封装的更多相关文章
- Linux下Redis服务器安装配置
说明:操作系统:CentOS1.安装编译工具yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel ...
- linux下Redis与phpredis扩展安装
++++++++++++++++++++++++++++++++++++++++++++++linux下Redis与phpredis扩展安装++++++++++++++++++++++++++++++ ...
- windows下和linux下 Redis 安装
Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windo ...
- 莫小安 Linux下Redis的安装与配置
转载自--Linux下Redis的安装与配置 redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcached类似,但很大程度补偿了 memcached的不足,它 ...
- linux下的shell操作mysql
(1)MySQL的启动 重启了一次服务器后,使用> mysql -u root -p登陆是出现下面的错误: ERROR 2002 (HY000): Can't connect to local ...
- linux下redis的安装及配置启动
linux下redis的安装及配置启动 标签: redisnosql 2014-10-24 14:04 19732人阅读 评论(0) 收藏 举报 分类: 数据与性能(41) wget http:/ ...
- linux下的文本操作之 文本查找——grep
摘要:你有没有这样的应用场景:调试一个程序,出现debug的提示信息,现在你需要定位是哪个文件包含了这个debug信息,也就是说,你需要在一个目录下的多个文件(可能包含子目录)中查找某个字符串的位置: ...
- linux下通过sysfs操作GPIO
linux下通过sysfs操作GPIO 在嵌入式设备中对GPIO的操作是最基本的操作.一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的.其实linux下面有一个通用的GPIO操作接口,那就是 ...
- linux下redis服务器安装使用 安装php的redis扩展 安装laravel下的redis
linux下redis服务器安装使用 学习源头: https://blog.csdn.net/itmanba/article/details/77335012 安装完毕试运行redis的时候,可能会出 ...
随机推荐
- 洛谷——P2658 汽车拉力比赛
P2658 汽车拉力比赛 题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之间. 其中一些 ...
- 2017 [六省联考] T6 寿司餐厅
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 450 Solved: 316[Submit][Status ...
- MyBatis_SelectKey使用oracle 序列插入主键
mapper 如下: 使用<selectkey>实现 也可以使用oracle的row 级触发器trigger实现: <?xml version="1.0" enc ...
- 转 Windows串口过滤驱动程序的开发
在Windows系统上与安全软件相关的驱动开发过程中,“过滤(filter)”是极其重要的一个概念.过滤是在不影响上层和下层接口的情况下,在Windows系统内核中加入新的层,从而不需要修改上层的软件 ...
- 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)
http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ表示. 经常使用的有: ∥x∥1=|x1|+⋯+|xn| ∥x∥2=x21+⋯+x2n−−−−−− ...
- AngularJS的简单表单验证
代码下载:https://files.cnblogs.com/files/xiandedanteng/angularjsCheckSimpleForm.rar 代码: <!DOCTYPE HTM ...
- 函数指针使用演示样例(參考Linux-内核代码)
本文有xhz1234(徐洪志)编写,转载请注明出处. http://blog.csdn.net/xhz1234/article/details/36635083 作者:徐洪志 近期阅读Linux-内核 ...
- 笔记03 wpf 在MVVM模式下怎样在Viewmodel里面获得view的控件对象
转自http://blog.csdn.net/qing2005/article/details/6601199http://blog.csdn.net/qing2005/article/detail ...
- Windows 10遭遇百万粉丝“围攻”(挑刺)
9月30日,微软公布Win 10技术预览版,征求反馈意见. 出人意料的是.截止10月14日.在短短两周内,竟有百万粉丝下载试用(所谓"測试"),反馈了20万条改动意见.对此,微软真 ...
- Python实战之自己主动化评论
Python实战之自己主动化评论 玩csdn博客一个多月了,渐渐发现了一些有意思的事,常常会有人用相同的评论到处刷.不知道是为了加没什么用的积分,还是纯粹为了表达楼主好人.那么问题来了,这种无聊的事情 ...