QT聊天项目DAY09

1. 安装Redis

直接从老师的网盘下载

复制代码
链接: https://pan.baidu.com/s/1v_foHZLvBeJQMePSGnp4Ow?pwd=yid3 提取码: yid3

启动Redis服务看一下,启动成功了

cpp 复制代码
.\redis-server.exe .\redis.windows.conf

启动客户端看一下

2. 配置redis库,调用API

编译一下

在BoostNetLib文件夹下新建Redis文件夹,并将Redis-3.10文件夹下的src和deps拷过来

新建一个lib文件夹

2.1 配置Redis环境

2.2 代码测试Redis

cpp 复制代码
#include "hiredis.h"
void TestRedis() {
    //连接redis 需要启动才可以进行连接
//redis默认监听端口为6387 可以再配置文件中修改
    redisContext* c = redisConnect("127.0.0.1", 6379);
    if (c->err)
    {
        printf("Connect to redisServer faile:%s\n", c->errstr);
        redisFree(c);        return;
    }
    printf("Connect to redisServer Success\n");
    std::string redis_password = "123456";
    redisReply* r = (redisReply*)redisCommand(c, "AUTH %s", redis_password);
    if (r->type == REDIS_REPLY_ERROR) {
        printf("Redis认证失败!\n");
    }
    else {
        printf("Redis认证成功!\n");
    }
    //为redis设置key
    const char* command1 = "set stest1 value1";
    //执行redis命令行
    r = (redisReply*)redisCommand(c, command1);
    //如果返回NULL则说明执行失败
    if (NULL == r)
    {
        printf("Execut command1 failure\n");
        redisFree(c);        return;
    }
    //如果执行失败则释放连接
    if (!(r->type == REDIS_REPLY_STATUS && (strcmp(r->str, "OK") == 0 || strcmp(r->str, "ok") == 0)))
    {
        printf("Failed to execute command[%s]\n", command1);
        freeReplyObject(r);
        redisFree(c);        return;
    }
    //执行成功 释放redisCommand执行后返回的redisReply所占用的内存
    freeReplyObject(r);
    printf("Succeed to execute command[%s]\n", command1);
    const char* command2 = "strlen stest1";
    r = (redisReply*)redisCommand(c, command2);
    //如果返回类型不是整形 则释放连接
    if (r->type != REDIS_REPLY_INTEGER)
    {
        printf("Failed to execute command[%s]\n", command2);
        freeReplyObject(r);
        redisFree(c);        return;
    }
    //获取字符串长度
    int length = r->integer;
    freeReplyObject(r);
    printf("The length of 'stest1' is %d.\n", length);
    printf("Succeed to execute command[%s]\n", command2);
    //获取redis键值对信息
    const char* command3 = "get stest1";
    r = (redisReply*)redisCommand(c, command3);
    if (r->type != REDIS_REPLY_STRING)
    {
        printf("Failed to execute command[%s]\n", command3);
        freeReplyObject(r);
        redisFree(c);        return;
    }
    printf("The value of 'stest1' is %s\n", r->str);
    freeReplyObject(r);
    printf("Succeed to execute command[%s]\n", command3);
    const char* command4 = "get stest2";
    r = (redisReply*)redisCommand(c, command4);
    if (r->type != REDIS_REPLY_NIL)
    {
        printf("Failed to execute command[%s]\n", command4);
        freeReplyObject(r);
        redisFree(c);        return;
    }
    freeReplyObject(r);
    printf("Succeed to execute command[%s]\n", command4);
    //释放连接资源
    redisFree(c);
}

2.3 什么是Docker

Docker像是一个程序+运行环境打包后的虚拟App,由Docker平台来调度运行它

Docker下载东西会先去查找本地资源有没有下载,如果没有下载会去尝试远程下载

运行sudo docker images命令查看到docker下面没有任何东西,所以会尝试去远程下载

远程下载时,docker客户端尝试从docker Hub拉去镜像,但遇到了连接超时的问题

cpp 复制代码
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).

其实本质上就是从远程的商店下载东西,直接去远程官网看一下

cpp 复制代码
"https://registry-1.docker.io/v2/"

2.4 Docker安装Redis的报错解析

1. 检查网络连接

1.1 测试是否可以访问Docker Hub
cpp 复制代码
curl -v https://registry-1.docker.io/v2/
1.2 Ping测试:

检查是否能够访问外网

cpp 复制代码
ping registry-1.docker.io

能否直接在docker官网安装redis然后再导入到linux中最后使用docker指令挪到images中

2.5 离线导入Docker镜像

2.5.1 在联网的机器上下载Redis镜像

复制代码
docker pull redis:latest

导出一个.tar文件

复制代码
docker save -o redis_latest.tar redis:latest

2.5.2 将文件拷贝到目标Linux系统

2.5.3 在目标Linux上导入Redis镜像

复制代码
docker load -i redis_latest.tar

2.5.4 运行Redis容器

复制代码
docker run -d --name myredis -p 6379:6379 redis

2.6 配置国内镜像加速器

1. 配置daemon.json

cpp 复制代码
sudo nano /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}


/* 重启Docker服务 */
sudo systemctl daemon-reexec
sudo systemctl restart docker

如果还是无效,采用阿里云容器镜像服务

2.7 阿里云容器镜像

2.8 最终解决方案

2.4 2.5 2.6 2.7 方法都没有用,可能就是网络环境的问题,从2.5 上能够得到解决方案 ,离线导入Redis镜像,网络上遇到这种问题的人肯定很多,所以肯定是有Redis的离线镜像的

1. 使用国内镜像源拉取Redis的离线镜像

cpp 复制代码
sudo docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/redis:7.0.12

2. 保存镜像为.tar 文件

cpp 复制代码
docker save -o redis.tar swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/redis:7.0.12

3. 将VMware与windows共享

cpp 复制代码
which vmhgfs-fuse
cpp 复制代码
sudo mkdir -p /mnt/hgfs
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
ls /mnt/hgfs
cpp 复制代码
cp ~/redis.tar /mnt/hgfs/vmshare/

每次都需要手动挂载一下

2.9 启动images中的redis

上述的步骤只是将软件安装到了手机上,但是还没有真正的运行起来,需要使用docker运行起来

先给已有镜像起一个简短的名字

cpp 复制代码
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/redis:7.0.12 redis:7.0.12

然后运行镜像

cpp 复制代码
docker run -d --name *****-redis -p 6380:6379 redis:7.0.12 --requirepass "*********"

使用docker ps 查看正在运行的容器

docker ps 查看所有容器

docker start (容器名字) 启动容器

使用redisDesktopManager建立连接

redis使用docker ps命令查看启动成功,使用sudo netstat -tulnp | grep 6380 查看端口号,确实有在监听

一切都没有问题,应该是网络模式出问题了

2.10 代码连接redis服务

3. 远程redis服务的困惑

刚刚做了这么多,费了老大的劲在linux上使用docker部署redis,首先采用国内的网站下载被人已经下载好的离线redis镜像源到images中

然后采用docker run 启动,为什么我在代码中就能连上远程的了呢?

cpp 复制代码
redisContext* c = redisConnect("81.68.86.146", 6380);

现在才后知后觉,原来用的是老师的服务器

既然不能用云服务器,索性linux上我也不管了,专心搞一套逻辑,跨平台先放下。

然后采用本地连接windows上的redis,发现redis无法启动,查看原因是端口号已经绑定以及Ip地址没有找到

所以更换为本机的本机循环地址和ip地址,更换端口号

用c++写的服务端来尝试连接,连接失败

可能是密码没有写,添加密码再次连接,连接成功

下一章,redis连接池,gogogo

相关推荐
火龙谷13 分钟前
【爬虫】码上爬第6题-倚天剑
开发语言·javascript·爬虫
jk_10120 分钟前
MATLAB中去除噪声
开发语言·计算机视觉·matlab
田辛 | 田豆芽22 分钟前
【Python】通过`Editable Install`模式详解,解决Python开发总是import出错的问题
开发语言·python·包管理
代码AC不AC31 分钟前
【C++】类和对象【下】
开发语言·c++·类和对象·学习分享·技术交流
机器视觉知识推荐、就业指导41 分钟前
Qt开发经验:回调函数的线程归属问题及回调函数中更新控件的问题
开发语言·qt
桃林春风一杯酒1 小时前
Listremove数据时报错:Caused by: java.lang.UnsupportedOperationException
java·开发语言
星夜9821 小时前
C++回顾 Day5
开发语言·c++·算法
@Zeker2 小时前
C++多态详解
开发语言·c++
王燕龙(大卫)2 小时前
递归下降算法
开发语言·c++·算法
zhangzhangkeji3 小时前
QT6 源(82):阅读与注释日历类型 QCalendar,本类并未完结,儒略历,格里高利历原来就是公历,
qt