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
?
为了通过 属性 查询哈希,我是否需要调整我的模型以适应更有效的索引?
也感谢对我的措辞进行的任何增加清晰度的调整。
~谢谢
更新我学到的东西:
- A
Set
只是 Key/Value Pair
(我的术语)的值部分。
- Redis 具有对
Sets
的 Members
进行操作的命令。具体来说 SADD
和 SREM
。我不必完整地对 Value
进行操作,从而提示这个 SO 问题。
如果你需要原子性,你必须使用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)
使用 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
?
为了通过 属性 查询哈希,我是否需要调整我的模型以适应更有效的索引?
也感谢对我的措辞进行的任何增加清晰度的调整。
~谢谢
更新我学到的东西:
- A
Set
只是Key/Value Pair
(我的术语)的值部分。 - Redis 具有对
Sets
的Members
进行操作的命令。具体来说SADD
和SREM
。我不必完整地对Value
进行操作,从而提示这个 SO 问题。
如果你需要原子性,你必须使用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)