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的时候,可能会出 ...
随机推荐
- HDU 5972 Regular Number(字符串shift - and算法)
题目链接 HDU5972 2016 ACM/ICPC 大连区域赛 B题 我们预处理出$b[i][j]$,$b[i][j] = 1$的意义是数字$i$可以放在第$j$位. 然后就开始这个匹配的过程. ...
- 洛谷—— P2895 [USACO08FEB]流星雨Meteor Shower
P2895 [USACO08FEB]流星雨Meteor Shower 题目描述 Bessie hears that an extraordinary meteor shower is coming; ...
- spring mvc表单的展现、输入处理、校验的实现
之前已经实现了spring mvc的入门例子及如何处理带参数的请求Controller编写.本文主要记录: 1)重定向请求 2)处理路径中含有变量的请求 3)使用JSR-303进行校验 ① 首先,编写 ...
- HTTPS协议工作流程
被问到了,复习一下HTTPS的工作流程 提到https,不得不提SSL SSL 1. 安全套接字(Secure Socket Layer,SSL)协议是Web浏览器与Web服务器之间安全 ...
- 深入理解Activity启动流程(三)–Activity启动的详细流程2
本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 本系列博客将详细阐述Activity的启动流程,这些博客基于Cm 10.1源码研究. 深入理解Activity启动流程(一)--A ...
- qt实现又一次登录
1.需求 须要实现程序操作过程中的又一次启动,即常常说的又一次登录功能 2.解决 在main函数中检測exec的返回值决定是关闭还是重新启动.使用注冊函数atexit(relogin)来实现这个功能 ...
- C#给指定doc文件写入宏
private void InsertMacro() { Word.Application oWord; Word.Document oDoc; VBIDE.VBComponent oModule; ...
- linux查找文件夹下的全部文件里是否含有某个字符串
查找文件夹下的全部文件里是否含有某个字符串 find .|xargs grep -ri "IBM" 查找文件夹下的全部文件里是否含有某个字符串,而且仅仅打印出文件名称 fin ...
- Layout规则总结
一.尺寸要求 1.过孔到焊盘的距离多少合适? 6mil左右 2.铜皮到边框的距离多少合适? 极限8mil,通常12,最好做到20,40 3.Thermal焊盘打地孔个数? 正方形 3*3 4*4 ...
- C++编译错误 2001 1120
无法解析的外部符号"symbol" 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 该错误信息之后为错误 LNK1120. 可能的原因 : 在将托管库或 W ...