1
bool RS::set_m(ITEM* itemp)
{
if (itemp == nullptr)
return false;
char itemkey[LEN_ITEM], itemval[LEN_ITEM];
try {
auto redis = Redis(tcpipport);
sprintf(itemkey, "M%02d%04d%02d%s", itemp->devno, itemp->modno, itemp->partno, itemp->key);
strcpy(itemp->mkey, itemkey);
redis.hset(itemkey, "mkey", itemp->mkey);
sprintf(itemp->pkey, "P%02d%04d%02d%s", itemp->devno, itemp->modno, itemp->partno, itemp->key);
redis.hset(itemkey, "pkey", itemp->pkey);
sprintf(itemval, "%d", itemp->devno); redis.hset(itemkey, "devno", itemval); //redis.hset(itemkey, std::make_pair("devno", itemval));
sprintf(itemval, "%d", itemp->modno); redis.hset(itemkey, "modno", itemval);
sprintf(itemval, "%d", itemp->partno); redis.hset(itemkey, "partno", itemval);
redis.hset(itemkey, "key", itemp->key);
sprintf(itemval, "%d", itemp->ifvar); redis.hset(itemkey, "ifvar", itemval); //redis.hset(itemkey, std::make_pair("devno", itemval));
sprintf(itemval, "%d", itemp->datatype); redis.hset(itemkey, "datatype", itemval);
sprintf(itemval, "%d", itemp->datalen); redis.hset(itemkey, "datalen", itemval);
redis.hset(itemkey, "value", itemp->value);
redis.hset(itemkey, "valdef", itemp->valdef);
redis.hset(itemkey, "valall", itemp->valall);
redis.hset(itemkey, "style", itemp->style);
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
Redis缓存Object,List对象:
https://www.cnblogs.com/firstdream/p/7802295.html
实现db任意库号切换配置(如db0,db1,db2....)
#include
using namespace std;
using namespace sw::redis;
char RS::ip[LEN_ITEM] = {0};
unsigned int RS::port = 6379;
char RS::tcpipport[LEN_ITEM] = {0}; //such as "tcp://127.0.0.1:6379"
char RS::db[LEN_ITEM] = "db0";
std::string RS::mConnString;
void RS::configRS(const char* ipSvr, const char* dbName, const int mport)
{
if (strlen(ipSvr) < 7 || mport == 0)return;
std::string strPre = "tcp://";
std::copy(ipSvr, ipSvr + strlen(ipSvr), RS::ip);
std::copy(dbName, dbName + strlen(dbName), RS::db);
RS::port = mport;
std::string strIP = std::string(RS::ip);
std::string strdb = std::string(RS::db);
ostringstream ost;
ost
mConnString = ost.str(); //tcp://192.168.137.100:6379/db0
CLog::rec(CPPFILE,"connect string is :%s", mConnString);
}
定义结构体:
typedef struct _ITEM { //管理表格,目前用于初始化
char mkey[LEN_ITEM];
char pkey[LEN_ITEM];
// jlong id; //内部标识号,长整型
int devno; //部署三级参数,devno00,01-99
int modno; //分片编号,如控制器00-09;驱动器20-39
int partno; //尽量不使用,到具体参数定. 00,01-99
// int keyno; //
char key[LEN_ITEM]; //KEY
bool ifvar; //
int datatype; //1:1bit; 10:单字节; 20 short; 40 int;41 float;46 datatime; 80 jlong; 81 double; 610字符串\0结束 32位以内
int datalen; //数值字节长度
char value[LEN_ITEM]; //VALUE
char valdef[LEN_ITEM]; //VALUE缺省值 如果因为没有设置、或者采集到,则填写为缺省值
char valall[LEN_ITEM]; //分割符号
char style[LEN_ITEM]; //text,radio,range,select
}ITEM;
.h头文件:
#ifndef REDISPP_MAIN
#define REDISPP_MAIN
#include
#include
#include
#include "../app/yx00_macro.h"
#include "../app/yx00_type.h"
//https://www.cnblogs.com/firstdream/p/7802295.html
class RS {
public:
static char ip[LEN_ITEM];
static int port;
static char tcpipport[LEN_ITEM]; //such as "tcp://127.0.0.1:6379"
public:
static void config(const char* tcpiport);
public:
static bool log(std::string value);
static bool empty_db(); //清空内存pars
static bool empty_pars(); //清空内存pars
static bool empty_m(const std::string mkey_pattern,std::string &report); // RS 清空m key 及其数据
static bool empty_p(); // RS 清空p key 及其数据
static bool get_hash_all(const std::string pattern, std::initializer_listfields,std::vector> &valss); //从redis库中获取M表,用于管理
static bool get_p(std::string key, ITEM* item); //获取p参数,填写到item的value
static bool get_p(std::string key, int &intvalue); //获取p参数,填写到int的value
static bool get_p(const char* key, int& intvalue); //获取p参数,填写到int的value
static bool get_p(std::string key, std::string &strvalue); //获取p参数,填写到int的value
static bool get_p(const char *key, char *strvalue); //
static bool get_m(std::string key, ITEM& item); //获取m参数,填写整个item
static bool get_m(std::string key, std::string& itemstring); //获取m参数,填写整个item
static bool set_m(ITEM* itemp);
static bool set_m_all(std::vector pars); //向redis库中设置M表,用于管理
static bool get_m_all(std::vector& pars); //从redis库中获取M表,用于管理
static bool get_m_all(const std::string pattern, std::string& report); //从redis库中获取M表,用于管理
static bool get_chn(std::string key, std::string& itemstring);
static bool get_chn_all(const std::string pattern, std::string& report); //从redis库中获取M表,用于管理
// static bool get_chn_all(const std::string pattern, std::string& report); //从redis库中获取M表,用于管理
static bool get_pro(std::string key, std::string& itemstring);
static bool get_pro_all(const std::string pattern, std::string& report); //从redis库中获取M表,用于管理
static bool set_p(const std::string key,const std::string value, std::string excepcontent); //向redis库中设置P表,用于监控和操作
static bool set_p_all(std::vector pars); //向redis库中设置P表,用于监控和操作
static bool set_p_kvs(std::vector> pars);
static bool get_p_all(std::vector& pars); //向redis库中设置P表,用于监控和操作
static bool get_p_keys(std::map&maps);
//const char* name, const int type, const bool issvr, const char* addr, const int port, const int timeout,
//const int speed, const bool openkeep, const bool byrecv, const bool connected, const bool flag_task_run, const time_t recvtime, const int cmdid, const int tasknum, const int cur
static bool set_chn(const char*name, const int type, const bool issvr,const char *addr, const int port, const int timeout, const int speed, const bool openkeep, const bool byrecv, const bool connected, const bool flag_task_run, const time_t recvtime,const int cmdid,const int tasknum,const int cur);
static bool set_pro(const char* name, const jlong id, const int type, const char* chn, const char* sendbuf, const int sendbuflen_must, const int sendbuflen_act, const int sendtime, const char* recvbuf, const int recvbuflen_must, const int recvbuflen_act, const int recvtime, const char* ecpttext, const int status);
static int init();
// static bool set_p(const char* item, char* val); //获取参数
// static bool get_p(const char* item, char* val); //获取参数
// static bool getp(const int devno, const int modno, const int partno, const char* item, char* val);//获取参数
//
// static bool setvall(std::vector vars); //从redis库中获取所有的变量表,用于管理
// static bool setv(const char* item, char* val); //获取参数
// static bool getv(const char* item, char* val); //获取变量
};
#endif
cpp----文件:----
#include "redis++.h"
#include
#include
#include
//#include
#include
#include "../app/yx00_var.h"
//#include
#include "../app/yx01_log.h"
#include "redispp_main.h"
using namespace sw::redis;
char RS::ip[LEN_ITEM] = "192.168.137.100";
int RS::port = 6379;
char RS::tcpipport[LEN_ITEM] = "tcp://192.168.137.100:6379"; //such as "tcp://127.0.0.1:6379"
//Redis缓存Object,List对象 https://www.cnblogs.com/firstdream/p/7802295.html
//结构化存储 http://www.doc88.com/p-7466440106885.html
void RS::config(const char* tcpipport_ext)
{
strcpy(tcpipport, tcpipport_ext);
}
bool RS::log(std::string value)
{
try {
auto redis = Redis(tcpipport);
redis.rpush("log", { value });
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::empty_pars() //清空内存pars
{
std::vector().swap(pars);//最简单的使用swap,清除元素并回收内存//pars.swap(std::vector());
return true;
}
bool RS::empty_db() //清空内存pars
{
try {
auto redis = Redis(tcpipport);
redis.command("flushall");//把M值也清除了
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::empty_m(const std::string mkey_pattern, std::string& report)
{
try {
auto redis = Redis(tcpipport);
// redis.command("flushall");//把M值也清除了
auto cursor = 0LL;
//auto mkey_pattern = "M*"; //只清除P*
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, mkey_pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
if (!keys.empty())
redis.del(keys.begin(), keys.end()); //清除P*
report = "{\"success\":true,\"message\":\"success\",\"code\":200}";
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
report = "{\"success\":false,\"message\":\"";
report += e.what();
report += "\",\"code\":500}";
return false;
}
return true;
}
bool RS::empty_p()
{
try {
auto redis = Redis(tcpipport);
// redis.command("flushall");//把M值也清除了
auto cursor = 0LL;
auto pattern = "P*"; //只清除P*
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
if(!keys.empty())
redis.del(keys.begin(), keys.end()); //清除P*
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
// CLog::rec(CPPFILE,e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_hash_all(const std::string pattern, std::initializer_listfields, std::vector> &valss) //从redis库中获取M表,用于管理
{
try {
auto redis = Redis(tcpipport);
// redis.command("select 0");
// redis.command("flushall");
auto cursor = 0LL;
//auto pattern = "M*";
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
std::vector line_vals;
std::vector line;
for (auto it = keys.begin(); it != keys.end(); ++it) {
std::vector().swap(line);//line.swap(vector());
std::vector().swap(line_vals);
redis.hmget(it->c_str(), fields, std::back_inserter(line_vals));
size_t len = line_vals.size();
for (size_t i = 0; i < len; i++) {
line.push_back(line_vals[i].value());
}
valss.push_back(line);
}
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::set_m(ITEM *itemp)
{
if (itemp == nullptr)
return false;
char itemkey[LEN_ITEM], itemval[LEN_ITEM];
try {
auto redis = Redis(tcpipport);
sprintf(itemkey, "M%02d%04d%02d%s", itemp->devno, itemp->modno, itemp->partno, itemp->key);
strcpy(itemp->mkey, itemkey); redis.hset(itemkey, "mkey", itemp->mkey);
sprintf(itemp->pkey, "P%02d%04d%02d%s", itemp->devno, itemp->modno, itemp->partno, itemp->key);
redis.hset(itemkey, "pkey", itemp->pkey);
sprintf(itemval, "%d", itemp->devno); redis.hset(itemkey, "devno", itemval); //redis.hset(itemkey, std::make_pair("devno", itemval));
sprintf(itemval, "%d", itemp->modno); redis.hset(itemkey, "modno", itemval);
sprintf(itemval, "%d", itemp->partno); redis.hset(itemkey, "partno", itemval);
redis.hset(itemkey, "key", itemp->key);
sprintf(itemval, "%d", itemp->ifvar); redis.hset(itemkey, "ifvar", itemval); //redis.hset(itemkey, std::make_pair("devno", itemval));
sprintf(itemval, "%d", itemp->datatype); redis.hset(itemkey, "datatype", itemval);
sprintf(itemval, "%d", itemp->datalen); redis.hset(itemkey, "datalen", itemval);
redis.hset(itemkey, "value", itemp->value);
redis.hset(itemkey, "valdef", itemp->valdef);
redis.hset(itemkey, "valall", itemp->valall);
redis.hset(itemkey, "style", itemp->style);
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::set_m_all(std::vector pars) //向redis库中设置所有参量表,用于管理
{
char itemkey[LEN_ITEM], itemval[LEN_ITEM];
try {
auto redis = Redis(tcpipport);
for (auto item : pars) {
sprintf(itemkey, "M%02d%04d%02d%s", item.devno, item.modno, item.partno, item.key);
strcpy(item.mkey, itemkey); redis.hset(itemkey, "mkey", item.mkey);
sprintf(item.pkey, "P%02d%04d%02d%s", item.devno, item.modno, item.partno, item.key);
redis.hset(itemkey, "pkey", item.pkey);
sprintf(itemval, "%d", item.devno); redis.hset(itemkey, "devno", itemval); //redis.hset(itemkey, std::make_pair("devno", itemval));
sprintf(itemval, "%d", item.modno); redis.hset(itemkey, "modno", itemval);
sprintf(itemval, "%d", item.partno); redis.hset(itemkey, "partno", itemval);
redis.hset(itemkey, "key", item.key);
sprintf(itemval, "%d", item.ifvar); redis.hset(itemkey, "ifvar", itemval);
sprintf(itemval, "%d", item.datatype); redis.hset(itemkey, "datatype", itemval);
sprintf(itemval, "%d", item.datalen); redis.hset(itemkey, "datalen", itemval);
redis.hset(itemkey, "value", item.value);
redis.hset(itemkey, "valdef", item.valdef);
redis.hset(itemkey, "valall", item.valall);
redis.hset(itemkey, "style", item.style);
}
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_p(std::string key, ITEM* item) //获取P参数
{
if (key.size()
return false;
try {
auto redis = Redis(tcpipport);
auto val = redis.get(key);
if (!val)
return false;
strcpy(item->value, (*val).c_str());
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_p(std::string key, int& intvalue) //获取p参数,填写到int的value
{
if (key.size()
return false;
try {
auto redis = Redis(tcpipport);
auto val = redis.get(key);
if (!val)
return false;
intvalue = atoi((*val).c_str());
return true;
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return false;
}
bool RS::get_p(const char* key, int& intvalue) //获取p参数,填写到int的value
{
if (strlen(key)
return false;
try {
auto redis = Redis(tcpipport);
auto val = redis.get(key);
if (!val)
return false;
intvalue = atoi((*val).c_str());
return true;
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return false;
}
bool RS::get_p(std::string key, std::string & strvalue) //获取p参数,填写到string的value
{
if (key.size()
return false;
try {
auto redis = Redis(tcpipport);
auto val = redis.get(key);
if (!val)
return false;
strvalue = *val;
return true;
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return false;
}
bool RS::get_p(const char* key, char* strvalue) //
{
if (strlen(key)
return false;
try {
auto redis = Redis(tcpipport);
auto val = redis.get(key);
if (!val)
return false;
strcpy(strvalue,(*val).c_str());
return true;
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return false;
}
bool RS::get_m(std::string key, ITEM& item) //获取M参数
{
if (key.size()
return false;
try{
auto redis = Redis(tcpipport);
// std::unordered_map m;
// m.clear();
// redis.hgetall(key, std::inserter(m, m.begin()));
// Get value only.
// NOTE: since field might NOT exist, so we need to parse it to OptionalString.
std::vector vals;
redis.hmget(key, { "mkey","pkey","devno","modno","partno","key","ifvar","datatype","datalen","value","valdef","valall","style" }, std::back_inserter(vals));
strcpy(item.mkey, vals[0].value().c_str());
strcpy(item.pkey, vals[1].value().c_str());
item.devno = atoi(vals[2].value().c_str());
item.modno = atoi(vals[3].value().c_str());
item.partno = atoi(vals[4].value().c_str());
strcpy(item.key, vals[5].value().c_str());
item.ifvar = atoi(vals[6].value().c_str());
item.datatype = atoi(vals[7].value().c_str());
item.datalen = atoi(vals[8].value().c_str());
strcpy(item.value, vals[9].value().c_str());
strcpy(item.valdef, vals[10].value().c_str());
strcpy(item.valall, vals[11].value().c_str());
strcpy(item.style, vals[12].value().c_str());
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_m(std::string key, std::string& itemstring) //获取m参数,填写整个item
{
if (key.size()
return false;
try {
auto redis = Redis(tcpipport);
// std::unordered_map m;
// m.clear();
// redis.hgetall(key, std::inserter(m, m.begin()));
// Get value only.
// NOTE: since field might NOT exist, so we need to parse it to OptionalString.
std::vector vals;
redis.hmget(key, { "mkey","pkey","devno","modno","partno","key","ifvar","datatype","datalen","value","valdef","valall","style" }, std::back_inserter(vals));
itemstring = "{";
itemstring += ("\"mkey\":\"" + vals[0].value() + "\",");
itemstring += ("\"pkey\":\"" + vals[1].value() + "\",");
itemstring += ("\"devno\":" + vals[2].value() + ",");
itemstring += ("\"modno\":" + vals[3].value() + ",");
itemstring += ("\"partno\":" + vals[4].value() + ",");
itemstring += ("\"key\":\"" + vals[5].value() + "\",");
itemstring += ("\"ifvar\":" + vals[6].value() + ",");
itemstring += ("\"datatype\":" + vals[7].value() + ",");
itemstring += ("\"datalen\":" + vals[8].value() + ",");
itemstring += ("\"value\":\"" + vals[9].value() + "\",");
itemstring += ("\"valdef\":\"" + vals[10].value() + "\",");
itemstring += ("\"valall\":\"" + vals[11].value() + "\",");
itemstring += ("\"style\":\"" + vals[12].value() + "\"");
itemstring += "}";
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_m_all(std::vector & pars) //从redis库中获取所有参量表,用于管理
{
//char itemkey[LEN_ITEM], itemval[LEN_ITEM];
try {
auto redis = Redis(tcpipport);
// redis.command("select 0");
// redis.command("flushall");
auto cursor = 0LL;
auto pattern = "M*";
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
ITEM item;
for (auto it = keys.begin(); it != keys.end(); ++it){
get_m(it->c_str(), item);
pars.push_back(item);
}
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_m_all(const std::string pattern, std::string& report) //从redis库中获取M表,用于管理
{
try {
auto redis = Redis(tcpipport);
// redis.command("select 0");
// redis.command("flushall");
auto cursor = 0LL;
//auto pattern = "M*";
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
//ITEM item;
std::string itemstring = "";
report = "[";
for (auto it = keys.begin(); it != keys.end(); ++it) {
get_m(it->c_str(), itemstring);//
//pars.push_back(item);
report += (itemstring + ",");
}
if(report.length()!=1)
report.pop_back();
report += "]";
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_chn(std::string key, std::string& itemstring) //获取m参数,填写整个item
{
try {
auto redis = Redis(tcpipport);
// std::unordered_map m;
// m.clear();
// redis.hgetall(key, std::inserter(m, m.begin()));
// Get value only.
// NOTE: since field might NOT exist, so we need to parse it to OptionalString.
std::vector vals;
//const char* name, const int type, const bool issvr, const char* addr, const int port, const int timeout, const int speed, const bool openkeep, const bool byrecv, const bool connected, const bool flag_task_run, const time_t recvtime, const int cmdid, const int tasknum, const int cur
redis.hmget(key, { "name","type","issvr","addr","port","timeout","speed","openkeep","byrecv","connected","flag_task_run","recvtime","cmdid","tasknum","cur" }, std::back_inserter(vals));
itemstring = "{";
itemstring += ("\"name\":\"" + vals[0].value() + "\",");
itemstring += ("\"type\":" + vals[1].value() + ",");
itemstring += ("\"issvr\":" + vals[2].value() + ",");
itemstring += ("\"addr\":\"" + vals[3].value() + "\",");
itemstring += ("\"port\":" + vals[4].value() + ",");
itemstring += ("\"timeout\":" + vals[5].value() + ",");
itemstring += ("\"speed\":" + vals[6].value() + ",");
itemstring += ("\"openkeep\":" + vals[7].value() + ",");
itemstring += ("\"byrecv\":" + vals[8].value() + ",");
itemstring += ("\"connected\":" + vals[9].value() + ",");
itemstring += ("\"flag_task_run\":" + vals[10].value() + ",");
itemstring += ("\"recvtime\":" + vals[11].value() + ",");
itemstring += ("\"cmdid\":" + vals[12].value() + ",");
itemstring += ("\"tasknum\":" + vals[13].value() + ",");
itemstring += ("\"cur\":" + vals[14].value() + "");
itemstring += "}";
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_chn_all(const std::string pattern, std::string& report) //从redis库中获取M表,用于管理
{
try {
auto redis = Redis(tcpipport);
// redis.command("select 0");
// redis.command("flushall");
auto cursor = 0LL;
//auto pattern = "M*";
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
//ITEM item;
std::string itemstring = "";
report = "[";
for (auto it = keys.begin(); it != keys.end(); ++it) {
get_chn(it->c_str(), itemstring);//
//pars.push_back(item);
report += (itemstring + ",");
}
if (report.length() != 1)
report.pop_back();
report += "]";
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_pro(std::string key, std::string& itemstring) //获取m参数,填写整个item
{
try {
auto redis = Redis(tcpipport);
// std::unordered_map m;
// m.clear();
// redis.hgetall(key, std::inserter(m, m.begin()));
// Get value only.
// NOTE: since field might NOT exist, so we need to parse it to OptionalString.
std::vector vals;
//const char* name, const jlong id, const int type, const char* sendbuf, const int sendbuflen_must, const int sendbuflen_act, const int sendtime, const char* recvbuf, const int recvbuflen_must, const int recvbuflen_act, const int recvtime, const char* ecpttext, const int status
redis.hmget(key, { "name","id","type","chn","sendbuf","sendbuflen_must","sendbuflen_act","sendtime","recvbuf","recvbuflen_must","recvbuflen_act","recvtime","ecpttext","status" }, std::back_inserter(vals));
itemstring = "{";
itemstring += ("\"name\":\"" + vals[0].value() + "\",");
itemstring += ("\"id\":" + vals[1].value() + ",");
itemstring += ("\"type\":" + vals[2].value() + ",");
itemstring += ("\"chn\":\"" + vals[3].value() + "\",");
itemstring += ("\"sendbuf\":\"" + vals[4].value() + "\",");
itemstring += ("\"sendbuflen_must\":" + vals[5].value() + ",");
itemstring += ("\"sendbuflen_act\":" + vals[6].value() + ",");
itemstring += ("\"sendtime\":" + vals[7].value() + ",");
itemstring += ("\"recvbuf\":\"" + vals[8].value() + "\",");
itemstring += ("\"recvbuflen_must\":" + vals[9].value() + ",");
itemstring += ("\"recvbuflen_act\":" + vals[10].value() + ",");
itemstring += ("\"recvtime\":" + vals[11].value() + ",");
itemstring += ("\"ecpttext\":\"" + vals[12].value() + "\",");
itemstring += ("\"status\":" + vals[13].value() + "");
itemstring += "}";
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_pro_all(const std::string pattern, std::string& report) //从redis库中获取M表,用于管理
{
try {
auto redis = Redis(tcpipport);
// redis.command("select 0");
// redis.command("flushall");
auto cursor = 0LL;
//auto pattern = "M*";
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
//ITEM item;
std::string itemstring = "";
report = "[";
for (auto it = keys.begin(); it != keys.end(); ++it) {
get_pro(it->c_str(), itemstring);//
//pars.push_back(item);
report += (itemstring + ",");
}
if (report.length() != 1)
report.pop_back();
report += "]";
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::set_p(const std::string key, const std::string value, std::string excepcontent) //向redis库中设置P表,用于监控和操作
{
try {
auto redis = Redis(tcpipport);
//itemkey=myprintf("P%02d%04d%02d%s", item.devno, item.modno, item.partno, item.keyname);
redis.set(key, value);
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
excepcontent = e.what();
return false;
}
return true;
}
/// std::vector> kvs1 = {{"k1", "v1"}, {"k2", "v2"}};
/// redis.mset(kvs1.begin(), kvs1.end());
/// std::unordered_map kvs2 = {{"k3", "v3"}, {"k4", "v4"}};
/// redis.mset(kvs2.begin(), kvs2.end());
///
bool RS::set_p_kvs(std::vector> pars)
{
try {
auto redis = Redis(tcpipport);
redis.mset(pars.begin(), pars.end());
//itemkey=myprintf("P%02d%04d%02d%s", item.devno, item.modno, item.partno, item.keyname);
//redis.set(key, value);
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
//excepcontent = e.what();
return false;
}
return true;
}
bool RS::set_p_all(std::vector pars) //向redis库中设置P表,用于监控和操作
{
// redis.command("flushall");//把P值也清除了
empty_p();
char itemkey[LEN_ITEM];
try {
auto redis = Redis(tcpipport);
for (auto item : pars) {
//itemkey=myprintf("P%02d%04d%02d%s", item.devno, item.modno, item.partno, item.keyname);
sprintf(itemkey, "P%02d%04d%02d%s", item.devno, item.modno, item.partno, item.key);
redis.set(itemkey, item.value);
}
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
ITEM* getitem(std::vector pars, std::string key)
{
for (auto item : pars)
if (key == item.mkey )
return &item;
return nullptr;
// std::vector::iterator it = std::find_if(pars.begin(), pars.end(), ((ITEM)(*it)).mkey==key);
// if (it == pars.end())
// return nullptr;
// else
// return &(*it);
}
bool RS::get_p_all(std::vector& pars) //
{
//std::vector().swap(pars);//最简单的使用swap,清除元素并回收内存//pars.swap(std::vector());
try {
auto redis = Redis(tcpipport);
// redis.command("select 0");
// redis.command("flushall");
auto cursor = 0LL;
auto pattern = "P*";
auto count = 5;
std::unordered_set keys;
while (true) {
cursor = redis.scan(cursor, pattern, count, std::inserter(keys, keys.begin()));
// Default pattern is "*", and default count is 10
// cursor = redis.scan(cursor, std::inserter(keys, keys.begin()));
if (cursor == 0) {
break;
}
}
ITEM* pitem = nullptr;
for (auto it = keys.begin(); it != keys.end(); ++it) {
if((pitem = getitem(pars,it->c_str()))!=nullptr)
get_p(it->c_str(), pitem);
}
}
catch (const sw::redis::Error& e) {// Error handling.
//RS::log(e.what());
//AfxMessageBox(e.what());
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::get_p_keys(std::map &maps) {
if(maps.size()>0)
try {
auto redis = Redis(tcpipport);
auto tx = redis.transaction();
std::vector keys;
std::map::iterator iter;
for (iter = maps.begin(); iter != maps.end(); iter++)
keys.push_back(iter->first);
std::vector vals;
redis.mget(keys.begin(), keys.end(), std::back_inserter(vals));
iter = maps.begin();
for (const auto &val : vals) {
if (val)
iter->second = *val;// std::cout
else
iter->second = ""; //std::cout
iter++;
}
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
//name,type,issvr,addr,port,timeout,speed,openkeep,byrecv,connected,flag_task_run, recvtime, cmdid,tasknum,cur
bool RS::set_chn(const char* name, const int type, const bool issvr, const char* addr, const int port, const int timeout, const int speed, const bool openkeep, const bool byrecv, const bool connected, const bool flag_task_run, const time_t recvtime, const int cmdid, const int tasknum, const int cur)
{
char itemkey[LEN_ITEM], itemval[LEN_ITEM];
try {
auto redis = Redis(tcpipport);
sprintf(itemkey, "chn%s",name);
redis.hset(itemkey, "name", name);
sprintf(itemval, "%d", type); redis.hset(itemkey, "type", itemval);
sprintf(itemval, "%d", issvr); redis.hset(itemkey, "issvr", itemval);
redis.hset(itemkey, "addr", addr);
sprintf(itemval, "%d", port); redis.hset(itemkey, "port", itemval);
sprintf(itemval, "%d", timeout); redis.hset(itemkey, "timeout", itemval);
sprintf(itemval, "%d", speed); redis.hset(itemkey, "speed", itemval);
sprintf(itemval, "%d", openkeep); redis.hset(itemkey, "openkeep", itemval);
sprintf(itemval, "%d", byrecv); redis.hset(itemkey, "byrecv", itemval);
sprintf(itemval, "%d", connected); redis.hset(itemkey, "connected", itemval);
sprintf(itemval, "%d", flag_task_run); redis.hset(itemkey, "flag_task_run", itemval);
#ifdef _MSC_VER
sprintf(itemval, "%I64d", recvtime); redis.hset(itemkey, "recvtime", itemval);
#else
sprintf(itemval, "%lld", recvtime); redis.hset(itemkey, "recvtime", itemval);
#endif
sprintf(itemval, "%d", cmdid); redis.hset(itemkey, "cmdid", itemval);
sprintf(itemval, "%d", tasknum); redis.hset(itemkey, "tasknum", itemval);
sprintf(itemval, "%d", cur); redis.hset(itemkey, "cur", itemval);
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
bool RS::set_pro(const char* name, const jlong id, const int type, const char * chn,const char* sendbuf, const int sendbuflen_must, const int sendbuflen_act, const int sendtime,
const char* recvbuf, const int recvbuflen_must, const int recvbuflen_act, const int recvtime, const char* ecpttext, const int status)
{
char itemkey[LEN_ITEM], itemval[LEN_ITEM];
try {
auto redis = Redis(tcpipport);
sprintf(itemkey, "pro%s", name);
redis.hset(itemkey, "name", name);
#ifdef _MSC_VER
sprintf(itemval, "%I64d", id); redis.hset(itemkey, "id", itemval);
#else
sprintf(itemval, "%lld", id); redis.hset(itemkey, "id", itemval);
#endif
sprintf(itemval, "%d", type); redis.hset(itemkey, "type", itemval);
redis.hset(itemkey, "chn", chn);
redis.hset(itemkey, "sendbuf", sendbuf);
sprintf(itemval, "%d", sendbuflen_must); redis.hset(itemkey, "sendbuflen_must", itemval);
sprintf(itemval, "%d", sendbuflen_act); redis.hset(itemkey, "sendbuflen_act", itemval);
sprintf(itemval, "%d", sendtime * 1); redis.hset(itemkey, "sendtime", itemval);
redis.hset(itemkey, "recvbuf", recvbuf);
sprintf(itemval, "%d", recvbuflen_must); redis.hset(itemkey, "recvbuflen_must", itemval);
sprintf(itemval, "%d", recvbuflen_act); redis.hset(itemkey, "recvbuflen_act", itemval);
sprintf(itemval, "%d", recvtime * 1); redis.hset(itemkey, "recvtime", itemval);
redis.hset(itemkey, "ecpttext", ecpttext);
sprintf(itemval, "%d", status); redis.hset(itemkey, "status", itemval);
}
catch (const sw::redis::Error& e) {// Error handling.
CLog::rec(CPPFILE, e.what());
return false;
}
return true;
}
//bool RS::getmodpar(std::string mod, std::string item, int defval, std::string path)
//{
// //从 redis 获取分类配置的int值,如果没有,则新增并设置缺省值
// if(true)
// return true;
// return false;
//};
//
//bool RS::getp(const int devno, const int modno, const int partno, const char* item, char *val)//获取参数
//{
// //获取类型,返回
// return true;
//}
//
int RS::init()
{
// empty_db();
// empty_m();
// set_m_all(pars);
//
empty_pars();
get_m_all(pars);
//
set_p_all(pars);
//
// empty_p();
// get_p_all(pars);
return 0;
}
static int basedemo()//int argc, char** argv
{
try {
// Create an Redis object, which is movable but NOT copyable.
auto redis = Redis(RS::tcpipport);
// ***** STRING commands *****
redis.set("key", "val");
auto val = redis.get("key"); // val is of type OptionalString. See 'API Reference' section for details.
if (val) {
// Dereference val to get the returned value of std::string type.
std::cout
} // else key doesn't exist.
// ***** LIST commands *****
// std::vector to Redis LIST.
std::vector vec = { "a", "b", "c" };
redis.rpush("list", vec.begin(), vec.end());
// std::initializer_list to Redis LIST.
redis.rpush("list", { "a", "b", "c" });
// Redis LIST to std::vector.
vec.clear();
redis.lrange("list", 0, -1, std::back_inserter(vec));
// ***** HASH commands *****
redis.hset("hash", "field", "val");
// Another way to do the same job.
redis.hset("hash", std::make_pair("field", "val"));
// std::unordered_map to Redis HASH.
std::unordered_map m = {
{"field1", "val1"},
{"field2", "val2"}
};
redis.hmset("hash", m.begin(), m.end());
// Redis HASH to std::unordered_map.
m.clear();
redis.hgetall("hash", std::inserter(m, m.begin()));
// Get value only.
// NOTE: since field might NOT exist, so we need to parse it to OptionalString.
std::vector vals;
redis.hmget("hash", { "field1", "field2" }, std::back_inserter(vals));
// ***** SET commands *****
redis.sadd("set", "m1");
// std::unordered_set to Redis SET.
std::unordered_set set = { "m2", "m3" };
redis.sadd("set", set.begin(), set.end());
// std::initializer_list to Redis SET.
redis.sadd("set", { "m2", "m3" });
// Redis SET to std::unordered_set.
set.clear();
redis.smembers("set", std::inserter(set, set.begin()));
if (redis.sismember("set", "m1")) {
std::cout
} // else NOT exist.
// ***** SORTED SET commands *****
redis.zadd("sorted_set", "m1", 1.3);
// std::unordered_map to Redis SORTED SET.
std::unordered_map scores = {
{"m2", 2.3},
{"m3", 4.5}
};
redis.zadd("sorted_set", scores.begin(), scores.end());
// Redis SORTED SET to std::unordered_map.
scores.clear();
redis.zrangebyscore("sorted_set",
UnboundedInterval{}, // (-inf, +inf)
std::inserter(scores, scores.begin()));
// Only get member names:
// pass an inserter of std::vector type as output parameter.
std::vector without_score;
redis.zrangebyscore("sorted_set",
BoundedInterval(1.5, 3.4, BoundType::CLOSED), // [1.5, 3.4]
std::back_inserter(without_score));
// Get both member names and scores:
// pass an inserter of std::unordered_map as output parameter.
std::unordered_map with_score;
redis.zrangebyscore("sorted_set",
BoundedInterval(1.5, 3.4, BoundType::LEFT_OPEN), // (1.5, 3.4]
std::inserter(with_score, with_score.end()));
// ***** SCRIPTING commands *****
// Script returns a single element.
auto num = redis.eval("return 1", {}, {});
// Script returns an array of elements.
std::vector nums;
redis.eval("return {ARGV[1], ARGV[2]}", {}, { "1", "2" }, std::back_inserter(nums));
// ***** Pipeline *****
// Create a pipeline.
auto pipe = redis.pipeline();
// Send mulitple commands and get all replies.
auto pipe_replies = pipe.set("key", "value")
.get("key")
.rename("key", "new-key")
.rpush("list", { "a", "b", "c" })
.lrange("list", 0, -1)
.exec();
// Parse reply with reply type and index.
auto set_cmd_result = pipe_replies.get(0);
auto get_cmd_result = pipe_replies.get(1);
// rename command result
pipe_replies.get(2);
auto rpush_cmd_result = pipe_replies.get(3);
std::vector lrange_cmd_result;
pipe_replies.get(4, back_inserter(lrange_cmd_result));
// ***** Transaction *****
// Create a transaction.
auto tx = redis.transaction();
// Run multiple commands in a transaction, and get all replies.
auto tx_replies = tx.incr("num0")
.incr("num1")
.mget({ "num0", "num1" })
.exec();
// Parse reply with reply type and index.
auto incr_result0 = tx_replies.get(0);
auto incr_result1 = tx_replies.get(1);
std::vector mget_cmd_result;
tx_replies.get(2, back_inserter(mget_cmd_result));
// ***** Generic Command Interface *****
// There's no *Redis::client_getname* interface.
// But you can use *Redis::command* to get the client name.
val = redis.command("client", "getname");
if (val) {
std::cout
}
// Same as above.
auto getname_cmd_str = { "client", "getname" };
val = redis.command(getname_cmd_str.begin(), getname_cmd_str.end());
// There's no *Redis::sort* interface.
// But you can use *Redis::command* to send sort the list.
std::vector sorted_list;
redis.command("sort", "list", "ALPHA", std::back_inserter(sorted_list));
// Another *Redis::command* to do the same work.
auto sort_cmd_str = { "sort", "list", "ALPHA" };
redis.command(sort_cmd_str.begin(), sort_cmd_str.end(), std::back_inserter(sorted_list));
// ***** Redis Cluster *****
// Create a RedisCluster object, which is movable but NOT copyable.
auto redis_cluster = RedisCluster("tcp://192.168.137.100:7000");
// RedisCluster has similar interfaces as Redis.
redis_cluster.set("key", "value");
val = redis_cluster.get("key");
if (val) {
std::cout
} // else key doesn't exist.
// Keys with hash-tag.
redis_cluster.set("key{tag}1", "val1");
redis_cluster.set("key{tag}2", "val2");
redis_cluster.set("key{tag}3", "val3");
std::vector hash_tag_res;
redis_cluster.mget({ "key{tag}1", "key{tag}2", "key{tag}3" },
std::back_inserter(hash_tag_res));
}
catch (const sw::redis::Error& e) {
// Error handling.
CLog::rec(CPPFILE, e.what());
}
return 0;
}
int redispp_main_test()
{
try {
Redis redis = Redis(RS::tcpipport);
redis.set("key", "Test redis-cplus-cplus");
OptionalString val = redis.get("key");
if (val) {
std::cout
}
basedemo();
}
catch (const sw::redis::Error& e ) {
CLog::rec(CPPFILE, e.what());
}
return 0;
}