C++连接redis

redis是很好机遇key-value的缓存数据库,但是一直缺乏一个好的C++调用接口,官方有个hiredis的C接口,但是只能在linux下用

这里简单介绍了一个开源的基于C++11和boos::asio的跨平台redis接口,可以实现C++操作redis,本文在windows环境下使用的,linux同理


来源

github地址:https://github.com/nekipelov/redisclient


使用


1,安装好redis,开启redis server

2,代码下载下来之后,目录结构如下

其中:
  • src目录里面就是所有用到的api,基于boost::asio写的,可以跨平台调用
  • examples里面是一些跟redis连接的例子
  • tests里面有单元测试的例子
3,创建demo工程
将src目录拷贝到demo工程目录,并配置好boost库

编写同步和异步两种方式的应用实例
[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <string>  
  3. #include <vector>  
  4. #include <functional>  
  5. #include "boost/asio/io_service.hpp"  
  6. #include "boost/asio/ip/address.hpp"  
  7. #include "redisclient/redissyncclient.h"  
  8. #include "redisclient/redisasyncclient.h"  
  9.   
  10. // 设置redis服务器的ip和port  
  11. const boost::asio::ip::address server_address = boost::asio::ip::address::from_string("127.0.0.1");  
  12. const unsigned short server_port = 6379;  
  13.   
  14. // 同步方式连接操作  
  15. void handleRedisSyncClient(  
  16.     boost::asio::io_service &io_service,  
  17.     boost::asio::ip::address address,  
  18.     unsigned short port)  
  19. {  
  20.     // 定义redisclient  
  21.     redisclient::RedisSyncClient redis(io_service);  
  22.     std::string errmsg;  
  23.   
  24.     if (!redis.connect(address, port, errmsg))  
  25.         std::cerr << "Can't connect to redis: " << errmsg << std::endl;  
  26.   
  27.     redisclient::RedisValue result;  
  28.   
  29.     // 执行redis命令  
  30.     //result = redis.command("lpush", {"list", "value1"});  
  31.     //result = redis.command("lpush", {"list", "value2"});  
  32.   
  33.     //if (result.isError())  
  34.     //  std::cerr << "error: " << result.toString() << "\n";  
  35.   
  36.     result = redis.command("lrange", {"list""0""1"});  
  37.   
  38.     if (result.isOk())  
  39.         std::cout << result.toString() << "\n";  
  40.     else  
  41.         std::cerr << "error: " << result.toString() << "\n";  
  42. }  
  43.   
  44. // 异步方式连接操作  
  45. void handleRedisAsycClient(  
  46.     boost::asio::io_service &ioService,   
  47.     redisclient::RedisAsyncClient &redis_client,  
  48.     std::string &key,  
  49.     std::string &value,  
  50.     bool ok,   
  51.     const std::string &errmsg)  
  52. {  
  53.     if (ok)  
  54.     {  
  55.         // 发送指令  
  56.         redis_client.command("set", {key, value}, [&](const redisclient::RedisValue &v) {  
  57.             std::cout << "set: " << v.toString() << std::endl;  
  58.               
  59.             // 获得回调,再调用指令  
  60.             redis_client.command("get", {key}, [&](const redisclient::RedisValue &v) {  
  61.                 std::cerr << "get: " << v.toString() << std::endl;  
  62.   
  63.                   
  64.                 /*redis_client.command("del", {key}, [&](const redisclient::RedisValue &) { 
  65.                     ioService.stop(); 
  66.                 });*/  
  67.             });  
  68.         });  
  69.     }  
  70.     else  
  71.     {  
  72.         std::cerr << "Can't connect to redis: " << errmsg << std::endl;  
  73.     }  
  74. }  
  75.   
  76. int main(int argc, char **argv)  
  77. {  
  78.     boost::asio::io_service ioService;  
  79.   
  80.     // 1,同步  
  81.     //handleRedisSyncClient(ioService, server_address, server_port);  
  82.       
  83.     // 2,异步  
  84.     redisclient::RedisAsyncClient redis_client(ioService);  
  85.     std::string mykey = "age";  
  86.     std::string myvalue = "23";  
  87.     redis_client.asyncConnect(server_address, server_port,  
  88.         std::bind(  
  89.             &handleRedisAsycClient,  
  90.             std::ref(ioService),   
  91.             std::ref(redis_client),  
  92.             std::ref(mykey),  
  93.             std::ref(myvalue),  
  94.             std::placeholders::_1,  
  95.             std::placeholders::_2));  
  96.     ioService.run();  
  97.   
  98.     getchar();  
  99.     return 0;  
  100. }  

4,通过redis可视化工具可以看到结果


其中,redis的命令可以通过函数参数传入,命令返回的结果如果需要可以通过字符串分割的方式存储



 转载  https://blog.csdn.net/u012234115/article/details/69887098

猜你喜欢

转载自blog.csdn.net/larry_zeng1/article/details/80448231
今日推荐