Redis连接老是乱码咋整,解决方案分享和经验总结
- 问答
- 2026-01-10 09:30:55
- 1
这个问题我遇到过太多次了,尤其是在不同系统、不同语言之间和Redis打交道的时候,屏幕上突然冒出来一堆看不懂的乱码,或者存进去的中文取出来变成了问号,真的很让人头疼,经过好几次踩坑和填坑,我总结了一下,乱码问题八九不离十是出在“字符编码”这个环节上,下面我就把常见的坑和解决的办法直接分享出来。
第一个大坑,也是最常见的:客户端和Redis服务器之间的编码没对上。
你可以把Redis理解成一个只会说一种方言的人,比如它默认只听得懂、说得出“UTF-8”这种话,UTF-8是一种能表示全世界几乎所有文字的编码方式,现在基本上是国际标准了。
你的客户端程序(比如你用Java、Python、PHP写的代码)要跟Redis说话的时候,如果它自己用的是另一种方言,比如在中国大陆地区比较古老的“GBK”或“GB2312”编码,那问题就来了,你用一个说GBK的客户端,对着一个只说UTF-8的Redis服务器喊话:“帮我存一下‘你好’这个词!”,Redis听到的其实是一串它无法直接理解的字节,它很老实,不管听不听得懂,都把这串字节原封不动地存起来了,等你换一个程序(或者同一个程序但编码设置正确了)去取数据时,这个客户端用UTF-8的方式去解读当初那串用GBK编码的字节,解压出来的自然就是一堆乱码。
怎么解决这个“语言不通”的问题呢?办法很简单:统一语言。
根据资料[比如一些技术博客和论坛的讨论],核心思路是确保你的应用程序在向Redis写入数据和从Redis读取数据时,都使用同一种字符编码,并且强烈建议使用UTF-8。
-
检查你的应用程序代码: 这是最关键的一步,你需要在你用的Redis客户端库或者你的代码全局设置中,明确指定字符编码为UTF-8。
- 举个Python的例子: 如果你用
redis-py这个库,你在创建Redis连接对象的时候,可以(虽然不是必须,因为新版本通常默认就是UTF-8)通过decode_responses=True这个参数来确保返回的是字符串(UTF-8解码后的),而不是原始的字节,如果你在处理非文本数据(如图片),就不要用这个参数。 - 举个Java的例子(使用Jedis库): 在Java中,字符串本来就是Unicode的,但当你从Jedis获取到字节数组后,你需要用
new String(bytes, "UTF-8")来明确指定用UTF-8解码,更佳实践是配置Jedis池时使用正确的编码。 - 核心就是: 找到你所用编程语言的Redis客户端库的文档,查一下怎么设置字符编码,把它设成UTF-8。
- 举个Python的例子: 如果你用
-
检查你的终端或命令行工具: 如果你是在Linux的Shell或者Windows的CMD、PowerShell里直接用
redis-cli命令连接Redis,然后手动输入中文值,取出来也是乱码,那很可能是你的终端本身的编码不是UTF-8。- Linux/Mac: 通常终端默认支持UTF-8,问题不大,如果不确定,可以看看终端的设置选项。
- Windows CMD: 这是个重灾区,古老的CMD默认编码是GBK,你可以在CMD里输入
chcp命令查看当前代码页,936代表GBK,一个临时的解决办法是先用chcp 65001命令切换到UTF-8代码页,再启动redis-cli,但CMD对UTF-8支持不好,可能显示还是有问题。强烈建议使用更现代化的终端,比如Windows Terminal,或者Git Bash,它们对UTF-8的支持好得多。
第二个坑,容易被忽略:数据传输过程中的转码问题。
你的代码和Redis本尊都没问题,但中间可能隔着一个“翻译官”,这个翻译官自作主张地进行了转码,你的应用服务器和Redis服务器之间有一个代理(Proxy)或者网关(Gateway),如果这个中间件的配置不正确,也可能在转发数据时破坏编码。
这种情况相对少见,但如果你排查了所有客户端设置都无效,可以沿着网络路径检查一下是否有这样的中间件,并查看其配置。
第三个情况,不是乱码,但看起来像乱码:Redis的键名本身有空格或特殊字符。
如果你在redis-cli里输入一个带空格的键,比如KEYS my key,这是不对的,因为空格会被解析成命令参数的分隔符,正确的做法是加引号,比如KEYS "my key",如果你不加引号,命令执行报错或者找不到键,可能会被误认为是乱码问题,在命令行里操作带特殊字符的键,最好都用双引号包起来。
经验总结一下:
- 首选UTF-8: 把UTF-8作为整个项目(包括数据库、前端、后端、终端)的统一编码标准,能从根源上避免绝大多数乱码问题。
- 客户端配置是重点: 95%的Redis乱码问题,都是由于客户端库没有正确配置为UTF-8编码导致的,仔细检查你的代码。
- 终端环境要留意: 在命令行下操作时,确保你的终端模拟器支持并设置为UTF-8编码,放弃使用古老的Windows CMD,拥抱更现代化的终端工具。
- 分清数据和序列化: 有时候你存进Redis的不是简单字符串,而是一个被序列化(比如用JSON、Pickle等工具打包)了的复杂对象,你要确保在序列化和反序列化的过程中,编码也是一致的,用Python的json.dumps()序列化时,可以明确指定
ensure_ascii=False来保证中文字符能正确存储。 - 排查顺序: 先易后难,先从自己的应用程序代码和本地终端查起,然后再考虑网络环境等更复杂的因素。
希望这些直接的经验分享能帮你快速解决Redis的乱码烦恼,说到底,就是让所有参与数据交换的环节都“说同一种语言”——UTF-8,世界就清净了。

本文由符海莹于2026-01-10发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/77984.html
