当前位置: 首页 > 编程语言 > C#

如何缓存数据库表以防止在Asp.net C#mvc中进行许多数据库查询分享

时间:2023-04-11 00:10:06 C#

C#学习教程:如何在Asp.netC#mvc中缓存数据库表以防止多次数据库查询构建我自己的cms,我想缓存一些数据库数据,如:本地化、搜索类别(它是长尾,每个类别都有自己的子类别和子子类别)等。一直查询数据库会因为每个页面请求而过大可能超过30-100个查询,但用户很少更新这些数据库,那么最好的方法是什么(性能和便利性)?我知道如何使用Action的OutputCache,但在这种情况下这不是我需要的,它正在缓存html,但我需要的是,例如,我自己的助手@html.Localization("Newsletter.Tite")将采用语言的价值,或与数据交互的任何其他助手等。我认为(不太确定)我需要缓存我想要的数据,只有在第一次调用应用程序时,然后使用缓存位置,但我没有任何经验。您可以使用内置的MemoryCache来存储从数据库中检索到的整个结果集。典型模式:MyModelmodel=MemoryCache.Default["my_model_key"]asMyModel;如果(模型==null){模型=GetModelFromDatabase();MemoryCache.Default["my_model_key"]=模型;}//你可以在这里使用模型我不得不缓存公共数据库数据,比如下拉列表中显示的数据。我用过内存缓存。我首先使用EntityFramework代码,使用Autofac进行依赖注入。这是我在解决方案中所做的,它可能对您不起作用,但对我有用,虽然不完美,但需要大量清理工作。我的ICacheManager接口:publicinterfaceICacheManager{TGet(stringkey);voidSet(字符串键,对象数据,intcacheTime);boolIsSet(字符串键);无效删除(字符串键);无效清除();我的CacheManager类:publicclassCacheManager:ICacheManager{privateObjectCacheCache{get{returnMemoryCache.Default;}}publicTGet(stringkey){return(T)Cache[key];}publicvoidSet(stringkey,objectdata,intcacheTime){if(data==null){return;}CacheItemPolicypolicy=newCacheItemPolicy();policy.AbsoluteExpiration=DateTime.Now+TimeSpan.FromMinutes(cacheTime);Cache.Add(newCacheItem(key,data),policy);}publicboolIsSet(stringkey){return(Cache.Contains(key));}publicvoidRemove(stringkey){Cache.Remove(key);}publicvoidClear(){foreach(variteminCache){Remove(item.Key);我的存储扩展类:publicstaticclassCacheExtensions{publicstaticTGet(thisICacheManagercacheManager,stringkey,Funcacquire){return获取(缓存管理器,密钥,60,获取);}publicstaticTGet(thisICacheManagercacheManager,stringkey,intcacheTime,Funcacquire){if(cacheManager.IsSet(key)){returncacheManager.获取(密钥);}else{varresult=acquire();cacheManager.Set(key,result,cacheTime);返回结果;这就是我在我的存储库类中使用它的方式。此方法返回所有银行的列表,该列表显示在下拉列表中。公共类BankRepository:RepositoryBase,IBankRepository{privatereadonlyICacheManagercacheManager;privateconststringBanksAllCacheKey="banks-all";publicBankRepository(IDatabaseFactorydatabaseFactory,ICacheManagercacheManager):base(databaseFactory){Check.Argument.IsNotNull(cacheManager,"cacheManager");this.cacheManager=cacheManager;}publicIEnumerableFindAll(){stringkey=string.Format(BanksAllCacheKey);returncacheManager.Get(key,()=>{varquery=frombankinDatabaseContext.Banksorderbybank.Nameselectbank;returnquery.ToList();});}}我希望这有帮助。这是一个非常简单的实现,但对我有用。有很多文章介绍如何在ASP.NETMVC中使用缓存策略。只是谷歌它。在选择缓存实现之前需要考虑几点,但您必须决定的主要事情之一是您希望缓存何时发生——数据访问、模型创建或UI生成?一个或所有这些地方?您有几个选择,但对于一般数据缓存,您可以使用System.Runtime.Caching.MemoryCache,或者对于更灵活和有益的东西,您可以考虑使用类似NoSQL的实现,如Redis。您可以使用MemoryCache进行数据缓存,但使用Redis来缓存构成视图模型的聚合。如果你使用Redis,你当然可以用它来处理所有的缓存。好处是所有数据在应用程序重启后仍然存在。缺点是它成为运行CMS的额外要求。其他需要考虑的事情是一致性(使用一些IoC会有所帮助)和允许数据在更新后失效。所以有一些方法可以更新缓存。关于最佳方法,在您的情况下,如果您正在创建一个新的CMS应用程序,请从小/简单开始并逐步构建。您可能不会在第一次就做到完美,但只要您的方法始终如一且清晰,就应该很容易在您所做的基础上进行构建,或者更换并尝试不同的/更好的东西。以上就是C#学习教程的全部内容:Asp.netC#mvc中如何缓存数据库表,防止数据库查询过多。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: