0

我有一个大约 500 项的静态对象列表。

此对象具有类似 (id [int],Name [string], attribute1 [string], attribute2 [string]) 的属性。

我已将此对象序列化为字符串并作为字符串键值存储到 redis 中。但是我需要根据对象属性的不同用户搜索过滤器过滤这个 500 个项目的列表,并将这个列表的子集提供给用户。

我可以通过两种方式做到这一点,一种是将此列表添加到表和索引中,然后使用 sql 应用搜索过滤器。其他是我每次从redis中提取这个列表并反序列化为对象列表并使用linq应用过滤器。我在不同的服务器上有 redis,DB 也是如此,我也不想在每个 Web 服务器上都有该缓存的副本。

那么,为了获得最佳性能,最好的方法是什么?还是有其他方法可以更快地做到这一点?

4

1 回答 1

1

除了您列出的两种方法(使用 SQL 或在客户端中反序列化和过滤),我想建议一种稍微不同的方法,它本质上是 Redis 索引。

这个想法很简单:假设你的对象的键名是 obj1, obj2...objn 并且属性 1 的值是 val1, val2...valm,对于属性 1 的每个值 x 创建一个 Redis 集,其键名如attribute1:valx:index. 该集合的成员将是其属性 1=valx 的对象的键名。要做到这一点,请确保:

  • 当您创建一个属性 1 值为 valx 的对象时,添加objyattribute1:valx:index键中。
  • 当您将 objy 的属性 1 从 valx 更新为 valz 时,将其删除objyattribute1:valx:index添加到attribute1:valz:index.
  • 当您使用 attribute1=valx 删除 objy 时,objyattribute1: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 之类的集合操作来获得更复杂的过滤选项。
于 2014-09-05T11:26:18.453 回答