Skip to content

[Bug]: Redis数据key含有非法utf-8字符时,报错 Cannot convert from UTF-8- TypeError #485

Open

Description

@Ezi1h

发生了什么?/ What happened?

加载redis的数据列表时,如果key包含非法utf-8的字符,例如使用了jdk原生序列化,会报错,如下图用Resp(另外一款redis gui工具)打开是没问题的,但是navop就无法加载key列表

Image
Image

navop日志如下:

2026-10-29T09:29:26.815347Z ERROR redis_view::redis_tree_view: redis_view: key scan failed (connection=248, db=2, cursor=0, append=false, pattern=*): Command error: SCAN 失败。: Cannot convert from UTF-8- TypeError

如何复现?/ How can we reproduce it?

加载redis的数据列表时,如果key包含非法utf-8的字符稳定复现报错。

版本与系统 / Version and system

Navop 0.22.0,Windows11

截图、日志或其他信息 / Screenshots, logs, or anything else

No response

Activity

  1. feigeCode commented on Oct 31, 2026

    @feigeCode
    Owner

    已修复,改动在 dev 分支(e982a939e),会随下一个版本发布。

    原因:Redis 的 SCAN / KEYS 回复原先按 Vec<String> 解析,redis-rs 会对每个键做严格 UTF-8 校验;遇到 JDK 序列化等二进制键就直接抛 TypeError: Cannot convert from UTF-8,导致整页列表加载失败(日志里的 key scan failed)。

    修法:新增二进制安全的 key 编解码(crates/redis-runtime/src/key_codec.rs)——普通文本键原样透传,二进制键以 \xNN 转义形态显示;列表按字节解析,所有下发命令的入口(查看、改 TTL、重命名、删除等)在命令边界还原成真实字节。所以这类键现在能正常列出、点开查看和删除。

    验证:cargo test -p redis-runtime 32 passed(含真实 Redis 上的端到端用例:写入二进制键 → SCAN 列出 → 打开读到值 → DEL 成功 → 再扫不到),cargo test -p redis_view --lib 80 passed。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions