REDIS 错误:WRONGTYPE 针对持有错误类型值的键进行操作

Nyx*_*nyx 6 python redis python-3.x

当我像这样将对象存储到 Redis 时,它工作得很好

payload = {'age': 12}
key = 'animals:cow'
r.hmset(key, payload)
Run Code Online (Sandbox Code Playgroud)

但是,当我通过连接 2 个字符串创建密钥时

payload = {'age': 12}
key = 'animals:' + 'cow'
r.hmset(key, payload)
Run Code Online (Sandbox Code Playgroud)

我收到错误

redis.exceptions.ResponseError:针对持有错误类型值的键的 WRONGTYPE 操作

key当字符串与第一个示例中的字符串相同时,为什么第二个示例会给出错误?

Jas*_*n F 1

我无法复制你的问题。也许您正在混合字符串和哈希方法?这是我的环境:

  • Python 3.6.5
  • Redis 稳定版 5.0.5

我使用了你的确切代码,但我在上面添加了这个:

from redis import StrictRedis
r = StrictRedis(host="localhost", port=6379, db=0)
Run Code Online (Sandbox Code Playgroud)

-你的代码对我有用!
-也许你在 hmset 之前使用了不同的 set 方法?
-Redis 不仅仅是一个普通的键值存储;在传统的键值存储中,我们将字符串键与字符串值相关联。然而,Redis 为我们提供了一些额外的选项,这些选项之间的不兼容可能会导致错误。 https://redis.io/topics/data-types-intro
- 除非您有隐藏字符或不一样的特殊 unicode 版本,否则 #1 和 #2 之间没有区别:
1. key = 'animals:cow'
2.key = 'animals:' + 'cow'

由于您未共享代码中的元素,您可能会与 Redis 发生类型冲突;即也许您设置了一种方式,然后尝试设置另一种方式。在 Redis 中设置值的方法有很多种。如果我们设置一种方式,然后设置另一种方式(使用不同的方法),就会发生错误。以下是如何在 Redis 中设置键和值的一些示例:

  • 如果值是字符串类型 -> SET<key> <value>
  • 如果值是字符串类型 -> MSET<key> <value> [key value ...]
  • 如果值是 hash 类型 -> HSET<key> <field> <value>
  • 如果值是 hash 类型 -> HMSET<key> <field> <value> [field value ...]
  • 如果值是列表类型 -> SETRANGE<key> <offset> <value>
  • 如果值是二进制类型 ->SETBIT <key> <offset> <value>

尝试获取以不同方式设置的内容时出现的相关问题: WRONGTYPE Operation against a keyholding the bad kind of value php