Redis + Docker + PyCharm + Python 虚拟环境学习笔记

Redis + Docker + PyCharm + Python 虚拟环境学习笔记

2026/6/23
Project Learning RedisDockerPyCharmPythonFastAPI

Redis + Docker + PyCharm + Python 虚拟环境学习笔记

适用场景:Windows + PowerShell + Docker Desktop + PyCharm + FastAPI 项目
目标:能用 Docker 启动 Redis,能在 PyCharm 连接 Redis,能在 Python/FastAPI 项目中使用 Redis,并掌握常用 Redis 命令。


目录

  1. Redis 是什么
  2. Docker 里的 Image 和 Container 区别
  3. 用 Docker 启动 Redis
  4. PowerShell 测试 Redis 连接
  5. PyCharm 连接 Docker Redis
  6. Python 虚拟环境 venv
  7. 切换本地 Python 版本
  8. Python 操作 Redis
  9. FastAPI 中使用 Redis
  10. Redis 常用命令大全
  11. Redis 常见项目场景
  12. 常见报错和解决
  13. 推荐练习路线

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 后,可以用 localhost127.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 有多个逻辑数据库,常见编号是 015


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 配置异常

解决:

  1. 打开 Docker Desktop
  2. 等左下角显示 Engine running
  3. 再执行:
docker ps

12.2 PyCharm Redis 连接失败

报错:

Failed to connect to any host resolved for DNS name

常见原因:

  1. Redis 容器没启动
  2. Redis 容器没有端口映射
  3. host 写错
  4. 6379 端口被占用
  5. 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。