我有一个约500项的静态对象列表。
此Object具有类似(id [int],Name [string],attribute1)的属性 [string],attribute2 [string])。
我已将此对象序列化为字符串并将其存储为redis作为 字符串键值。但我需要根据此过滤500个项目列表 对象属性的不同用户搜索过滤器并给出子集 这个列表给用户。
我可以通过两种方式实现,一种是将此列表添加到表和索引中,并使用sql应用搜索过滤器。另一个是我每次从redis中提取这个列表并反序列化 对象列表并使用linq应用过滤器。我在不同的服务器上有redis,所以是DB,我也不想在每个Web服务器上都有该缓存的副本。
那么,为获得最佳性能,最好的方法是什么?或者在那里 一种不同的方式更快地完成它?
答案 0 :(得分:1)
而不是你列出的两种方法(在客户端使用SQL或反序列化和过滤),我想建议一个稍微不同的方法,它本质上是一个Redis索引。
这个想法非常简单:假设你的对象的键名是obj1,obj2 ... objn,而attribute1的值是val1,val2 ... valm,对于attribute1的每个值x,创建一个带有键名的Redis集比如attribute1:valx:index
。集合的成员将是其attribute1 = valx的对象的关键名称。要做到这一点,请确保:
objy
添加到attribute1:valx:index
键。objy
移除attribute1:valx:index
并将其添加到attribute1:valz:index
。objy
删除attribute1:valx:index
。这些点是维护索引所需要的。使用索引是通过在查找具有由attribute1 = valx过滤的对象时获取attribute1:valx:index
集的成员(例如SMEMBERS),然后通过其键名(例如objy
)获取实际对象来完成的。 。或者,使用SORT .. GET(例如SORT attribute1:valx:index GET obj*
)是使用一个命令执行此操作的另一种方法。
对attribute2重复相同的操作。还有几点: