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

相关推荐
yxc_inspire5 分钟前
基于Qt的app开发第十三天
c++·qt·app·tcp·面向对象
come1123430 分钟前
Claude 写 PHP 项目的完整小白教程
开发语言·php
虾球xz33 分钟前
CppCon 2015 学习:Concurrency TS Editor’s Report
开发语言·c++·学习
潇-xiao36 分钟前
Qt 按钮类控件(Push Button 与 Radio Button)(1)
c++·qt
板鸭〈小号〉40 分钟前
命名管道实现本地通信
开发语言·c++
火兮明兮1 小时前
Python训练第四十五天
开发语言·python
我爱Jack2 小时前
ObjectMapper 在 Spring 统一响应处理中的作用详解
java·开发语言
小白杨树树2 小时前
【SSM】SpringMVC学习笔记8:拦截器
java·开发语言
冷心笑看丽美人2 小时前
Spring MVC 之 异常处理
java·开发语言·java-ee·spring mvc
超级小忍2 小时前
Java集合中Stream流的使用
java·开发语言