gpt4 book ai didi

asp.net - ASP.NET 中缓存的模式和最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-01 15:23:29 26 4
gpt4 key购买 nike

我们正在开发一个大型遗留应用程序,并且我们正在重新设计业务层和数据层。我们认为现在是重新设计缓存处理方式的好时机。是否有实现缓存层(或在业务层中构建)的模式和最佳实践?

我能想到的唯一事情是使用 SQL Cache Dependency(这很困难,因为我们有一个大型遗留数据库,其中有很多表并不总是对应于业务对象)并实现强类型 CacheManager 类隐藏字符串键并消除类转换问题。

有什么更复杂的我们可以做的吗?执行更新/删除时有没有办法强制缓存失效?我们是否应该以某种方式在缓存中维护单个对象并从数据库中检索始终与相同对象一起使用的 ID 列表?

基本上,您在 ASP.NET 中使用了哪些缓存技术?太糟糕了,我们不能使用支持缓存的 IoC 容器或 ORM 框架:(

编辑:我更关心可维护性而不是性能。

最佳答案

  • 只需将每个查询结果保存到数据库(缓存键:您的查询,值:您的业务对象列表)
  • 在 ASP.Net 缓存
  • 旁边使用分布式缓存,例如 memcached
  • 使用复杂的缓存管理器,如 https://github.com/enyim/memcached-providers ;可以有缓存组。有些数据必须存储很长时间,有些时间很短。一些数据必须存储在 ASP.Net 缓存等中。
  • 使用包装函数(如 public T GetFromCache<T>(string key, Func<T> ifKeyNotFoundDelegate))执行必须存储在缓存中的调用以确保始终使用相同的缓存。 [1]
  • 想想什么时候使用 ASP.Net 缓存,什么时候使用分布式缓存。每次请求读取的数据都应该存储在 ASP.Net 中,比如搜索结果的大数据;有很多不同的键和数据等应该在 memcached 中。
  • 添加版本控制。为所有键加上版本号前缀,这样您在更新 Web 应用程序时就不会遇到麻烦,并且某些对象契约(Contract)会发生变化。

  • 嗯,这涵盖了我们在网站上所做的大部分工作(20GB 内存缓存集群分布在 20 台服务器上)。

    [1] 通过使这样的函数成为在缓存中存储内容的唯一接口(interface),您可以实现以下目的。假设我想使用缓存中的某些内容,例如函数的结果。通常你会做类似的事情
    CacheManager cm = new CacheManager(CacheGroups.Totals);
    object obj = cm.GetFromCache("function1result");
    if(obj == null)
    {
    obj = (object)DAO.Foo();
    cm.StoreInCache("function1result", obj);
    }
    return (List<MyEntity>)obj;

    通过使用不同的界面,您可以确保用户不会在这里出错。


    public T GetFromCache<T>(string key, Func<T> ifnotfound)
    {
    T obj = this.GetFromCache(key) as T;
    if(obj == default(T))
    {
    obj = ifnotfound.Invoke();
    this.StoreInCache(key, obj);
    }
    return obj;
    }

    这确保了
  • 我们始终使用正确的类型
  • 您的用户始终以相同的方式使用缓存

  • 尔格:他们犯错的可能性较小。此外:您会得到更好、更清晰的代码,例如:
    List<MyEntity> list = new CacheManager(CacheGroups.Total).GetFromCache<List<MyEntity>>("function1result", ()=>DAO.Foo());

    关于asp.net - ASP.NET 中缓存的模式和最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763694/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com