代码是对redis常见的hash的封装和使用

每个函数都亲自测试过

关于如何安装hiredis模块,网上一搜一大堆,这里不在赘述,如有其他问题欢迎留言交流。

头文件

#ifndef REDISBASEMODULE_H
#define REDISBASEMODULE_H
#include <QObject>
#include <QMap>
#include <QVariant>
#include "hiredis/hiredis.h"
#include "redisbasemodule_global.h"
///
/// \brief The RedisBaseModule class
/// 本模块建立Reids链接,封装常用的函数
class REDISBASEMODULESHARED_EXPORT RedisBaseModule
{public:bool getConnect();//-----------------HashMap----------------int hashHlen(const QString& key);redisReply *execommand(QString &command);QMap<QString,QVariant> hgetall(QString key);RedisBaseModule(const char *ip, const int port);bool hmset(QString key, QMap<QString,QVariant> map);int hashHexists(const QString& key,const QString& field);QString hashHget(const QString& key,const QString& field);bool hashHset(const QString &key, const QString &field , const QString& value);//-----------------set get----------------QString get(const QString &cmmand);bool set(const QString &cmmand);
private:char* m_ip;int m_port;redisContext* m_prct;
};#endif // REDISBASEMODULE_H

cpp

#include "redisbasemodule.h"
#include <QDebug>RedisBaseModule::RedisBaseModule(const char* ip, const int port)
{//memcpy(m_ip,ip,strlen(ip));m_port = port;m_prct = nullptr;
}bool RedisBaseModule::getConnect()
{struct timeval timeout={2,0};m_prct = (redisContext*)redisConnectWithTimeout("10.0.1.70",m_port,timeout);if(m_prct == nullptr)return false;return true;
}
///
/// \brief RedisBaseModule::hmset 同时将多个field-value对设置到哈希表key中
/// \param key 哈希表key
/// \param map 向key中写入的值
/// \return
///
bool RedisBaseModule::hmset(QString key, QMap<QString, QVariant> map)
{QString cmd("HMSET ");cmd.append(key);QMapIterator<QString, QVariant> i(map);while (i.hasNext()){i.next();cmd.append(" ");cmd.append(i.key());cmd.append(" ");cmd.append(i.value().toString());}redisReply * reply = execommand(cmd);if(reply == nullptr)return false;if(QString(QLatin1String(reply->str)) == "OK")return true;return false;
}
///
/// \brief RedisBaseModule::hashHexists 判断哈希表中的某个字段是否存在
/// \param key
/// \param field
/// \return 存在返回1 不存在返回0
///
int RedisBaseModule::hashHexists(const QString &key, const QString &field)
{int result = 0;QString cmd("HEXISTS ");cmd.append(key);cmd.append(" ");cmd.append(field);redisReply* reply =(redisReply*)redisCommand(m_prct,cmd.toStdString().c_str());if(reply->type == REDIS_REPLY_INTEGER)result = reply->integer;freeReplyObject(reply);return result;
}
///
/// \brief RedisBaseModule::hashHget
/// \param key   返回哈希表 key
/// \param field 中给定域 field 的值
/// \return 成功返回给定的域,否则NULL
///
QString RedisBaseModule::hashHget(const QString &key, const QString &field)
{QString tmp("");QString cmd("HGET ");cmd.append(key);cmd.append(" ");cmd.append(field);QByteArray buff = cmd.toLatin1();redisReply* reply =(redisReply*)redisCommand(m_prct,buff.data());if(reply->type == REDIS_REPLY_STRING)tmp = reply->str;freeReplyObject(reply);return tmp;
}
///
/// \brief RedisBaseModule::hashHset 修改哈希表中某个字段的值
/// \param key    hash的Key
/// \param field  key中的某个字段
/// \param value  想要写入的新值
/// \return true field之前不存在  之前存在值被覆盖
///
bool RedisBaseModule::hashHset(const QString &key, const QString &field, const QString &value)
{int result=0;QString cmd("HSET ");cmd.append(key);cmd.append(" ");cmd.append(field);cmd.append(" ");cmd.append(value);redisReply * reply = execommand(cmd);if(reply->type == REDIS_REPLY_INTEGER)result += reply -> integer;freeReplyObject(reply);return result !=0?true:false;
}QString RedisBaseModule::get(const QString &cmmand)
{QString cmd("GET ");QString s("");cmd.append(cmmand);redisReply * reply = execommand(cmd);if(reply->type == REDIS_REPLY_STRING)s = reply->str;freeReplyObject(reply);return s;
}bool RedisBaseModule::set(const QString &cmmand)
{QString cmd("SET ");QString s("");cmd.append(cmmand);redisReply * reply = execommand(cmd);if(reply->type == REDIS_REPLY_STRING)s = reply->str;freeReplyObject(reply);if(s == "OK")return true;return false;}
///
/// \brief RedisBaseModule::execommand 指令执行的终极入口
/// \param command  命令语句
/// \return
///
redisReply *RedisBaseModule::execommand(QString &command)
{if(m_prct == nullptr)return nullptr;QByteArray buff = command.toLatin1();redisReply* reply =(redisReply*)redisCommand(m_prct,buff.data());qDebug()<<"comand:"<<command;if(reply == nullptr){freeReplyObject(reply);return nullptr;}elsereturn reply;
}
///
/// \brief RedisBaseModule::hgetall 根据hash的key 获取里面所有的键值对,并以map的形式返回
/// \param key   hash的key
/// \return
///
QMap<QString, QVariant> RedisBaseModule::hgetall(QString key)
{QString cmd("HGETALL ");cmd.append(key);redisReply* reply = execommand(cmd);QString k,v;QMap<QString,QVariant> keypairs;if(reply->type == REDIS_REPLY_ARRAY){for(uint j = 0 ; j< reply->elements;j++){k = reply->element[j]->str;v = hashHget(key,reply->element[j]->str);keypairs.insert(k,v);j++;}freeReplyObject(reply);}return keypairs;
}
///
/// \brief RedisBaseModule::hashHlen 返回哈希表中域的数量
/// \param key
/// \return count of hash
///
int RedisBaseModule::hashHlen(const QString &key)
{int result = 0;QString cmd("HLEN ");cmd.append(key);redisReply* reply = execommand(cmd);if(reply->type == REDIS_REPLY_INTEGER){result = reply->integer;}return result;
}

测试

p_r = new RedisBaseModule("10.0.1.70",6379);qDebug()<<p_r->getConnect();QMap<QString ,QVariant > cmd;cmd.insert("name","korol");cmd.insert("age",16);cmd.insert("user","root");cmd.insert("password","orange");qDebug()<<p_r->hmset("RedisModuleTest",cmd);qDebug()<<p_r->hgetall("RedisModuleTest");qDebug()<<p_r->hashHexists("RedisModuleTest","name1");qDebug()<<p_r->hashHlen("RedisModuleTest");qDebug()<<p_r->hashHset("RedisModuleTest","phone","21");qDebug()<<p_r->hashHset("RedisModuleTest","address","判断哈希表中的某个字段是否存在");

qt Redis使用相关推荐

  1. linux redis客户端怎么使用,linux 下安装redis并用QT写客户端程序进行连接

    1.安装redis.使用如下命令: wget http://dowload.redis.io/redis-stable.tar.gz tar xzf redis-stable.tar.gz cd re ...

  2. Qt工作笔记-使用hiredis连接及查询Redis

    目录 基本概念 代码与实例 基本概念 前几天学了个java的,现在想搞个C++的,但在hiredis上发现了一个qt的.就准备直接用Qt来撸项目算了,毕竟Pro文件,比Makefile要好写多了,先来 ...

  3. Redis 桌面管理工具 RedisDesktopManager 2019.0 发布

    百度智能云 云生态狂欢季 热门云产品1折起>>>   RedisDesktopManager 2019.0 版本已发布,Redis Desktop Manager(RedisDesk ...

  4. redis 管理工具_Redis的跨平台GUI 桌面管理工具

    RedisDesktopManager 是一个快速.简单.支持跨平台的 Redis 桌面管理工具,基于 Qt 5 开发,支持通过 SSH Tunnel 连接. 快速安装 可以直接在github上下载 ...

  5. Redis 桌面管理工具 RedisDesktopManager 2020.1 发布

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://www.oschina.net ...

  6. SpringBoot+Vue实现请求后台获取Base64编码的图片验证码并使用Redis缓存实现2分钟内有效

    场景 前端Vue的登录页面,验证码请求后台,后台生成验证码照片后使用Base64编码后, 返回给前端,前端进行显示. 注: 博客: https://blog.csdn.net/badao_liuman ...

  7. Linux 下 Redis 安装教程

    Linux 下 Redis 安装教程 事先准备 下载 Redis 安装 Redis 设置 Redis 开机自启动 远程访问 Redis RDM 远程访问 Redis 笔者的运行环境: CentOS S ...

  8. qt客户端连接服务器不响应,qt判断tcp客户端是否连接服务器

    qt判断tcp客户端是否连接服务器 内容精选 换一换 本章节指导您使用MongoDB客户端,通过弹性云服务器内网方式连接GaussDB(for Mongo)集群实例.操作系统使用场景:弹性云服务器的操 ...

  9. qt多线程服务器_常见网络服务器并发模型

    点击蓝字 关注我们 近些年,随着互联网的大发展,高并发服务器技术也快速进步,从简单的循环服务器模型处理少量网络并发请求,演进到解决C10K,C10M问题的高并发服务器模型.本文主要以TCP为例,总结了 ...

最新文章

  1. 比较好的电脑系统_win10电脑系统选择什么版本比较好
  2. 数据库远程访问数据库服务器网站和端口问题
  3. mysql 修改表结构提示 MySQL said: Table is read only
  4. [Linux].netrc或者_netrc使用可以
  5. 源代码编译安装Apache2
  6. windows环境下Oracle数据库冷备份和恢复
  7. C++ Under the Hood
  8. 程序员都该知道这5个定律,有朋友使用后,现在已经是软件工程师!
  9. C#中常用的分页存储过程
  10. MAC下MySQL初始密码忘记怎么办
  11. SpringBooot-基础1-构建项目
  12. md5util java_Java 工具类 - MD5Util
  13. 论文笔记《BERT》
  14. 手机号抽奖、福利彩票抽奖
  15. dotnet core项目升级到 .net core 2.0
  16. Android dev 设备访问权限 777,Android Studio:/ dev / kvm设备权限被拒绝
  17. 批量修正字幕乱码(powershell)
  18. 易班APP登录密码加密、sig逆向分析
  19. Web3D开发者兼职副业平台推荐
  20. Boofuzz协议漏洞挖掘入门教程与使用心得

热门文章

  1. AIX服务器上设置IIB连接oracle
  2. java Exception问题:unhandled exception:java.lang.Exception
  3. 相关算法---字符串
  4. 专访 iOS 技术专家孙源:开发者的成长始于“死磕”
  5. C语言之strncpy函数
  6. 介绍一款数据库管理软件
  7. WPF ContextMenu的使用
  8. socket10053
  9. 单线激光雷达(Lidar)学习三:使用雷达数据/scan转/PointCloud后生成鸟瞰图
  10. php编写当前日期距高考天数,距离2021年高考天数 2021高考倒计时