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