Redis - SET覆盖其他类型
Redis - SET overwriting other types
以下代码示例将 done/written 通过 Python REPL 和 redis-cli。
Redis server v=2.8.4
背景:在redis键值存储中存储一个long-运行键(散列),然后试图在同一个键中存储另一个键(具有相同的名称,但类型不同——字符串) -价值存储。
首先是代码,然后是问题:
>>> 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'
您首先会注意到 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
或用相同的 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
为了确保这不是 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
问题:
1) 这是 Redis 中的缺陷还是它实际上应该如何工作?
2)如果是"how it is supposed to work",为什么不能用其他的SET类型覆盖?
** 编辑:由于回答问题的人没看懂 3) .. 我正在编辑它
3) 除了 SET 之外,我还可以使用哪种其他类型在结构 (KEY, VALUE) 中存储 STRING,我还可以将 HASH 作为 (KEY, FIELD, VALUE) - 其中键是相同的但类型不同?
例如。我想做:
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
所以我有 1 个散列和 1 个 "other" 类型相同 "key" 12345
- 这是设计行为,
SET
文档中的第二句是。
If key already holds a value, it is overwritten, regardless of its type.
不,只有SET
有这个能力,其他命令在输入错误类型的值时会出错。
抱歉,没有关注你
以下代码示例将 done/written 通过 Python REPL 和 redis-cli。
Redis server v=2.8.4
背景:在redis键值存储中存储一个long-运行键(散列),然后试图在同一个键中存储另一个键(具有相同的名称,但类型不同——字符串) -价值存储。
首先是代码,然后是问题:
>>> 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'
您首先会注意到 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
或用相同的 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
为了确保这不是 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
问题:
1) 这是 Redis 中的缺陷还是它实际上应该如何工作?
2)如果是"how it is supposed to work",为什么不能用其他的SET类型覆盖?
** 编辑:由于回答问题的人没看懂 3) .. 我正在编辑它
3) 除了 SET 之外,我还可以使用哪种其他类型在结构 (KEY, VALUE) 中存储 STRING,我还可以将 HASH 作为 (KEY, FIELD, VALUE) - 其中键是相同的但类型不同?
例如。我想做:
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
所以我有 1 个散列和 1 个 "other" 类型相同 "key" 12345
- 这是设计行为,
SET
文档中的第二句是。
If key already holds a value, it is overwritten, regardless of its type.
不,只有
SET
有这个能力,其他命令在输入错误类型的值时会出错。抱歉,没有关注你