我有一个关于如何有效缓存对象列表的问题。我有一个Trip
s的示例表。每个Trip
都有DateFrom
和DateTo
。我想缓存Trip
s。
我考虑的第一种方法是在x分钟获取Trip
s形式数据库和Trip
的ValueObjects的缓存列表(通过值对象,我指的是在列表上显示Trip所需的所有数据)。这种方法非常简单,但有一些不足之处:
- 处理分页 - 如果我逐页存储它们(例如使用键TripsP1
,TripsP2
等等)。当GUI上的页面大小发生变化时,我将不得不使用不同的键创建一组Trips(例如,使用键TripsP1Size1
,TripsP1Size2
等...)
- 如何处理排序列表?为每个过滤器组合保留一组Trip
个不同的键?
我考虑的第二种方法是针对每个请求使用hittng数据库,但只从数据库中获取Trip.Id
。接下来我想从缓存中获取每个Trip ValueObject
。创建或修改Trip
后,我会将其作为密钥以TripId
放入缓存中。此外,如果由于某种原因我无法在缓存中找到Trip ValueObject
,我会从数据库中获取它并放入缓存中。
哪种方法更好?或者你可以建议一些更有效的方法吗?
答案 0 :(得分:0)
我不明白为什么要以Pages的形式举行这些旅行。
为什么不将所有行程加载到List中(可以根据您的需要进行排序),并为Linq搜索查询构建内存索引?例如this lib。
您可以在内存中创建缓存索引,以便快速搜索,具体取决于您的应用程序查询模式。
如果您担心Trips在事务进行过程中发生更改(所有缓存都忽略了这一点),您应该使用Immutable集合实现它(并使Trip不可变类型)。
这样,当用户要求服务器提供具有特定条件的项目时,您可以轻松选择这些项目并为其提供IQueryable(IEnumarable序列)方法来获取数据流。
希望这会有所帮助,Ofir。