Redis.from_url()连接redis时,redis密码带有#号报错

# 在 URL 中是片段标识符(Fragment Identifier)的开始标志,如果不处理,# 后面的内容会被浏览器或解析器直接忽略,导致密码被截断,连接失败。


❌ 错误示例(会出问题)

python 复制代码
# ❌ 这样写,实际密码会变成 "abc",后面的内容全部丢失
Redis.from_url("redis://:abc#123@localhost:6379/0")

实际解析结果:

  • 你以为的密码:abc#123
  • 实际解析到的密码:abc
  • #123 被当成了 URL 的 fragment,直接丢弃

✅ 正确做法:URL 编码(Percent-Encoding)

# 的 URL 编码是 %23

python 复制代码
from redis import Redis

# ✅ 正确写法
redis_client = Redis.from_url("redis://:abc%23123@localhost:6379/0")

🔧 推荐:使用 urllib 自动编码(最稳妥)

如果是从配置文件、环境变量里读密码,强烈建议用代码自动编码,避免手写出错。

python 复制代码
from urllib.parse import quote_plus
from redis import Redis

password = "abc#123"
encoded_password = quote_plus(password)

url = f"redis://:{encoded_password}@localhost:6379/0"
redis_client = Redis.from_url(url)

redis_client.ping()
print("✅ 连接成功")

📌 常见需要编码的特殊字符速查表

字符 含义 URL 编码
# 片段标识 %23
@ 分隔符 %40
: 分隔符 %3A
/ 路径分隔 %2F
% 本身 %25
+ 空格 %2B
(空格) 空格 %20

👉 只要密码里有非字母数字字符,都建议直接 quote_plus()


✅ 更推荐的写法(避免 URL 拼接问题)

如果你不想折腾 URL 编码,直接用参数方式(内部会自动处理):

python 复制代码
from redis import Redis

redis_client = Redis(
    host="localhost",
    port=6379,
    db=0,
    password="abc#123",   # ✅ 原样写,最安全
    decode_responses=True
)

📌 生产环境强烈推荐这种方式,可读性最好,坑最少。


🐳 Docker / Kubernetes / 云环境注意事项

如果是从环境变量读取:

python 复制代码
import os
from urllib.parse import quote_plus
from redis import Redis

raw_password = os.getenv("REDIS_PASSWORD")  # abc#123
redis_client = Redis.from_url(
    f"redis://:{quote_plus(raw_password)}@redis:6379/0"
)

✅ 总结一句话

Redis 密码里有 #,必须 URL 编码成 %23,否则密码会被截断。

最佳实践:不用 from_url() 拼密码,改用 Redis(password="xxx") 参数方式。

相关推荐
谷哥的小弟1 天前
腾讯云服务器安装Redis Stack图文教程
服务器·redis·腾讯云·redis stack
NeilYuen1 天前
【vemory】高性能KV存储AOF方案设计
linux·c++·redis·缓存
spter。1 天前
Redis 与 Single-flight 的分工与协作
数据库·redis·缓存
小林ixn1 天前
用 Next.js 和 Redis 撸一个 Markdown 笔记系统:RSC 实战与组件化拆解
前端·redis·next.js
北漂燕郊杨哥1 天前
Win11 环境下 phpStudy 安装 Redis 最新版,并为 PHP 8.5.9(NTS)配置 redis 扩展
数据库·redis·php
天疆说2 天前
01 硬件选型与 llama.cpp 部署:4× RTX 5880 Ada 跑 DeepSeek-V4-Flash
java·redis·llama
嘟嘟07172 天前
Next.js 博客左侧笔记列表是怎么从 Redis 渲染出来的?从组件、children 到动态路由一次讲清
redis·react.js·前端工程化
Rain的Java大神之路2 天前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Amir_zy2 天前
Redis测试方法全攻略:冒烟、压测与稳定性验证
redis·压力测试
霸道流氓气质2 天前
RedLock:Redis 分布式锁的高可用方案
数据库·redis·分布式