Raj*_*gaj 15 c# caching asp.net-core
我在Asp.Net Core中有一个项目.这个项目有一个ICacheService如下:
public interface ICacheService
{
T Get<T>(string key);
T Get<T>(string key, Func<T> getdata);
Task<T> Get<T>(string key, Func<Task<T>> getdata);
void AddOrUpdate(string key, object value);
}
Run Code Online (Sandbox Code Playgroud)
实现只是基于ConcurrentDictionary<string, object>,所以它并不复杂,只是存储和检索这个字典中的数据.在我的一项服务中,我有一个方法如下:
public async Task<List<LanguageInfoModel>> GetLanguagesAsync(string frontendId, string languageId, string accessId)
{
async Task<List<LanguageInfoModel>> GetLanguageInfoModel()
{
var data = await _commonServiceProxy.GetLanguages(frontendId, languageId, accessId);
return data;
}
_scheduler.ScheduleAsync($"{CacheKeys.Jobs.LanguagesJob}_{frontendId}_{languageId}_{accessId}", async () =>
{
_cacheService.AddOrUpdate($"{CacheKeys.Languages}_{frontendId}_{languageId}_{accessId}", await GetLanguageInfoModel());
return JobStatus.Success;
}, TimeSpan.FromMinutes(5.0));
return await _cacheService.Get($"{CacheKeys.Languages}_{frontendId}_{languageId}_{accessId}", async () => await GetLanguageInfoModel());
}
Run Code Online (Sandbox Code Playgroud)
问题是我在这个方法中有三个参数,我用它作为缓存键.这工作正常,但问题是三个参数的组合非常高,因此在缓存中将有如此多的对象重复.我正在考虑创建一个没有重复的缓存,如下所示:
使用列表作为键的缓存,我可以为一个对象存储多个键.因此,当我获得新元素时,如果它在缓存中,我将检查每个元素,如果它在缓存中,我将只在密钥列表中添加一个键,否则在缓存中插入一个新元素.这里的问题是测试对象是否在缓存中是一个大问题.我认为它将消耗大量资源,并且需要将一些序列化为特定形式以使比较成为可能,这将使得比较消耗大量资源.缓存可能看起来像这样CustomDictionary<List<string>, object>
有没有人知道解决这个问题的好方法是不重复缓存中的对象?
编辑1:
我主要担心的是当我List<MyModel>从我的web服务中检索时,因为它们可能有80%的对象具有相同的数据,这将大大增加内存的大小.但这也适用于简单的案例.以免我认为我有这样的事情:
MyClass o1 = new MyObject();
_cache.Set("key1", o1);
_cashe.Set("key2", o1);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当尝试添加相同的对象两次时,我不想复制它,但以key2某种方式指向同一个对象key1.如果这实现了它将使它们无效将是问题,但我希望有这样的事情:
_cache.Invalidate("key2");
Run Code Online (Sandbox Code Playgroud)
这将检查是否有另一个键指向同一个对象.如果是这样,它只会删除密钥,否则会破坏对象本身.
也许我们可以将这个问题重新解决为两个不同的问题......
对于1,我不知道如何阻止它,因为我们在执行之前不知道如果我们将在此设置中获取副本.我们需要更多基于这些值何时变化的信息,这些信息可能是也可能是不可能的.
对于2,一个解决方案是覆盖哈希码,因此它基于实际返回的值.一个好的解决方案是通用的,并遍历对象树(这可能是昂贵的).想知道实际上是否有任何预先制定的解决方案.
| 归档时间: |
|
| 查看次数: |
1815 次 |
| 最近记录: |