Skip to content

[BUG]tiny-rdm自动trim空格导致Redis操作结果与标准客户端不一致 #530

@vvxf

Description

@vvxf

Tiny RDM Version

v1.2.5

OS Version

Windows 10

Redis Version

7.0.15

Describe the Bug

在使用 tiny-rdm 管理 Redis 时,当键名或键值包含前导或尾随空格时,这些空格会被意外移除,导致数据存储和操作行为与标准 Redis 客户端不一致。

Steps to Reproduce

1. 字符串键值测试

使用 tiny-rdm 设置键值:set test1 " leading" (包含前导空格)
使用 redis-cli 读取:返回 "leading" (空格被移除)
而使用 redis-cli 直接设置和读取时,空格会保留

2. 列表操作测试

使用 tiny-rdm 创建列表:rpush mylist " item1"rpush mylist "item2 "rpush mylist " item3 "
使用 redis-cli 读取时,所有空格都被移除
当尝试执行 linsert mylist before "item2 " " newitem" 时操作失败,因为实际存储的值是 "item2" (无空格)

3. 集合测试

使用 tiny-rdm 添加集合元素:sadd myset " element1"sadd myset "element2 "sadd myset " element3 "
使用 redis-cli 读取时,所有空格都被移除
这导致带空格的元素实际上无法正确添加或检索

4. 哈希测试

使用 tiny-rdm 设置哈希字段:hset myhash field1 " value1"hset myhash " field4" "test"
字段名和字段值中的空格都被移除
当字段名包含空格时,实际存储的字段名被修改,导致后续操作失败

5. 有序集合测试

使用 tiny-rdm 添加有序集合元素:zadd myzset 1 " member1"zadd myzset 2 "member2 "zadd myzset 3 " member3 "
使用 redis-cli 读取时,所有空格都被移除
这导致带空格的成员实际上无法正确添加或检索

6. APPEND命令测试

使用 tiny-rdm 执行 append key " value"append key "value "append key " value "时,空格会被移除,导致追加的值不正确

测试场景

场景1: tiny-rdm 设置,redis-cli 读取

# tiny-rdm 中执行
set test1 " leading"
# redis-cli 中读取
get test1
# 结果: "leading" (空格丢失)

场景2: redis-cli 设置,tiny-rdm 读取

# redis-cli 中执行
set key " value "
# tiny-rdm 中读取
get key
# 结果: " value " (空格保留,因为这是实际存储的值)
# 但如果后续在 tiny-rdm 中修改,空格又会被移除

根本原因

1. 前端自动 trim 处理

NewKeyDialog.vueonAdd 函数中:

await browserStore.setKey({
    server,
    db,
    key: trim(key),  // 自动 trim 键名
    keyType: type,
    value,  // 值可能在其他地方也被 trim 了
    ttl,
})

2. 命令构建时 trim

NewKeyDialog.vueonAdd 函数中:

export const joinCommand = (path, args = [], emptyContent = '-') => {
    let cmd = ''
    path = trim(path)  // trim 命令路径
    // ...
    for (let part of args || []) {
        part = trim(part)  // trim 所有参数
        // ...
    }
}

影响

  • 数据一致性破坏:相同的操作在不同客户端产生不同的结果
  • 操作失败:依赖精确值匹配的操作(如 linsert、sismember)会失败
  • 数据丢失:用户有意存储的空格被意外移除
  • 字段名冲突:哈希中带空格的字段名被修改,可能导致冲突

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