Redis缓存静态列表按过滤器搜索

问题描述:

我有一个约500个项目的静态对象列表。Redis缓存静态列表按过滤器搜索

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

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

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

那么,为达到最佳性能,最好的方法是什么?或者有没有 不同的方式来做到更快?

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

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

  • 当您使用valx的ATTRIBUTE1值objy,添加objyattribute1:valx:index关键。
  • 将objy的属性1从valx更新为valz时,请从attribute1:valx:index中删除objy,并将其添加到attribute1:valz:index
  • 当您使用attribute1 = valx删除objy时,请从attribute1:valx:index删除objy
  • 可选地,上面的内容应该是原子性的(即使用Lua或WATCH/MULTI/EXEC块),如果这对您的应用程序很重要。

这些点是维护索引所需要的。使用索引时,通过获取attribute1:valx:index集合的成员(例如SMEMBERS)来查找通过attribute1 = valx过滤的对象,然后通过其键名称(例如objy)获取实际对象。或者,使用SORT .. GET(例如SORT attribute1:valx:index GET obj*)是另一种只使用一个命令的方法。

对属性2重复相同的操作。还有一些要点:

  • 研究使用Redis的哈希来存储您的对象(例如HSET objy attribute1 valx)以节省序列化开销并更轻松地处理Redis中的值。
  • 上面描述的简单索引可以更进一步考虑 - 考虑使用集合操作,例如SUNION,SDIFF & SINTER以获得更复杂的过滤选项。