Redis + Docker + PyCharm + Python 虚拟环境学习笔记
Redis + Docker + PyCharm + Python 虚拟环境学习笔记
适用场景:Windows + PowerShell + Docker Desktop + PyCharm + FastAPI 项目
目标:能用 Docker 启动 Redis,能在 PyCharm 连接 Redis,能在 Python/FastAPI 项目中使用 Redis,并掌握常用 Redis 命令。
目录
- Redis 是什么
- Docker 里的 Image 和 Container 区别
- 用 Docker 启动 Redis
- PowerShell 测试 Redis 连接
- PyCharm 连接 Docker Redis
- Python 虚拟环境 venv
- 切换本地 Python 版本
- Python 操作 Redis
- FastAPI 中使用 Redis
- Redis 常用命令大全
- Redis 常见项目场景
- 常见报错和解决
- 推荐练习路线
1. Redis 是什么
Redis 可以理解成一个运行在内存里的高速键值数据库。
常见用途:
- 缓存接口结果
- 保存验证码
- 保存登录 token
- 做文章阅读量计数
- 做点赞、收藏、关注关系
- 做排行榜
- 做限流
- 做简单消息队列
- 配合 FastAPI 提升接口性能
Redis 不只是简单的 key-value,它支持多种数据结构:
| 数据类型 | 用途 |
|---|---|
| String | 字符串、验证码、token、计数器 |
| Hash | 存对象,例如用户信息、文章信息 |
| List | 列表、队列、最近浏览记录 |
| Set | 去重集合、点赞用户集合、标签 |
| Sorted Set / ZSet | 排行榜、热榜 |
| Stream | 消息流、日志流、事件队列 |
| Bitmap | 签到、活跃用户统计 |
| HyperLogLog | 大规模去重计数 |
| Geo | 地理位置附近的人/店铺 |
2. Docker 里的 Image 和 Container 区别
这是最容易混淆的地方。
Image 镜像 = 安装包 / 模板
Container 容器 = 真正运行起来的软件实例
比如 Redis:
redis:latest 镜像 = Redis 的安装包
redis 容器 = 真正正在运行的 Redis 服务
在 Docker Desktop 里:
Images 页面 = 看安装包
Containers 页面 = 看正在运行或曾经运行过的软件实例
如果你要连接 Redis,应该关注的是 Containers 页面里的 Redis 容器。
3. 用 Docker 启动 Redis
3.1 最推荐的启动方式
docker run -d --name redis -p 6379:6379 redis:latest
参数解释:
docker run
创建并运行一个新容器。
-d
后台运行。
--name redis
容器名字叫 redis。
-p 6379:6379
端口映射。
左边的 6379 是 Windows 本机端口。
右边的 6379 是容器内部 Redis 的端口。
意思是:
Windows 本机 6379 端口 -> Docker 容器内部 6379 端口
redis:latest
使用 Redis 最新镜像。
3.2 按指定版本启动 Redis
例如项目文档要求 Redis 7:
docker run -d --name teamx-redis -p 6379:6379 redis:7
如果你本机 6379 已经被别的 Redis 容器占用,可以改成本机 6380:
docker run -d --name teamx-redis -p 6380:6379 redis:7
此时连接地址是:
localhost:6380
不是:
localhost:6379
3.3 查看正在运行的容器
docker ps
你应该看到类似:
CONTAINER ID IMAGE STATUS PORTS NAMES
xxxxxx redis:latest Up 0.0.0.0:6379->6379/tcp redis
重点是:
0.0.0.0:6379->6379/tcp
这说明端口映射成功了。
如果你只看到:
6379/tcp
说明 Redis 只在容器内部开放,Windows 和 PyCharm 连不上。
3.4 查看所有容器
包括已经停止的容器:
docker ps -a
3.5 停止 Redis 容器
docker stop redis
3.6 启动已经存在的 Redis 容器
docker start redis
3.7 重启 Redis 容器
docker restart redis
3.8 删除 Redis 容器
docker rm -f redis
-f 表示强制删除,即使容器正在运行也删除。
3.9 删除 Redis 镜像
注意:必须先删除使用这个镜像的容器,才能删除镜像。
docker rmi redis:latest
如果提示:
Image redis:latest is in use
说明有容器正在使用这个镜像。
先查:
docker ps -a --filter ancestor=redis:latest
再删容器:
docker rm -f 容器名或容器ID
最后再删镜像:
docker rmi redis:latest
3.10 带持久化启动 Redis
普通启动方式下,如果你删除容器,数据可能会丢。
推荐学习阶段使用 Docker volume:
docker run -d --name redis -p 6379:6379 -v redis-data:/data redis:latest redis-server --appendonly yes
解释:
-v redis-data:/data
把容器内部 /data 目录挂载到 Docker volume redis-data。
redis-server --appendonly yes
开启 AOF 持久化。
查看 volume:
docker volume ls
删除 volume:
docker volume rm redis-data
4. PowerShell 测试 Redis 连接
4.1 使用容器内部 redis-cli 测试
如果容器名是 redis:
docker exec -it redis redis-cli ping
正常返回:
PONG
如果容器名是 teamx-redis:
docker exec -it teamx-redis redis-cli ping
4.2 进入 Redis 交互命令行
docker exec -it redis redis-cli
进入后会看到:
127.0.0.1:6379>
输入:
PING
返回:
PONG
退出:
exit
或者按:
Ctrl + C
4.3 测试 Windows 本机端口是否通
Test-NetConnection localhost -Port 6379
成功时会看到:
TcpTestSucceeded : True
也可以测试:
Test-NetConnection 127.0.0.1 -Port 6379
如果你把 Redis 映射到 6380:
Test-NetConnection localhost -Port 6380
4.4 为什么不能直接输入 redis-cli ping
如果你没有在 Windows 本机安装 Redis CLI,那么直接执行:
redis-cli ping
会提示找不到命令。
因为 pip install redis 安装的是 Python 客户端库,不会给 Windows 安装 redis-cli 命令。
所以推荐用:
docker exec -it redis redis-cli ping
5. PyCharm 连接 Docker Redis
5.1 前提
Docker Redis 容器必须有端口映射:
6379:6379
或者命令行里看到:
0.0.0.0:6379->6379/tcp
5.2 PyCharm 配置
在 PyCharm 右侧 Database 面板里添加 Redis 数据源。
推荐配置:
连接类型:standalone
驱动程序:Redis
主机:localhost
端口:6379
身份验证:无身份验证
数据库:0
URL:jdbc:redis://localhost:6379/0
如果 localhost 连不上,可以换成:
主机:127.0.0.1
URL:jdbc:redis://127.0.0.1:6379/0
5.3 连接成功标志
测试连接显示:
已成功
DBMS: Redis Standalone
Ping: xx 毫秒
说明 PyCharm 已经成功连上 Docker 里的 Redis。
6. Python 虚拟环境 venv
6.1 python3 -m venv .venv 是什么意思
命令:
python3 -m venv .venv
意思是:
使用 python3 这个解释器,在当前目录创建一个名叫 .venv 的虚拟环境。
逐段解释:
python3
使用 Python 3。
Windows 上通常用:
python
或者:
py
-m
把后面的模块当作脚本运行。
venv
Python 官方内置的虚拟环境模块。
.venv
虚拟环境文件夹名称。
所以 Windows 常用写法是:
python -m venv .venv
或者:
py -m venv .venv
6.2 为什么要用虚拟环境
不同项目可能需要不同版本的依赖。
例如:
项目 A 需要 fastapi==0.95
项目 B 需要 fastapi==0.115
如果全装到系统 Python,容易冲突。
虚拟环境可以让每个项目独立管理依赖。
6.3 Windows 创建虚拟环境
进入项目根目录:
cd D:\workspace\code\python\FastAPI_first\toutiao_backend
创建虚拟环境:
python -m venv .venv
成功后会出现:
.venv
Scripts
python.exe
pip.exe
Activate.ps1
Lib
pyvenv.cfg
6.4 PowerShell 激活虚拟环境
.\.venv\Scripts\Activate.ps1
成功后终端前面会出现:
(.venv)
例如:
(.venv) PS D:\workspace\code\python\FastAPI_first\toutiao_backend>
6.5 CMD 激活虚拟环境
.venv\Scripts\activate.bat
6.6 Git Bash 激活虚拟环境
source .venv/Scripts/activate
6.7 macOS / Linux 激活虚拟环境
source .venv/bin/activate
6.8 PowerShell 禁止运行脚本怎么办
如果激活时报错:
无法加载文件,因为在此系统上禁止运行脚本
执行:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
输入:
Y
然后重新激活:
.\.venv\Scripts\Activate.ps1
6.9 退出虚拟环境
deactivate
6.10 安装依赖
激活虚拟环境后:
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
推荐写 python -m pip,这样可以确保用的是当前虚拟环境里的 pip。
7. 切换本地 Python 版本
7.1 查看当前 Python
python --version
查看当前 python 命令来自哪里:
where python
7.2 查看本机安装了哪些 Python
Windows 推荐用:
py -0p
可能输出:
-3.12-64 C:\Users\Administrator\AppData\Local\Programs\Python\Python312\python.exe
-3.11-64 C:\Users\Administrator\AppData\Local\Programs\Python\Python311\python.exe
-3.10-64 C:\Users\Administrator\AppData\Local\Programs\Python\Python310\python.exe
7.3 临时使用某个 Python 版本
用 Python 3.11 运行文件:
py -3.11 main.py
用 Python 3.10 运行文件:
py -3.10 main.py
查看指定版本:
py -3.11 --version
7.4 用指定版本创建虚拟环境
例如用 Python 3.11 创建 .venv:
py -3.11 -m venv .venv
用 Python 3.10 创建:
py -3.10 -m venv .venv
创建后检查:
.\.venv\Scripts\python.exe --version
激活后检查:
python --version
where python
7.5 已经创建好的虚拟环境如何换版本
不建议硬改已有 .venv 的 Python 版本。
推荐做法:
rmdir /s /q .venv
py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt
原则:
切换项目 Python 版本 = 用目标 Python 版本重新创建虚拟环境
7.6 Conda 创建指定 Python 版本环境
conda create -n fastapi_py311 python=3.11
conda activate fastapi_py311
python --version
python -m pip install -r requirements.txt
PyCharm 解释器路径类似:
D:\worktools\anaconda3\envs\fastapi_py311\python.exe
7.7 PyCharm 切换解释器
路径:
File -> Settings -> Project -> Python Interpreter
如果用 .venv,选择:
Existing environment
路径:
项目目录\.venv\Scripts\python.exe
如果用 Conda,选择对应环境:
D:\worktools\anaconda3\envs\环境名\python.exe
8. Python 操作 Redis
8.1 安装 Python Redis 客户端
python -m pip install redis
8.2 同步连接 Redis
新建 test_redis.py:
import redis
client = redis.Redis(
host="localhost",
port=6379,
db=0,
decode_responses=True,
)
print("ping:", client.ping())
client.set("name", "wangtiezhu")
print("name:", client.get("name"))
运行:
python test_redis.py
正常输出:
ping: True
name: wangtiezhu
8.3 参数解释
host="localhost"
Redis 主机地址。
Docker 映射了 6379:6379 后,可以用 localhost 或 127.0.0.1。
port=6379
Redis 端口。
db=0
选择第 0 个 Redis 数据库。
decode_responses=True
让 Redis 返回 Python 字符串,而不是字节类型。
如果不写这个,可能返回:
b"wangtiezhu"
写了之后返回:
"wangtiezhu"
8.4 异步 Redis 客户端
FastAPI 项目通常推荐异步写法:
import redis.asyncio as redis
client = redis.Redis(
host="localhost",
port=6379,
db=0,
decode_responses=True,
)
async def test():
pong = await client.ping()
print(pong)
9. FastAPI 中使用 Redis
9.1 基础示例
from contextlib import asynccontextmanager
import redis.asyncio as redis
from fastapi import FastAPI
redis_client: redis.Redis | None = None
@asynccontextmanager
async def lifespan(app: FastAPI):
global redis_client
redis_client = redis.Redis(
host="localhost",
port=6379,
db=0,
decode_responses=True,
)
await redis_client.ping()
print("Redis connected")
yield
await redis_client.aclose()
print("Redis closed")
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root():
return {"message": "Hello Redis"}
@app.post("/cache")
async def set_cache():
assert redis_client is not None
await redis_client.set("article:1", "这是一篇文章内容", ex=60)
return {
"message": "缓存成功",
"key": "article:1",
"expire_seconds": 60,
}
@app.get("/cache")
async def get_cache():
assert redis_client is not None
value = await redis_client.get("article:1")
if value is None:
return {"message": "缓存不存在或已过期"}
return {
"key": "article:1",
"value": value,
}
@app.post("/views/{article_id}")
async def incr_views(article_id: int):
assert redis_client is not None
key = f"article:{article_id}:views"
views = await redis_client.incr(key)
return {
"article_id": article_id,
"views": views,
}
9.2 启动 FastAPI
如果入口文件是 main.py:
uvicorn main:app --reload
如果入口在包里,例如:
toutiao_backend/main.py
则可能需要:
uvicorn toutiao_backend.main:app --reload
10. Redis 常用命令大全
10.1 连接与基础命令
进入 Redis:
docker exec -it redis redis-cli
测试连接:
PING
查看 Redis 服务器信息:
INFO
查看 Redis 版本:
INFO server
查看当前数据库 key 数量:
DBSIZE
选择数据库:
SELECT 0
SELECT 1
默认 Redis 有多个逻辑数据库,常见编号是 0 到 15。
10.2 Key 通用命令
查看 key 是否存在:
EXISTS user:1
删除 key:
DEL user:1
查看 key 类型:
TYPE user:1
设置过期时间,单位秒:
EXPIRE user:1 60
查看剩余过期时间:
TTL user:1
返回值含义:
正数:剩余秒数
-1:存在,但没有过期时间
-2:key 不存在
取消过期时间,让 key 永久存在:
PERSIST user:1
重命名 key:
RENAME old_key new_key
安全重命名,只有 new_key 不存在时才成功:
RENAMENX old_key new_key
查看所有 key,学习阶段可以用:
KEYS *
查看指定模式:
KEYS user:*
生产环境不建议使用 KEYS *,更推荐 SCAN:
SCAN 0
SCAN 0 MATCH user:* COUNT 10
10.3 String 字符串
String 是最基础的数据类型。
设置和获取
SET name wangtiezhu
GET name
设置过期时间
SET code:phone:13800138000 9527 EX 60
表示 60 秒后自动过期。
只有 key 不存在时才设置
SETNX lock:order:1 user123
或者:
SET lock:order:1 user123 NX EX 30
常用于分布式锁的基础写法。
只有 key 已存在时才设置
SET name new_value XX
追加字符串
APPEND name abc
获取字符串长度
STRLEN name
删除
DEL name
10.4 String 计数器
设置初始值:
SET article:1001:views 0
加 1:
INCR article:1001:views
减 1:
DECR article:1001:views
加指定数字:
INCRBY article:1001:views 10
减指定数字:
DECRBY article:1001:views 5
浮点数增加:
INCRBYFLOAT score 1.5
常见用途:
INCR article:1:views
INCR user:1:login_count
INCR api:limit:user:1
10.5 Hash 哈希
Hash 适合存对象。
例如用户对象:
HSET user:1 name "张三" age 20 city "北京"
获取单个字段:
HGET user:1 name
获取多个字段:
HMGET user:1 name age
获取全部字段和值:
HGETALL user:1
获取所有字段名:
HKEYS user:1
获取所有字段值:
HVALS user:1
判断字段是否存在:
HEXISTS user:1 name
删除字段:
HDEL user:1 city
字段自增:
HINCRBY user:1 age 1
字段浮点数自增:
HINCRBYFLOAT user:1 score 1.5
获取字段数量:
HLEN user:1
常见用途:
HSET article:1001 title "Redis入门" author "王铁柱" views 0
HINCRBY article:1001 views 1
HGETALL article:1001
10.6 List 列表
List 适合队列、任务列表、最近浏览记录。
左侧插入:
LPUSH tasks task1
LPUSH tasks task2
右侧插入:
RPUSH tasks task3
查看列表:
LRANGE tasks 0 -1
获取长度:
LLEN tasks
左侧弹出:
LPOP tasks
右侧弹出:
RPOP tasks
通过下标获取:
LINDEX tasks 0
裁剪列表,只保留指定范围:
LTRIM tasks 0 9
阻塞式弹出,适合简单队列:
BLPOP tasks 0
BRPOP tasks 0
0 表示一直等待。
常见队列用法:
LPUSH tasks "发送短信"
LPUSH tasks "生成报表"
RPOP tasks
10.7 Set 集合
Set 是无序、不重复集合。
添加成员:
SADD article:1:likes user:1
SADD article:1:likes user:2
SADD article:1:likes user:1
查看全部成员:
SMEMBERS article:1:likes
判断成员是否存在:
SISMEMBER article:1:likes user:1
删除成员:
SREM article:1:likes user:1
统计数量:
SCARD article:1:likes
随机取一个成员:
SRANDMEMBER article:1:likes
随机弹出一个成员:
SPOP article:1:likes
集合交集:
SINTER set1 set2
集合并集:
SUNION set1 set2
集合差集:
SDIFF set1 set2
常见用途:
SADD article:1:likes user:1 user:2
SISMEMBER article:1:likes user:1
SCARD article:1:likes
10.8 Sorted Set / ZSet 有序集合
ZSet 每个成员都有一个分数,适合排行榜。
添加成员:
ZADD rank:article 100 article:1
ZADD rank:article 80 article:2
ZADD rank:article 120 article:3
从低到高查看:
ZRANGE rank:article 0 -1 WITHSCORES
从高到低查看:
ZREVRANGE rank:article 0 -1 WITHSCORES
给成员加分:
ZINCRBY rank:article 10 article:1
查看成员分数:
ZSCORE rank:article article:1
查看从低到高排名:
ZRANK rank:article article:1
查看从高到低排名:
ZREVRANK rank:article article:1
删除成员:
ZREM rank:article article:1
获取成员数量:
ZCARD rank:article
按分数范围查询:
ZRANGEBYSCORE rank:article 80 120 WITHSCORES
删除指定排名范围:
ZREMRANGEBYRANK rank:article 0 10
删除指定分数范围:
ZREMRANGEBYSCORE rank:article 0 60
热门文章 Top 10:
ZREVRANGE hot:articles 0 9 WITHSCORES
10.9 Bitmap 位图
Bitmap 常用于签到、用户活跃统计。
设置某天签到:
SETBIT sign:user:1 0 1
SETBIT sign:user:1 1 1
SETBIT sign:user:1 2 0
获取某天是否签到:
GETBIT sign:user:1 0
统计签到次数:
BITCOUNT sign:user:1
常见用途:
用户每日签到
用户活跃天数
大规模布尔状态
10.10 HyperLogLog
HyperLogLog 用来做大规模去重计数,适合 UV 统计。
添加元素:
PFADD uv:article:1 user:1
PFADD uv:article:1 user:2
PFADD uv:article:1 user:1
统计去重数量:
PFCOUNT uv:article:1
合并多个 HyperLogLog:
PFMERGE uv:all uv:article:1 uv:article:2
10.11 Geo 地理位置
添加地理位置:
GEOADD shops 116.397128 39.916527 shop:1
GEOADD shops 116.407526 39.904030 shop:2
获取位置:
GEOPOS shops shop:1
计算距离:
GEODIST shops shop:1 shop:2 km
查询附近成员:
GEORADIUS shops 116.397128 39.916527 5 km WITHDIST
新版本更推荐:
GEOSEARCH shops FROMLONLAT 116.397128 39.916527 BYRADIUS 5 km WITHDIST
10.12 Stream 消息流
Stream 适合日志流、消息队列。
添加消息:
XADD stream:orders * order_id 1001 user_id 1
读取消息:
XRANGE stream:orders - +
从指定位置读取:
XREAD COUNT 10 STREAMS stream:orders 0
创建消费者组:
XGROUP CREATE stream:orders group1 0 MKSTREAM
消费者组读取:
XREADGROUP GROUP group1 consumer1 COUNT 10 STREAMS stream:orders >
确认消息已处理:
XACK stream:orders group1 消息ID
10.13 发布订阅 Pub/Sub
订阅频道:
SUBSCRIBE news
另开一个 Redis CLI 发布消息:
PUBLISH news "hello redis"
适合简单实时通知,但消息不会持久保存。
10.14 事务 Transaction
开启事务:
MULTI
加入命令:
SET name wangtiezhu
INCR article:1:views
执行事务:
EXEC
取消事务:
DISCARD
监听 key:
WATCH balance:user:1
常用于乐观锁场景。
10.15 Lua 脚本
Redis 支持 Lua 脚本,可以保证一组操作原子执行。
简单示例:
EVAL "return redis.call('GET', KEYS[1])" 1 name
常用于:
分布式锁释放
复杂限流
库存扣减
10.16 数据库清理命令
清空当前数据库:
FLUSHDB
清空所有数据库:
FLUSHALL
注意:这两个命令很危险,真实项目慎用。
11. Redis 常见项目场景
11.1 验证码缓存
SET verify:phone:13800138000 9527 EX 300
GET verify:phone:13800138000
含义:
手机号 13800138000 的验证码是 9527,5 分钟后过期
11.2 登录 token
SET token:abc123 user:1 EX 7200
GET token:abc123
含义:
token abc123 对应 user:1,2 小时后过期
11.3 文章阅读量
INCR article:1:views
GET article:1:views
11.4 文章详情缓存
SET cache:article:1 '{"title":"Redis入门","author":"王铁柱"}' EX 60
GET cache:article:1
11.5 点赞
SADD article:1:likes user:1
SISMEMBER article:1:likes user:1
SCARD article:1:likes
SREM article:1:likes user:1
11.6 收藏
SADD user:1:favorites article:1001
SMEMBERS user:1:favorites
SREM user:1:favorites article:1001
11.7 热门文章排行榜
ZINCRBY hot:articles 1 article:1001
ZREVRANGE hot:articles 0 9 WITHSCORES
11.8 简单限流
例如限制用户 60 秒内访问 10 次。
INCR rate:user:1
EXPIRE rate:user:1 60
GET rate:user:1
实际项目中需要注意原子性,可以用 Lua 脚本实现。
11.9 防止重复提交
SETNX submit:order:1001 user:1
EXPIRE submit:order:1001 30
更推荐:
SET submit:order:1001 user:1 NX EX 30
11.10 分布式锁基础写法
加锁:
SET lock:order:1001 request_id_123 NX EX 30
释放锁时不能直接 DEL,需要判断 value 是否等于自己的 request_id,通常用 Lua 脚本保证原子性。
12. 常见报错和解决
12.1 Docker 报 failed to connect to docker API
报错类似:
failed to connect to the docker API
check if the daemon is running
原因:
Docker Desktop 没启动
Docker 引擎没运行
WSL2/Docker Desktop 配置异常
解决:
- 打开 Docker Desktop
- 等左下角显示 Engine running
- 再执行:
docker ps
12.2 PyCharm Redis 连接失败
报错:
Failed to connect to any host resolved for DNS name
常见原因:
- Redis 容器没启动
- Redis 容器没有端口映射
- host 写错
- 6379 端口被占用
- Docker Desktop 没运行
排查:
docker ps
必须看到:
0.0.0.0:6379->6379/tcp
测试:
docker exec -it redis redis-cli ping
Test-NetConnection localhost -Port 6379
PyCharm 里可以试:
localhost
或者:
127.0.0.1
12.3 docker run 后 PORTS 只有 6379/tcp
说明没有映射端口。
错误状态:
6379/tcp
正确状态:
0.0.0.0:6379->6379/tcp
解决:
docker rm -f redis
docker run -d --name redis -p 6379:6379 redis:latest
12.4 port is already allocated
说明本机端口已经被占用。
例如:
Bind for 0.0.0.0:6379 failed: port is already allocated
解决方案一:删除旧 Redis 容器
docker rm -f redis
docker rm -f teamx-redis
docker run -d --name redis -p 6379:6379 redis:latest
解决方案二:换本机端口
docker run -d --name teamx-redis -p 6380:6379 redis:7
连接时使用:
localhost:6380
12.5 Image redis:latest is in use
说明你正在删除 Redis 镜像,但它被某个容器使用。
解决:
docker ps -a --filter ancestor=redis:latest
docker rm -f 容器名或容器ID
docker rmi redis:latest
12.6 redis 不是内部或外部命令
你在 PowerShell 执行:
redis -V
redis-cli ping
可能会报找不到命令。
原因:
你没有在 Windows 本机安装 Redis CLI
pip install redis 只是安装 Python 客户端库
推荐用:
docker exec -it redis redis-cli ping
12.7 PowerShell 无法激活 .venv
报错:
无法加载文件,因为在此系统上禁止运行脚本
解决:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
然后:
.\.venv\Scripts\Activate.ps1
13. 推荐练习路线
第一步:确认 Redis 跑起来
docker ps
docker exec -it redis redis-cli ping
看到:
PONG
第二步:练 String
SET name wangtiezhu
GET name
SET code 123456 EX 60
TTL code
INCR article:1:views
GET article:1:views
第三步:练 Hash
HSET user:1 name "张三" age 20 city "北京"
HGET user:1 name
HGETALL user:1
HINCRBY user:1 age 1
第四步:练 List
LPUSH tasks task1 task2 task3
LRANGE tasks 0 -1
RPOP tasks
第五步:练 Set
SADD article:1:likes user:1 user:2 user:1
SMEMBERS article:1:likes
SISMEMBER article:1:likes user:1
SCARD article:1:likes
第六步:练 ZSet
ZADD rank 100 tom 200 jack 150 lucy
ZREVRANGE rank 0 -1 WITHSCORES
ZINCRBY rank 50 tom
ZREVRANK rank tom
第七步:Python 测试
import redis
client = redis.Redis(
host="localhost",
port=6379,
db=0,
decode_responses=True,
)
print(client.ping())
client.set("hello", "redis")
print(client.get("hello"))
第八步:FastAPI 实战
建议做 3 个接口:
1. 文章阅读量 +1
2. 手机验证码缓存 5 分钟
3. 文章详情缓存 60 秒
掌握这三个之后,后面做用户登录、新闻缓存、点赞收藏、排行榜、限流都会很顺。
14. 常用命令速查表
Docker Redis
docker run -d --name redis -p 6379:6379 redis:latest
docker ps
docker ps -a
docker start redis
docker stop redis
docker restart redis
docker rm -f redis
docker exec -it redis redis-cli ping
docker exec -it redis redis-cli
Python venv
python -m venv .venv
.\.venv\Scripts\Activate.ps1
deactivate
python -m pip install --upgrade pip
python -m pip install -r requirements.txt
where python
python --version
指定 Python 版本
py -0p
py -3.11 --version
py -3.11 -m venv .venv
py -3.10 -m venv .venv
Redis 基础
PING
INFO
DBSIZE
SELECT 0
KEYS *
SCAN 0
EXISTS key
TYPE key
DEL key
EXPIRE key 60
TTL key
FLUSHDB
FLUSHALL
Redis String
SET key value
GET key
SET key value EX 60
SET key value NX EX 30
INCR key
DECR key
INCRBY key 10
APPEND key value
STRLEN key
Redis Hash
HSET user:1 name "张三" age 20
HGET user:1 name
HMGET user:1 name age
HGETALL user:1
HDEL user:1 age
HINCRBY user:1 age 1
HLEN user:1
Redis List
LPUSH tasks task1
RPUSH tasks task2
LRANGE tasks 0 -1
LPOP tasks
RPOP tasks
LLEN tasks
LTRIM tasks 0 9
Redis Set
SADD likes user:1
SMEMBERS likes
SISMEMBER likes user:1
SREM likes user:1
SCARD likes
SINTER set1 set2
SUNION set1 set2
SDIFF set1 set2
Redis ZSet
ZADD rank 100 tom
ZRANGE rank 0 -1 WITHSCORES
ZREVRANGE rank 0 -1 WITHSCORES
ZINCRBY rank 10 tom
ZSCORE rank tom
ZRANK rank tom
ZREVRANK rank tom
ZREM rank tom
ZCARD rank
15. 我的建议
你目前最应该记住这几句话:
1. Docker Images 是镜像,Containers 是正在运行的容器。
2. PyCharm 要连接 Redis,Docker 必须有 6379:6379 端口映射。
3. PowerShell 测试 Redis 用 docker exec -it redis redis-cli ping。
4. Python 项目最好用虚拟环境隔离依赖。
5. 切换项目 Python 版本,推荐重新创建虚拟环境。
6. Redis 学习重点先掌握 String、Hash、List、Set、ZSet。