如何在Redis中从hmset()切换到hset()?

13

我收到了Redis.hmset()已经弃用的警告,应该使用Redis.hset()代替。

但是hset()需要一个第三个参数,我不知道name应该填什么。

info = {'users': 10, "timestamp": datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')}
r.hmset("myKey", info)

上述方法可行,但需要一个名为 name 的第一个参数。

r.hset(name, "myKey", info)

在文档中比较hsethmset,我感到不太清楚。


1
你可以使用 hset("myKey", mapping=info) - chash
抱歉,它似乎不接受。 - Houman
似乎 mapping kwarg 是在 3.5.0 版本中添加的(2020 年 4 月 29 日)。如果您的版本较旧,则需要按照 @Ersoy 的建议进行操作。 - chash
@hmm 可能与库的 min-redis 版本有关。自Redis v4.0.0以来,HSET支持多个字段/值对。 - Ersoy
是的,抱歉,将lib更新到redis-3.5.2版本后,PyCharm中的警告消失了。现在我不知道该接受哪个答案了。两个都是正确的。为了清晰起见,我选择Ersoy的答案。谢谢你们俩。 - Houman
1
我会给@hmm点赞,期待更多更新 :) - Houman,不用谢。 - Ersoy
4个回答

14
问题在于必须在 hset() 中明确指定你正在提供映射。在你的情况下:
r.hset("myKey", mapping=info)

替代

r.hset("myKey", info)

3
这应该是正确的答案 - 问题的目标是在一个调用中设置多个字段,而不是如何逐个设置每个字段。 - russellthehippo

11

hmset(name, mapping): 给定一个哈希表名字("myKey")和一个字典(info),设置所有的键值对。

hset(name, key=None, value=None, mapping=None): 给定一个哈希表名字("myKey")、一个键和一个值,设置该键的值。或者,给定一个字典(mapping=info),设置字典中所有的键值对到哈希表中。

来源:https://redis-py.readthedocs.io/en/stable/

如果这些方法不能正常工作,也许您需要更新库?


1
这在技术上是正确的,但不如David Cano的答案清晰。 - russellthehippo

4
我将使用Redis.hmset()如下:

我正在使用Redis.hmset()

redis.hmset('myKey', info)

如果您使用Redis.hset(),则不会收到以下警告。
redis.hset('myKey', key=None, value=None, mapping=info)

使用这种方法,我们将跳过单个键和值的添加步骤,redis.hset()将把info中的所有keyvalue映射设置为myKey

1
您可以针对每个field/value对在hmset中执行多个hset
r.hset('myKey', 'users', 10)
r.hset('myKey', 'timestamp', datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'))
r.hset('myKey', 'yet-another-field', 'yet-another-value')
  • 第一个参数是键名
  • 第二个参数是字段名
  • 第三个参数是字段的值。

3
这个方法可以工作,但是从hset切换到hmset并使用相同的预期操作不是一个好的选择 - 因为这需要一次调用来设置多个字段 - 所以这不应该是正确的答案。 - russellthehippo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接