Redis 中散列属性的索引(集)值的原子 add/removal

Atomic add/removal of Index(Set) value(s) to Hash properties in Redis

使用 Stackexchange.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}

在上面的例子中,当添加一个新的Hash,其值为LastName:Smith时,我可以使用.StringAppend()为其对应的index(Set)添加一个值。

如果我需要使用 Key=2 删除散列,我如何从存储在索引(集合)Key=LastName:Smith 中的值中自动删除 2

为了通过 属性 查询哈希,我是否需要调整我的模型以适应更有效的索引?

也感谢对我的措辞进行的任何增加清晰度的调整。

~谢谢

更新我学到的东西:

如果你需要原子性,你必须使用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 LastName:Marley
1) "3"
127.0.0.1:6370> hgetall 3
1) "FirstName"
2) "Bob"
3) "LastName"
4) "Marley"

删除元素

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> hgetall 3
(empty list or set)
127.0.0.1:6370> smembers LstName:Marley
(empty list or set)