跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Python中如何实现异步Redis操作_通过aioredis库提升缓存读写吞吐量

aioredis 3.x 必须用 from_url 或 ConnectionPool 初始化,裸字符串会报 TypeError;不设 decode_responses=True 则 GET 返回 bytes 易致逻辑崩溃。 aio redis 3.x 必须用
from_url
或
ConnectionPool
初始化,裸字符串会直接报
TypeError: expected str, bytes or os.PathLike object
;不设
decode_responses=True
的话所有
GET
返回
bytes
,容易漏掉
.decode()
导致后续逻辑崩溃。 连接初始化必须用 from_url 或 ConnectionPool 很多人照着旧教程写
redis = aioredis.Redis("redis://localhost")
,运行就挂。aioredis 3+ 已移除对裸 URL 字符串的构造支持,必须显式走连接池路径。
from_url
是最简方式,推荐用于大多数场景:
redis = aioredis.from_url("redis://localhost:6379/0", decode_responses=True)
若需精细控制连接池参数(如
max_connections
、
retry_on_timeout
),用
ConnectionPool
:
pool = aioredis.ConnectionPool.from_url("redis://localhost", max_connections=20, retry_on_timeout=True) redis = aioredis.Redis(connection_pool=pool, decode_responses=True)
记得在应用退出时调用
pool.disconnect()
,否则可能残留未关闭连接 decode_responses=True 不是可选项,是刚需 默认返回
bytes
,而 Python 字符串操作(比如
json.loads()
、
str.startswith()
)全都不接受
bytes
。不加这个参数,等于每处
get
后都要手动
.decode("utf-8")
,极易遗漏或错解编码。 加了
decode_responses=True
,
await redis.get("key")
直接返回
str
类型 它只影响响应体解码,不影响命令参数(
set("k", "v")
中的
"v"
仍会被自动编码) 如果某些 key 存的是二进制数据(如图片 base64),那就不要全局设这个,改用单次调用加
decode_responses=False
别在每次请求里 new 一个 Redis 实例 每个
aioredis.Redis
实例背后都绑着一个连接池。反复创建实例 ≠ 复用连接,反而会堆积空闲连接、耗尽 fd、拖慢 DNS 解析。 Python 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载 立即学习 “ Python免费学习笔记(深入) ”; Web 应用中应作为全局单例或通过依赖注入容器管理(如 FastAPI 的
Depends
) 测试时若需隔离,可用
aioredis.from_url("redis://localhost/15")
指定临时 DB,而不是新建实例 连接断开后,
await redis.ping()
不会自动重连;建议在关键路径前加健康检查,失败则重建实例或触发告警 Pipeline 和普通操作的 async with 用法完全不同
async with redis as conn:
这种写法只对
aioredis.Pipeline
有效,对
Redis
实例本身无效——会抛
AttributeError: __aenter__
。 普通读写:直接
await redis.get(...)
,无需上下文管理 Pipeline 才需要
async with redis.pipeline() as pipe:
,确保原子提交和连接复用 批量操作优先用
mget
/
mset
,比循环
await get
快 3–5 倍,也减少事件循环调度压力
ex=0
不是“永不过期”,而是立刻过期;要永不过期,传
ex=None
真正难的不是写对第一行
from_url
,而是把连接生命周期、错误兜底、编码一致性这些细节嵌进整个服务的启动/销毁/重试流程里——漏掉任意一环,压测时都会突然卡住或返回乱码。

相关文章