以下代码示例将通过 Python REPL 和 redis-cli 完成/编写。
Redis 服务器 v=2.8.4
背景:将长时间运行的键(哈希)存储在 Redis 键值存储中,然后尝试将另一个键(具有相同名称,但不同类型 - 字符串)存储在同一键值存储中。
首先是代码,然后是问题:
>>> import redis
>>> db = redis.Redis(
... host='127.0.0.1',
... port=6379,
... password='',
... db=3)
>>> db.hset("123456", "field1", True)
1
>>> db.type("123456")
b'hash'
>>> db.hgetall("123456")
{b'field1': b'True'}
>>> db.set("123456", "new-value")
True
>>> db.type("123456")
b'string'
>>> db.get("123456")
b'new-value'
Run Code Online (Sandbox Code Playgroud)
您首先会注意到 SET 选项覆盖了 HSET。现在,当我尝试用以下内容覆盖 SET 时:
>>> db.lset("123456", "list1", "list1value")
Traceback (most recent call last):
...
redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value
WRONGTYPE Operation against a key holding the wrong kind of value
Run Code Online (Sandbox Code Playgroud)
或者用相同的 HSET 替换 SET:
>>> db.hset("123456", "field1", True)
Traceback (most recent call last):
...
redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value
WRONGTYPE Operation against a key holding the wrong kind of value
Run Code Online (Sandbox Code Playgroud)
为了确保这不是 redis-py 缺陷,我在 redis-cli 中进行了测试:
127.0.0.1:6379> HSET 12345 "field" "value1"
(integer) 0
127.0.0.1:6379> TYPE 12345
hash
127.0.0.1:6379> SET 12345 "newvalue"
OK
127.0.0.1:6379> TYPE 12345
string
127.0.0.1:6379> HSET 12345 "field" "value1"
(error) WRONGTYPE Operation against a key holding the wrong kind of value
Run Code Online (Sandbox Code Playgroud)
问题:
1)这是 Redis 的缺陷还是它实际上应该是这样工作的?
2)如果这是“它应该如何工作”,为什么我不能用其他类型覆盖SET类型?
** 编辑:由于回答问题的人不明白3)..我正在编辑它
3)除了SET之外,我还可以使用哪种其他类型在结构(KEY,VALUE)中存储字符串,其中我还可以将散列作为(KEY,FIELD,VALUE) - 其中键相同但类型不同( s)?
例如。我想要做:
127.0.0.1:6379> HSET 12345 "field" "value1"
(integer) 0
127.0.0.1:6379> TYPE 12345
hash
127.0.0.1:6379> SOME-COMMAND 12345 "newvalue"
OK
Run Code Online (Sandbox Code Playgroud)
这样我就有 1 个哈希值和 1 个“其他”类型的相同“密钥”12345
| 归档时间: |
|
| 查看次数: |
12443 次 |
| 最近记录: |