【发布时间】:2022-01-08 04:20:01
【问题描述】:
我读过所有关于插入的文章和文章,但我遇到了问题。
我已经使用事务(MULTI)和集合实现了二级索引机制,以便在查找实体时节省时间,索引由属性名称和值的集合名称保存。 说我们有一个人
Person Jack = new Person() { Id = 1, Name = Jack, Age = 30 }
Person Jena = new Person() { Id = 2, Name = Jena, Age = 30 }
当我选择索引 Age 属性并插入两者时,我会查找 1 和 2 的 Age 准备它们并将它们插入相应的集合并在同一事务中更新索引。 age_30_index 持有 ids 1,2
删除 Jack 时,我准备 Jacks 年龄 30,并从 age_30_index 中删除 id 1 并在一次事务中再次将 Jack 从其集合中删除,一切都很好,嗯.. 几乎。
问题从我想改变Age和更新缓存开始,看下面的场景:
var p = GetEntity<Person>(id: 1)
p.Age = 31
UpdateEntity(p)
现在有了上面的概念,我将拥有age_30_index -> 1,2 和age_31_index -> 1
那是因为在更新缓存中的实体时,我不知道缓存中存储的属性的值是什么。因此无法将其从索引中删除。
另一个问题是按 ID 删除,或者像这样删除:
var p = GetEntity<Person>(id: 1)
p.Age = 31
DeleteEntity(p)
一个简单的解决方案是使用分布式锁并按实体名称锁定,从缓存中获取实体,删除索引并继续,但我运行的测试,性能不足。
我想到的任何其他选项都不是线程安全的,因为它不是原子的。
还有其他方法可以实现我想做的事情吗?
该项目是 c# .net 框架,在 windows 上带有 redis,redisearch.io 看起来不错,但不幸的是它超出了范围。
【问题讨论】:
-
您是否考虑改用 RediSearch 模块?
-
@GuyKorland 正如我所写,目前这不是一个真正的选择,我想避免它,
标签: redis