一、知识点

【1】网络中的上行速率和下行速率

  • 下行速率(Download):数据从网络流向自己的设备的速度
  • 上行速率(Upload):数据从自己的设备流向网络的速度
  • 平时大部分时间是在接受从网络流向自己的数据,所以家里带宽的下行速率通常远大于上行速率。
  • “500M 宽带”,往往指下行 500Mbps,而上行可能只有 50Mbps左右。

【2】文件下载速度和硬盘读写速度、

文件下载速度要小于硬盘写入速度。

why?

下载文件:网络 → 内存(缓冲区)→ 硬盘

如果硬盘的读写速度跟不上文件的下载速度,就会导致下载的文件在内存缓冲区堆积,下载速度就会变慢。

【3】关系数据库和内存数据库

1、内存数据库是什么?

  • 关系数据库就是把数据存放成二维表
  • 内存数据库就是把数据存在内存(RAM)里,而不是磁盘上的数据库

内存数据库就是拿”快但易失”来换极致的读写速度。常见的有 Redis、Memcached 等。

2、为什么要有内存数据库?

比如一个网页要展示商品实时库存,如果每次都去硬盘里读数据,就会很慢。放在内存数据库里面,会快很多很多。

3、内存数据库怎么用?

连接 → 存 → 取

  1. 装一个内存数据库,比如Redis
  2. 连接 Redis
  3. 从 Redis 里面读数据,如果查不到,再从 MySQL 里面查,查完之后顺便写入 Redis。(有点类似于 cache)

【4】Windows 分屏终端

  • Alt + Shift + =:左右分屏(垂直拆分)

  • Alt + Shift + -:上下分屏(水平拆分)

  • Alt + 方向键:在分屏之间切换

  • exit 回车退出分屏

二、Redis 使用

真实场景案例:

登录验证码。

流程是:用户点”发送验证码” → 后端生成 6 位随机数 → 存进 Redis,5 分钟有效 → 用户提交后去 Redis 比对。

用它能把 Redis 的写入、读取、过期一次性全演示到。

下面以 Windows 为例:

第一步:安装并启动 Redis

Redis 官方不支持 Windows 原生,最省事的方式是 Docker

1
2
# 拉取镜像并后台运行,把容器的 6379 端口映射到本机
docker run --name myredis -d -p 6379:6379 redis:7

运行完验证:

1
docker ps

第二步:连上 Redis

1
2
# 进入容器里的命令行客户端
docker exec -it myredis redis-cli

场景模拟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 模拟"发送验证码":存验证码,EX 300 表示 300 秒后自动过期
SET phone:13800001234:code 583920 EX 300
# 返回 OK

# 2. 模拟"用户提交验证码":取出来比对
GET phone:13800001234:code
# 返回 "583920"

# 3. 查看还剩多久过期
TTL phone:13800001234:code
# 返回剩余秒数,比如 241

# 4. 验证通过后删掉(防止重复使用)
DEL phone:13800001234:code

# 5. 超过 5 分钟再来取,已经没了(这就是 Redis 自动过期的效果)
GET phone:13800001234:code
# 返回 (nil)

第三步:代码里真正调用(Python 示例)

先装客户端库:

1
pip install redis

然后写代码(存成 verify.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import random
import redis

# 连接本机的 Redis(6379 是默认端口,decode_responses 让返回的是字符串而不是字节)
r = redis.Redis(host='localhost', port=6379, decode_responses=True)

def send_code(phone: str) -> str:
"""发送验证码:生成 6 位随机数,存进 Redis,5 分钟有效"""
code = f"{random.randint(0, 999999):06d}" # 生成 583920 这样的 6 位数
key = f"phone:{phone}:code"
r.set(key, code, ex=300) # 等价于 SET key code EX 300
print(f"已向 {phone} 发送验证码:{code}(5 分钟内有效)")
return code


def check_code(phone: str, user_input: str) -> bool:
"""校验验证码:取出比对,无论对错都删掉(只允许试一次)"""
key = f"phone:{phone}:code"
saved = r.get(key) # 等价于 GET key,不存在返回 None
r.delete(key) # 等价于 DEL key
return saved is not None and saved == user_input


if __name__ == "__main__":
phone = "13800001234"
send_code(phone) # 第一步:发码
code = input("请输入收到的验证码:") # 第二步:假装你是用户,把打印出来的码敲进去
print("验证通过!" if check_code(phone, code) else "验证码错误或已过期")

执行:(或者直接在 PyCharm 中执行)

1
python verify.py

执行结果:

1
2
3
已向 13800001234 发送验证码:881748(5 分钟内有效)
请输入收到的验证码:881748
验证通过!

三、Docker 使用

【1】Docker 是什么?

Docker 是一个容器,可以把程序和它所需要的环境打包在一起。

Docker 的思路是:软件的发布者提前把整个软件 + 它依赖的一切(操作系统环境、运行库、配置文件)打包成一个标准包裹,叫镜像(Image)。你拿到这个包裹,Docker帮你开箱即用地跑起来,你不用关心它依赖什么,也不用装任何东西。

【2】为什么要用 Docker ?解决什么问题?

问题:

开发者的电脑上环境是 A,测试服务器环境是 B,线上服务器环境是 C。程序在 A 上跑得好好的,到 C 上就崩,因为缺个运行库、版本差半号、配置不一样……

解决方案:

Docker 让开发、测试、生产跑的是同一个镜像,环境完全一致,消灭”环境不一致”这个变量。

作用:

  1. 告别 “在我电脑上明明能跑”。

  2. 隔离。每个容器都是独立的小箱子,互相不干扰。

  3. 轻、快、省。Docker 容器很轻,启动是秒级的;虚拟机启动要好几分钟。

【3】Docker 能用来做什么?什么场景用?

1、跑数据库,不用在本机装。

学 Redis,在 Windows 或虚拟机里手动装、配、折腾,用一条命令 docker run redis 就可以完成,用完删除即可

2、部署网站和 Web 服务。

把写好的网站打包成容器,推到服务器上,一条命令就可以部署好,服务器崩溃换一台,拉下来再跑,只需要几秒

3、学习新软件、搭实验环境。

想试试新工具,开个容器,用完删掉,完全不污染自己的系统。

4、多服务一整套启动。

比如一个项目要 “网站 + 数据库 + 缓存” 三个东西,用 docker-compose 一条命令全给你拉起来。

【4】Docker 怎么用?

核心命令:

1
2
3
docker run --name myredis -d -p 6379:6379 redis:7

docker exec -it myredis redis-cli
  • docker run:启动一个容器
  • –name myredis:给这个容器起个名字,以后好管理
  • -d:后台运行(detached),不然它会占住终端
  • -p 6379:6379:端口映射,”宿主机端口:容器端口”。容器是个隔离的小环境,里面的 6379 外面访问不到,映射一下,访问本机 6379 就等于访问容器的 6379
  • redis:7:镜像名:版本号。redis 是镜像,7 是标签(版本)。不写版本默认 latest

三个核心概念:

镜像(Image)

容器(Container):镜像跑起来的实例。一个镜像可以开出无数个容器。

Docker Hub:官方的镜像仓库网站(hub.docker.com)

Docker Compose:一个编排工具,用一个 YAML 文件定义”一组容器”(比如”项目 = Web 容器 + 数据库容器 + Redis 容器”),一条 docker compose up 全部拉起。

Daemon(守护进程):Docker 的幕后服务,Docker Desktop 启动时它就活了。

其他日常命令:

1
2
3
4
5
6
7
8
9
docker ps              # 看正在运行的容器
docker ps -a # 看所有容器(包括已停止的)
docker logs myredis # 看某个容器的日志
docker exec -it myredis redis-cli # 进容器里执行命令
docker stop myredis # 停止
docker start myredis # 再启动(数据还在)
docker rm myredis # 删除容器
docker pull nginx # 只下载镜像不运行
docker images # 看本机有哪些镜像

【5】Docker 真实场景案例

用 Docker 瞬间架起一个网站:

验证:

1
docker version

一条命令,建一个网站:

1
docker run -d --name myweb -p 8080:80 nginx

浏览器地址栏输入:

1
http://localhost:8080

换成自己的网页:

目录新建一个 index.html

1
<h1>欢迎来到我的第一个 Docker 世界</h1>

然后执行:

1
2
3
docker run -d --name myweb2 -p 8081:80 -v %cd%:/usr/share/nginx/html nginx
# 或者
docker run -d --name myweb2 -p 8081:80 -v $(pwd):/usr/share/nginx/html nginx

访问:

1
http://localhost:8081
1
2
docker stop myweb myweb2   # 停止
docker rm myweb myweb2 # 删除