<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
之前給公司作閘道器,一直想找個牛逼點的C++ 的 或者 C的 redis連線庫。 結果很多都不近人意。
常見的是:hiredis 和hirredisvip
hiredis 和hirredisvip 都是最基礎的。也沒封裝什麼連線池啊,自動重連啊,那些東西。適合簡單的場景。或者你自己手藝好,能自己封裝一層好的介面。
後來嘗試:cloredis
最後發現:redisplus plus
直到有一天我問同事,他們給我看redis官網推薦的C++的連線庫,有好多庫。好幾頁。而平時看的redis中文網推薦的才幾個。艾瑪。耽誤事兒啊。
然後我接觸了redisplus plus (redis++)。感覺蠻給力的玩意。
https://github.com/sewenew/redis-plus-plus
詳細的資訊可以看他們網站裡的介紹。我這裡只貼一段程式碼。
#include <unistd.h> #include <chrono> #include <tuple> #include <iostream> #include <vector> #include <map> #include <unordered_set> #include <sw/redis++/redis++.h> #include <sw/redis++/sentinel.h> #include <sw/redis++/connection.h> #include <sw/redis++/connection_pool.h> //using namespace std; using namespace sw::redis; using namespace std::chrono; int main() { ConnectionOptions connection_options; connection_options.host = "192.168.11.85"; // Required. connection_options.port = 16379; // Optional. The default port is 6379. //connection_options.password = "auth"; // Optional. No password by default. connection_options.db = 5; // Optional. Use the 0th database by default. ConnectionPoolOptions pool_options; pool_options.size = 3; // Pool size, i.e. max number of connections. pool_options.wait_timeout = std::chrono::milliseconds(100); ConnectionOptions connection_options2; connection_options2.host = "192.168.11.85"; connection_options2.port = 16379; connection_options2.db = 7; ConnectionPoolOptions pool_options7; pool_options7.size = 3; pool_options7.wait_timeout = std::chrono::milliseconds(100); Redis * redisofDB1 = NULL; Redis * redisofDB7 = NULL; // 開始連線 try{ redisofDB1 = new Redis(connection_options, pool_options); redisofDB7 = new Redis(connection_options2, pool_options7); }catch (const ReplyError &err) { printf("RedisHandler-- ReplyError:%s n",err.what()); return false ; }catch (const TimeoutError &err) { printf("RedisHandler-- TimeoutError%s n",err.what()); return false ; }catch (const ClosedError &err) { printf("RedisHandler-- ClosedError%s n",err.what()); return false ; }catch (const IoError &err) { printf("RedisHandler-- IoError%s n",err.what()); return false ; }catch (const Error &err) { printf("RedisHandler-- other%s n",err.what()); return false ; } /* std::map<std::string, std::string> hashTerm; redisofDB7->hgetall("FORWARD.PLAT.DETAIL",std::inserter(hashTerm, hashTerm.end())); for(auto it1 = hashTerm.begin() ;it1 != hashTerm.end(); it1++) { std::cout <<"Plat ID:" <<it1->first <<std::endl; std::cout << "Plat UserName & Password"<<it1->second <<std::endl; } */ // 開始幹活 auto cursor = 0LL; auto pattern = "*"; auto count = 5; //std::unordered_set<std::string> keys; std::map<std::string, std::string> hashs; while (true) { cursor = redisofDB7->hscan("FORWARD.PLAT.DETAIL",cursor, pattern, count, std::inserter(hashs, hashs.begin())); if (cursor == 0) { break; } } if(hashs.size() < 1) { printf("we get nothing !n"); } for(auto it1 = hashs.begin() ;it1 != hashs.end(); it1++) { std::cout <<"Plat ID:" <<it1->first <<std::endl; std::cout << "Plat UserName & Password"<<it1->second <<std::endl; } OptionalString strValue = redisofDB1->hget("XNY.CARINFO","CRC01211711100232"); std::cout<< " CRC01211711100232 的 vin :" << *strValue << std::endl; std::string straa = *strValue; if(straa.empty()) { std::cout << "we gete nothing " << std::endl ; } std::cout<< " ---- CRC01211711100232 的 details :" << straa << std::endl; std::cout<< " ---- 下面試試hincrby ---- " << std::endl; auto cursor2 = 0LL; auto pattern2 ="*"; auto count2 = 20; std::map<std::string, std::string> vv; std::vector<std::string> vlist; while (true) { cursor2 = redisofDB7->hscan("FORWARD.LIST.002",cursor2, pattern2, count2, std::inserter(vv, vv.begin())); if (cursor2 == 0) { break; } } for(auto it1 = vv.begin() ;it1 != vv.end(); it1++) { vlist.push_back(it1->first); } for(auto uu = vlist.begin(); uu !=vlist.end(); uu ++ ) { std::cout << *uu << std::endl; } return 0; }
#include <unistd.h> #include <chrono> #include <tuple> #include <iostream> #include <vector> #include <map> #include <sw/redis++/redis++.h> #include <sw/redis++/sentinel.h> #include <sw/redis++/connection.h> #include <sw/redis++/connection_pool.h> //using namespace std; using namespace sw::redis; int main() { SentinelOptions sentinel_opts; // sentinel_opts.nodes = {{"127.0.0.1", 9000}, // {"127.0.0.1", 9001}, // {"127.0.0.1", 9002}}; // Required. List of Redis Sentinel nodes. sentinel_opts.nodes = {{"192.168.127.134", 26379}};// Required. List of Redis Sentinel nodes. // Optional. Timeout before we successfully connect to Redis Sentinel. // By default, the timeout is 100ms. sentinel_opts.connect_timeout = std::chrono::milliseconds(200); // Optional. Timeout before we successfully send request to or receive response from Redis Sentinel. // By default, the timeout is 100ms. sentinel_opts.socket_timeout = std::chrono::milliseconds(200); auto sentinel = std::make_shared<Sentinel>(sentinel_opts); ConnectionOptions connection_opts; //connection_opts.password = "auth"; // Optional. No password by default. connection_opts.db = 1; connection_opts.connect_timeout = std::chrono::milliseconds(100); // Required. connection_opts.socket_timeout = std::chrono::milliseconds(100); // Required. ConnectionPoolOptions pool_opts; pool_opts.size = 3; // Optional. The default size is 1. auto redis = Redis(sentinel, "mymaster", Role::MASTER, connection_opts, pool_opts); Redis* p = &redis; std::map<std::string, std::string> hash; p->hgetall("PLATINFO",std::inserter(hash, hash.end())); for(auto it = hash.begin() ;it != hash.end(); it++) { std::cout <<"Plat ID:" <<it->first <<std::endl; std::cout << "Plat UserName & Password"<<it->second <<std::endl; } ConnectionOptions connection_opts2; //connection_opts.password = "auth"; // Optional. No password by default. connection_opts2.db = 2; connection_opts2.connect_timeout = std::chrono::milliseconds(100); // Required. connection_opts2.socket_timeout = std::chrono::milliseconds(100); // Required. auto redisDB2 = Redis(sentinel, "mymaster", Role::MASTER, connection_opts2, pool_opts); Redis*pp = &redisDB2; std::map<std::string, std::string> hashTerm; pp->hgetall("TERMINAL:LIST:test123456789012",std::inserter(hashTerm, hashTerm.end())); for(auto it1 = hashTerm.begin() ;it1 != hashTerm.end(); it1++) { std::cout <<"Plat ID:" <<it1->first <<std::endl; std::cout << "Plat UserName & Password"<<it1->second <<std::endl; } // 是否存在 bool bb = p->hexists("PLATINFO","test123456789012"); std::cout << "PLATINFO 裡 存在 test123456789012:" << bb << std::endl; // hget - 注意這裡,OptionalString 是大部分查詢命令的返回值型別,要想轉為string 需要加* OptionalString strValue = p->hget("PLATINFO","test1234567890123"); std::cout<< " test123456789012 的 details :" << *strValue << std::endl; std::string straa = *strValue; if(straa.empty()) { std::cout << "we gete nothing " << std::endl ; } std::cout<< " ---- test123456789012 的 details :" << straa << std::endl; // 測試hkeys std::vector<std::string> vPaltIDs; p->hkeys("PLATINFO",std::inserter(vPaltIDs, vPaltIDs.end())); for(auto vIter = vPaltIDs.begin();vIter != vPaltIDs.end(); vIter ++) { std::cout << *vIter << std::endl; } return 0; } //g++ -std=c++11 -I/usr/local/include -L/usr/local/lib -Wl,-rpath=../libc++ -o app testRedisSentinel.cpp -lredis++ -lhiredis -pthread //
#include <unistd.h> #include <chrono> #include <tuple> #include <iostream> #include <vector> #include <map> #include <unordered_set> #include <sw/redis++/redis++.h> #include <sw/redis++/sentinel.h> #include <sw/redis++/connection.h> #include <sw/redis++/connection_pool.h> //using namespace std; using namespace sw::redis; using namespace std::chrono; int main() { ConnectionOptions connection_options; connection_options.host = "192.168.11.124"; // Required. connection_options.port = 7001; // Optional. The default port is 6379. //connection_options.password = "auth"; // Optional. No password by default. connection_options.db = 0; // Optional. Use the 0th database by default. ConnectionPoolOptions pool_options; pool_options.size = 5; // Pool size, i.e. max number of connections. pool_options.wait_timeout = std::chrono::milliseconds(100); RedisCluster* redisofDB1 = NULL; try{ redisofDB1 = new RedisCluster(connection_options, pool_options); }catch (const ReplyError &err) { printf("RedisHandler-- ReplyError:%s n",err.what()); return false ; }catch (const TimeoutError &err) { printf("RedisHandler-- TimeoutError%s n",err.what()); return false ; }catch (const ClosedError &err) { printf("RedisHandler-- ClosedError%s n",err.what()); return false ; }catch (const IoError &err) { printf("RedisHandler-- IoError%s n",err.what()); return false ; }catch (const Error &err) { printf("RedisHandler-- other%s n",err.what()); return false ; } // 連線成功- 下面開始幹活兒。 printf("-----連線成功,下面開始幹活兒-----n"); #if 1 //1.先測試一個gethall 用hscan代替得吧 auto cursor = 0LL; auto pattern = "*"; auto count = 5; //std::unordered_set<std::string> keys; std::map<std::string, std::string> hashs; while (true) { cursor = redisofDB1->hscan("farm:status:NJTEST0000000005_20200702132812",cursor, pattern, count, std::inserter(hashs, hashs.begin())); if (cursor == 0) { break; } } if(hashs.size() < 1) { printf("we get nothing !n"); } std::cout << "the hashs.size = " << hashs.size() << std::endl; for(auto it1 = hashs.begin() ;it1 != hashs.end(); it1++) { std::cout <<"key:" <<it1->first << "Value:"<<it1->second <<std::endl; } #endif #if 0 // 2.測試hsetnx std::cout << "------------------------測試hsetnx---------------------------" << std::endl; std::string strValue = "SUBMIT$2$TES21129BH2000001$UPDATE$TIME:20200818163607,TYPE:3,VALUE:MjIzLjIyMy4xODcuMzUsMTA1MCxmdGFkbWluLGZ0YWRtaW44MTY0NSxINENfVjEuMy4zN18yMDIwMDgxN19hNDdhLmJpbiww,MODEL:2"; //std::string strfeild = "1597739777"; bool vBol = redisofDB1->hsetnx("farm:command:TES21129BH2000001", std::to_string(1597739778), strValue); std::cout << "hsetnx wanbi : " << vBol << std::endl; //3.測試hdel bool vBol2 = redisofDB1->hdel("farm:command:TES21129BH2000001", strfeild); std::cout << "hdel wanbi : " << vBol2 << std::endl; //4.測試del bool vBol3 = redisofDB1->del("farm:command:NJTEST0000000009"); std::cout << "del wanbi : " << vBol3 << std::endl; //5.hlen long long llen = redisofDB1->hlen("farm:status:TST1010191210110_20200701114501"); std::cout<< "the len is :" << llen << std::endl; //6.測試hset bool bbb = redisofDB1->hset("farm:clientnum","WUZ11010BC100009","009"); std::cout << "hset finished is :" << bbb << std::endl; //7.測試expire redisofDB1->expire("farm:status:NJTEST0000000005_20200624135512",60); #endif return 0; }
到此這篇關於redis++的編譯 安裝 使用方案的文章就介紹到這了,更多相關redis++的使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45