除了您列出的两种方法(使用 SQL 或在客户端中反序列化和过滤),我想建议一种稍微不同的方法,它本质上是 Redis 索引。
这个想法很简单:假设你的对象的键名是 obj1, obj2...objn 并且属性 1 的值是 val1, val2...valm,对于属性 1 的每个值 x 创建一个 Redis 集,其键名如attribute1:valx:index
. 该集合的成员将是其属性 1=valx 的对象的键名。要做到这一点,请确保:
- 当您创建一个属性 1 值为 valx 的对象时,添加
objy
到attribute1:valx:index
键中。
- 当您将 objy 的属性 1 从 valx 更新为 valz 时,将其删除
objy
并attribute1:valx:index
添加到attribute1:valz:index
.
- 当您使用 attribute1=valx 删除 objy 时,
objy
从attribute1:valx:index
.
- 或者,如果这对您的应用程序很重要,则上述内容应该以原子方式发生(即使用 Lua 或 WATCH/MULTI/EXEC 块)。
这些点是维护索引所需要的。使用索引是通过attribute1:valx:index
在查找按attribute1=valx 过滤的对象时获取集合的成员(例如SMEMBERS),然后通过它们的键名(例如objy
)获取实际对象来完成的。或者,使用 SORT .. GET (例如SORT attribute1:valx:index GET obj*
)是另一种仅使用一个命令的方法。
对属性 2 重复相同的操作。还有几点:
- 研究使用 Redis 的散列来存储您的对象(例如 HSET objy attribute1 valx)以节省序列化开销和更轻松地在 Redis 中操作值。
- 上面描述的简单索引可以更进一步——考虑使用诸如 SUNION、SDIFF 和 SINTER 之类的集合操作来获得更复杂的过滤选项。