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