redis_handler.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * @Description:
  3. * @Version: 1.0
  4. * @Autor: zhuyijun
  5. * @Date: 2021-11-17 09:36:12
  6. * @LastEditTime: 2021-11-17 09:36:12
  7. */
  8. #include "redis_handler.h"
  9. #include <cstring>
  10. #include <iostream>
  11. #include <string>
  12. using namespace std;
  13. RedisHandler::RedisHandler() {
  14. m_addr = "";
  15. m_port = 0;
  16. m_pwd = "";
  17. pm_rct = NULL;
  18. pm_rr = NULL;
  19. error_msg = "";
  20. }
  21. RedisHandler::~RedisHandler() {
  22. disConnect();
  23. pm_rct = NULL;
  24. pm_rr = NULL;
  25. }
  26. /*
  27. 连接redis数据库
  28. addr: 地址,port:端口号,pwd:密码
  29. 成功返回M_REDIS_OK,失败返回M_CONNECT_FAIL
  30. */
  31. int RedisHandler::connect(const string &addr = "127.0.0.1", int port = 6379,
  32. const string &pwd) {
  33. m_addr = addr;
  34. m_port = port;
  35. m_pwd = pwd;
  36. pm_rct = redisConnect(m_addr.c_str(), m_port);
  37. if (pm_rct->err) {
  38. error_msg = pm_rct->errstr;
  39. return M_CONNECT_FAIL;
  40. }
  41. if (!m_pwd.empty()) {
  42. return connectAuth(m_pwd);
  43. }
  44. return M_REDIS_OK;
  45. }
  46. /*
  47. 断开redis连接
  48. */
  49. int RedisHandler::disConnect() {
  50. redisFree(pm_rct);
  51. freeReplyObject(pm_rr);
  52. }
  53. /*
  54. 添加或插入键值对
  55. key:键,value:值
  56. 成功返回M_REDIS_OK,失败返回<0
  57. */
  58. int RedisHandler::setValue(const string &key, const string &value) {
  59. string cmd = "set " + key + " " + value;
  60. pm_rr = (redisReply *)redisCommand(pm_rct, cmd.c_str());
  61. return handleReply();
  62. }
  63. /*
  64. 获取键对应的值
  65. key:键,value:值引用
  66. 成功返回M_REDIS_OK,失败返回<0
  67. */
  68. int RedisHandler::getValue(const string &key, string &value) {
  69. string cmd = "get " + key;
  70. pm_rr = (redisReply *)redisCommand(pm_rct, cmd.c_str());
  71. int ret = handleReply(&value);
  72. }
  73. /*
  74. 删除键
  75. key:键
  76. 成功返回影响的行数(可能为0),失败返回<0
  77. */
  78. int RedisHandler::delKey(const string &key) {
  79. string cmd = "del " + key;
  80. pm_rr = (redisReply *)redisCommand(pm_rct, cmd.c_str());
  81. int rows = 0;
  82. int ret = handleReply(&rows);
  83. if (ret == M_REDIS_OK)
  84. return rows;
  85. else
  86. return ret;
  87. }
  88. /*
  89. 打印所有键值对到屏幕上
  90. */
  91. int RedisHandler::printAll() {
  92. string cmd = "keys *";
  93. pm_rr = (redisReply *)redisCommand(pm_rct, cmd.c_str());
  94. int len;
  95. redisReply **array;
  96. int ret = handleReply(&len, &array);
  97. if (ret == M_REDIS_OK) {
  98. for (int i = 0; i < len; i++) cout << string(array[i]->str) << endl;
  99. } else
  100. return 0;
  101. }
  102. /*
  103. 返回错误信息
  104. */
  105. string RedisHandler::getErrorMsg() { return error_msg; }
  106. /*
  107. 使用密码登录
  108. psw:登录密码
  109. 成功返回M_REDIS_OK,失败返回<0
  110. */
  111. int RedisHandler::connectAuth(const string &psw) {
  112. string cmd = "auth " + psw;
  113. pm_rr = (redisReply *)redisCommand(pm_rct, cmd.c_str());
  114. return handleReply();
  115. }
  116. /*
  117. 处理redis返回的信息
  118. value:数据指针,用于保存redis返回的基本类型(value指针指向该数据)
  119. array:数组指针,用于保存redis返回的数组
  120. 成功返回M_REDIS_OK,失败返回<0
  121. */
  122. int RedisHandler::handleReply(void *value, redisReply ***array) {
  123. if (pm_rct->err) {
  124. error_msg = pm_rct->errstr;
  125. return M_CONTEXT_ERROR;
  126. }
  127. if (pm_rr == NULL) {
  128. error_msg = "auth redisReply is NULL";
  129. return M_REPLY_ERROR;
  130. }
  131. switch (pm_rr->type) {
  132. case REDIS_REPLY_ERROR:
  133. error_msg = pm_rr->str;
  134. return M_EXE_COMMAND_ERROR;
  135. case REDIS_REPLY_STATUS:
  136. if (!strcmp(pm_rr->str, "OK"))
  137. return M_REDIS_OK;
  138. else {
  139. error_msg = pm_rr->str;
  140. return M_EXE_COMMAND_ERROR;
  141. }
  142. case REDIS_REPLY_INTEGER:
  143. *(int *)value = pm_rr->integer;
  144. return M_REDIS_OK;
  145. case REDIS_REPLY_STRING:
  146. *(string *)value = pm_rr->str;
  147. return M_REDIS_OK;
  148. case REDIS_REPLY_NIL:
  149. *(string *)value = "";
  150. return M_REDIS_OK;
  151. case REDIS_REPLY_ARRAY:
  152. *(int *)value = pm_rr->elements;
  153. *array = pm_rr->element;
  154. return M_REDIS_OK;
  155. default:
  156. error_msg = "unknow reply type";
  157. return M_EXE_COMMAND_ERROR;
  158. }
  159. }