【问题标题】:Redis-python add multiple values of type set to a redis hashRedis-python 将类型集的多个值添加到 redis 哈希
【发布时间】:2021-04-25 02:09:28
【问题描述】:

Redis n00b 在这里,所以不要开枪!

我需要在 redis 中存储一组按键索引的集合 - 我可以:

import redis
r = redis.Redis()

r.sadd("A:B:123", *{456, 789})
r.sadd("A:B:124", *{666, 777})

但是如果我想要集合“A:B”,我必须手动收集密钥,如下所示:

{k.rsplit(b':', 1)[-1]: r.smembers(k) for k in r.scan_iter("A:B:*") }
# {b'124': {b'666', b'777'}, b'123': {b'456', b'789'}}

这似乎非常慢(还要注意 rsplit)

我一直在尝试使用 hmset 来解决问题:

r.hmset("A:B", mapping={123: 'X', 124: 'Z'})

但我找不到用我的集合替换“X”和“Z”的方法。

(请注意,理想情况下,set 元素应该是传入的 int 类型 - 另请注意,这些集合是只读的,所以我想优化查找而不是插入时间)

【问题讨论】:

    标签: python redis py-redis


    【解决方案1】:
    import redis
    r = redis.Redis()
    
    r.sadd("A:B:123", *{456, 789})
    r.sadd("A:B:124", *{666, 777})
    

    新代码

    import redis
    r = redis.Redis()
    
    r. hmset("A:B", {"123": ",".join(map(str, {456, 789}))})
    r. hmset("A:B", {"124": ",".join(map(str, {666, 777}))})
    

    打印所有元素

    print(dict([(k,set(map(int, v.split(b",")))) for k,v in r.hgetall("A:B").items()]))
    

    使用单个映射来存储相关的键,并在给定的键中将连接的值存储为字符串。

    注意:将元素添加到 set 不是原子的,因为过程必须先读取然后执行反序列化并将其存储回来,除非使用 LUA 脚本。

    使用 SUNION

    r.sadd("A:B:123", *{456, 789})
    r.sadd( "A:B:members", "A:B:123")
    r.sadd("A:B:124", *{666, 777})
    r.sadd( "A:B:members", "A:B:124")
    

    打印方法

    r.sunion(r.smembers("A:B:members"))
    

    【讨论】:

    • 谢谢!但是有没有办法一次检索整个字典?这些集合很大,并且在每个查询上重建 dict 不是一种选择。我知道我可以存储字符串,但我想要的是将集合恢复为已存储的状态 - 不要执行对我的需要来说超级慢的字符串操作
    • 你有哪个版本的 Redis?
    • 查看编辑后的答案,如果您使用的是 Redis 6.2+,则可以使用 SUNION
    • 是的,谢谢尝试-这实际上增加了将密钥本身存储在一组中,因此我避免扫描它们-因此OP中的代码变为dict((k, r.smembers(k)) for k in r.smembers("A:B:members"))-> {b'A:B:123': {b'789', b'456'}, b'A:B:124': {b'666', b'777'}}-我仍然必须手动拆分键并重建集合
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多