缓存对象集合的最佳方法.一起的或单独的

本文关键字:一起 单独 方法 最佳 对象 集合 缓存 | 更新日期: 2023-09-27 17:54:51

假设我有一个Users集合。每个用户都有一个 User_ID , 用户名 Tenant_ID

有时我需要特定Tenant_ID的所有用户。
有时我需要基于User_ID"的特定User。
有时我需要一个基于用户名的用户。

我将始终使用Tenant_ID作为查找的一部分。

为这些数据实现缓存层的理想方式是什么?
由于我正在处理多租户系统,我应该考虑哪些因素?
管理所有可能涉及的缓存键的最佳方法是什么?

选项#1:将所有用户存储在一个名为"Tenant_1_Users"的密钥下

这样做的问题是,我将通过电线传输大量不需要的数据。如果我只需要找到一个特定的用户,那么我需要在检索整个集合后使用LINQ或其他东西在代码中进行查找。

选项#2:在不同的键下复制相同的User对象,例如"TenantID_1_UserID_5"answers"TenantID_1_Username_Jason"

这里的问题是管理所有不同的键和用户对象的位置。特别是如果我需要刷新一个特定的用户,因为它已经在数据库中更新。我现在需要知道所有可能的存放地点。同样使用更多的内存,因为同一个用户可以在不同的键下。

相关:AppFabric Cache 'Design'-缓存单个项目或集合?
问题是Azure AppFabric缓存不支持区域、标签或通知。

缓存对象集合的最佳方法.一起的或单独的

就其价值而言,我倾向于不希望在多个键下缓存相同的对象,因为如果您稍后需要更新或删除该记录,您将不得不记住更新/删除它可能使用的所有可能的键。

过去,我单独向缓存中添加项,使缓存与记录的主键无关。然后,在需要的地方,我维护了一个字典对象,它使我能够快速查找基于其他值的主键。当我需要这样做时,我会创建一个自定义集合类,它封装了维护字典的所有逻辑,查找从缓存中过期的记录,搜索从未添加到缓存中的记录,提供通过各种值检索项的访问器,等等。这种结构使得每个数据项可以单独过期,而不需要集合的其余部分,但是我的字典仍然会维护哪些键属于哪些次要值的列表,因此无论使用哪个访问器来请求它,我都可以轻松地恢复过期的项。

不能说这一定是最好的方法,但它似乎可以很好地减少对数据存储的访问,而不会因为内存太多而使应用服务器陷入困境。我使用的是标准的ASP。. NET和SQL后端是我开发这项技术的时候,但我不明白为什么它不能转换到云环境

在这种情况下,我很想这样做:

List<User> users = [list of users]
Dictionary<string,int> userIDLookup = ...
Dictionary<string,int> tennantIDLookup = ...
Dictionary<string,int> usernameLookup = ...

这样做的好处是可以将单个对象缓存在多个查找字典中,这些字典提供了List的索引。你可以把它封装在一些很好的方法中,比如GetUserFromName(string username)…等等……使其更易于在代码中使用。也许所有这些都放在一个UserCache类中,这样你就可以实例化缓存并调用查找方法。