QT聊天项目DAY09

发布于:2025-05-08 ⋅ 阅读:(12) ⋅ 点赞:(0)

1. 安装Redis

直接从老师的网盘下载

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

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

    .\redis-server.exe .\redis.windows.conf

    启动客户端看一下

    2. 配置redis库,调用API

    编译一下

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

    新建一个lib文件夹

    2.1 配置Redis环境

    2.2 代码测试Redis

    #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拉去镜像,但遇到了连接超时的问题

    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).

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

    "https://registry-1.docker.io/v2/"

    2.4 Docker安装Redis的报错解析

    1. 检查网络连接

    1.1 测试是否可以访问Docker Hub
    curl -v https://registry-1.docker.io/v2/

    1.2 Ping测试:

    检查是否能够访问外网

    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

    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的离线镜像

    sudo docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/redis:7.0.12
    

    2. 保存镜像为.tar 文件

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

    3. 将VMware与windows共享

    which vmhgfs-fuse
    

    sudo mkdir -p /mnt/hgfs
    sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other
    ls /mnt/hgfs
    
    

    cp ~/redis.tar /mnt/hgfs/vmshare/
    

    每次都需要手动挂载一下

    2.9 启动images中的redis

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

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

    docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/redis:7.0.12 redis:7.0.12
    

    然后运行镜像

    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 启动,为什么我在代码中就能连上远程的了呢?

    redisContext* c = redisConnect("81.68.86.146", 6380);

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

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

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

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

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

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

    下一章,redis连接池,gogogo


    网站公告

    今日签到

    点亮在社区的每一天
    去签到