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,添加
objy
到attribute1: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以获得更复杂的过滤选项。