【问题标题】:Redis - SET overwriting other typesRedis - SET覆盖其他类型
【发布时间】:2016-12-23 02:27:48
【问题描述】:

以下代码示例将通过 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 之外,我还可以使用哪种其他类型在结构 (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 个“其他”类型的相同“密钥”12345

【问题讨论】:

  • 那么,为什么不在设置密钥之前发出 DEL 呢?

标签: redis redis-py


【解决方案1】:
  1. 这是设计的行为,SET 的文档中的第二句是。

如果 key 已经包含一个值,则无论其类型如何,都会将其覆盖。

  1. 不,只有SET 有这种能力,其他命令在显示错误类型的值时会出错。

  2. 抱歉,没有关注你。

【讨论】:

  • 一个键只能有一种值类型:字符串、哈希、列表、集合。如果要对底层数据结构进行收费,先DELkey,然后将新值存入其中。
  • @experiment 请不要叫我先生,先生。我没有答案,但尝试协助发表评论。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 2012-09-02
  • 2020-10-06
相关资源
最近更新 更多