Redis - SET覆盖其他类型

时间:2016-12-23 02:27:49

标签: redis redis-py

以下代码示例将通过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'

您将首先注意到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)如果这是"它应该如何工作",为什么我不能用其他人覆盖SET类型?

**编辑:由于回答问题的人不明白3)..我正在编辑

3)除了SET,还可以使用哪种其他类型来存储结构中的STRING(KEY,VALUE),其中我也可以将HASH作为(KEY,FIELD,VALUE) - 其中键是相同的但是不同的TYPE(s)?

EG。我想这样做:

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"其他"类型相同"键" 12345

1 个答案:

答案 0 :(得分:2)

  1. 这是设计行为,SET文档中的第二句是。
  2.   

    如果key已经拥有一个值,则无论其类型如何,都会被覆盖。

    1. 不,只有SET具有该权力,其他命令在出现错误类型的值时会出错。

    2. 抱歉,没有关注你。