代码之家  ›  专栏  ›  技术社区  ›  ttugates

redis中散列属性的索引(集)值的原子添加/移除

  •  1
  • ttugates  · 技术社区  · 7 年前

    使用 堆叠交换.redis ,如何将索引建模为哈希的属性,以便能够原子地删除哈希索引值?

    前任:

    Hash       -> Key=1    Value={ FirstName="Bob", LastName="Smith", Etc=...}
                  Key=2    Value={ FirstName="Sue", LastName="Smith", Etc=...}
    
    Set(index) -> Key=FirstName:Bob    Value={1}
                  Key=FirstName:Sue    Value={2}
                  Key=LastName:Smith   Value={1,2}
    

    在上面的例子中,当一个新的散列值添加为 LastName:Smith 我可以用 .StringAppend() 将值添加到相应的索引(集合)中。

    如果我需要用 Key=2 ,如何原子移除 2 从索引(集合)中存储的值 Key=LastName:Smith ?

    是否需要调整模型以适应更高效的索引,以便查询属性的散列值?

    对我的措辞进行任何调整,使其更加清晰,我们也将不胜感激。

    谢谢

    用我学到的东西更新:

    • Set 只是 Key/Value Pair (我的术语)。
    • redis有操作命令 Members 属于 Sets . 明确地 SADD SREM . 我不需要做手术 Value 在它的整个过程中引发了这个问题。
    1 回复  |  直到 7 年前
        1
  •  1
  •   Imaskar    7 年前

    如果你需要原子性,你必须使用eval或multi。例如:

    添加元素

    eval "redis.call('hset',KEYS[1],KEYS[2],KEYS[3],KEYS[4],KEYS[5]) redis.call('sadd',KEYS[2]..':'..KEYS[3],KEYS[1]) redis.call('sadd',KEYS[4]..':'..KEYS[5],KEYS[1])" 5 3 FirstName Bob LastName Marley
    

    127.0.0.1:6370>smembers姓氏:marley
    1)“3”
    127.0.0.1:6370>汞柱3
    1)“名字”
    2)“鲍伯”
    3)“姓氏”
    4)“马利”

    删除元素

    eval "local k2=redis.call('hget',KEYS[1],KEYS[2]) local k3=redis.call('hget',KEYS[1],KEYS[3]) redis.call('srem',KEYS[2]..':'..k2,KEYS[1]) redis.call('srem',KEYS[3]..':'..k3,KEYS[1]) redis.call('del',KEYS[1])" 3 3 FirstName LastName
    

    127.0.0.1:6370>汞柱3
    (空列表或集合)
    127.0.0.1:6370>smembers姓氏:marley
    (空列表或集合)