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

时间:2014-09-05 00:10:37

标签: c# linq redis json.net booksleeve

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

  

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

     

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

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

  

那么,为获得最佳性能,最好的方法是什么?或者在那里   一种不同的方式更快地完成它?

1 个答案:

答案 0 :(得分:1)

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

这个想法非常简单:假设你的对象的键名是obj1,obj2 ... objn,而attribute1的值是val1,val2 ... valm,对于attribute1的每个值x,创建一个带有键名的Redis集比如attribute1:valx:index。集合的成员将是其attribute1 = valx的对象的关键名称。要做到这一点,请确保:

  • 当您使用valx的attribute1值创建objy时,请将objy添加到attribute1:valx:index键。
  • 当您将objy的attribute1从valx更新为valz时,请从objy移除attribute1:valx:index并将其添加到attribute1:valz:index
  • 当您使用attribute1 = valx删除objy时,请从objy删除attribute1:valx:index
  • 可选地,上述内容应以原子方式发生(即使用Lua或WATCH / MULTI / EXEC块),如果这对您的应用程序很重要。

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

对attribute2重复相同的操作。还有几点:

  • 使用Redis的哈希来存储对象(例如HSET objy attribute1 valx)以节省序列化开销并更容易在Redis中操作值。
  • 上面描述的简单索引可以更进一步 - 考虑使用诸如SUNION,SDIFF& amp; SINTER用于更复杂的过滤选项。