寻找一个非常简单的缓存示例

     2023-03-28     215

关键词:

【中文标题】寻找一个非常简单的缓存示例【英文标题】:Looking for a very simple Cache example 【发布时间】:2017-05-31 18:04:54 【问题描述】:

我正在寻找一个真正简单的示例,说明如何将对象添加到缓存、将其重新取出并删除。

第二个答案here 是我希望看到的那种例子......

List<object> list = new List<Object>();

Cache["ObjectList"] = list;                 // add
list = ( List<object>) Cache["ObjectList"]; // retrieve
Cache.Remove("ObjectList");                 // remove

但是当我尝试这个时,在第一行我得到:

'Cache' 是一种类型,在给定的上下文中是无效的。

在第三行我得到:

非静态字段blah blah blah需要对象方法

所以,假设我有一个List&lt;T&gt;...

var myList = GetListFromDB()

现在我只想将myList 添加到缓存中,将其取出并删除。

【问题讨论】:

【参考方案1】:

.NET 提供了一些 Cache 类

System.Web.Caching.Cache - ASP.NET 中的默认缓存机制。您可以通过属性Controller.HttpContext.Cache 获取此类的实例,也可以通过单例HttpContext.Current.Cache 获取它。不应显式创建此类,因为在后台它使用另一个内部分配的缓存引擎。 要使您的代码正常工作,最简单的方法是执行以下操作:

public class AccountController : System.Web.Mvc.Controller 
  public System.Web.Mvc.ActionResult Index()
    List<object> list = new List<Object>();

    HttpContext.Cache["ObjectList"] = list;                 // add
    list = (List<object>)HttpContext.Cache["ObjectList"]; // retrieve
    HttpContext.Cache.Remove("ObjectList");                 // remove
    return new System.Web.Mvc.EmptyResult();
  

System.Runtime.Caching.MemoryCache - 这个类可以在用户代码中构建。它具有不同的界面和更多功能,例如更新\删除回调、区域、监视器等。要使用它,您需要导入库System.Runtime.Caching。它也可以在 ASP.net 应用程序中使用,但您必须自己管理它的生命周期。

var cache = new System.Runtime.Caching.MemoryCache("MyTestCache");
cache["ObjectList"] = list;                 // add
list = (List<object>)cache["ObjectList"]; // retrieve
cache.Remove("ObjectList");                 // remove

【讨论】:

嗯,MS 说:docs.microsoft.com/en-us/dotnet/framework/performance/…,建议至少对于新应用程序使用 MemoryCache 命名空间。 现在他们建议使用Microsoft.Extensions.Caching.Memory 而不是 System.Runtime.Caching.MemoryCache【参考方案2】:

这是我过去的做法:

     private static string _key = "foo";
     private static readonly MemoryCache _cache = MemoryCache.Default;

     //Store Stuff in the cache  
   public static void StoreItemsInCache()
   
      List<string> itemsToAdd = new List<string>();

      //Do what you need to do here. Database Interaction, Serialization,etc.
       var cacheItemPolicy = new CacheItemPolicy()
       
         //Set your Cache expiration.
         AbsoluteExpiration = DateTime.Now.AddDays(1)
        ;
         //remember to use the above created object as third parameter.
       _cache.Add(_key, itemsToAdd, cacheItemPolicy);
    

    //Get stuff from the cache
    public static List<string> GetItemsFromCache()
    
      if (!_cache.Contains(_key))
               StoreItemsInCache();

        return _cache.Get(_key) as List<string>;
    

    //Remove stuff from the cache. If no key supplied, all data will be erased.
    public static void RemoveItemsFromCache(_key)
    
      if (string.IsNullOrEmpty(_key))
        
            _cache.Dispose();
        
        else
        
            _cache.Remove(_key);
        
    

编辑:格式化。

顺便说一句,你可以用任何东西做到这一点。我将它与序列化结合使用来存储和检索 150K 项目的对象列表。

【讨论】:

很好的例子,只是一个小改动——这一行应该是小写驼峰式:_cache.Add(_key, itemsToAdd, cacheItemPolicy);【参考方案3】:

如果你在这里使用 MemoryCache 是一个非常简单的例子:

var cache = MemoryCache.Default;

var key = "myKey";
var value = "my value";
var policy = new CacheItemPolicy  SlidingExpiration = new TimeSpan(2, 0, 0) ;
cache.Add(key, value, policy);

Console.Write(cache[key]);

【讨论】:

【参考方案4】:

试试这个第三方缓存:CacheCrow,它是一个简单的基于 LFU 的缓存。

在 Visual Studio 中使用 powershell 命令安装:Install-Package CacheCrow

代码片段:

 // initialization of singleton class
    ICacheCrow<string, string> cache = CacheCrow<string, string>.Initialize(1000);

    // adding value to cache
    cache.Add("#12","Jack");

    // searching value in cache
    var flag = cache.LookUp("#12");
    if(flag)
    
        Console.WriteLine("Found");
    

    // removing value
    var value = cache.Remove("#12");

更多信息您可以访问:https://github.com/RishabKumar/CacheCrow

【讨论】:

【参考方案5】:

我编写 LazyCache 是为了使这尽可能简单和轻松,同时确保您只执行一次可缓存函数调用,即使两个线程同时尝试缓存它们。

在包管理器控制台中运行以下命令

PM> Install-Package LazyCache

在类的顶部添加命名空间

using LazyCache;

现在缓存东西:

// Create the cache - (in constructor or using dependency injection)
IAppCache cache = new CachingService();

// Get products from the cache, or if they are not
// cached then get from db and cache them, in one line
var products = cache.GetOrAdd("get-products", () => dbContext.Products.ToList());

// later if you want to remove them
cache.Remove("get-products");

在cache aside pattern 或the LazyCache docs 中查看更多信息

【讨论】:

寻找一个简单的 Spring 安全示例 [关闭]

】寻找一个简单的Spring安全示例[关闭]【英文标题】:LookingforaSimpleSpringsecurityexample[closed]【发布时间】:2011-06-2110:25:50【问题描述】:我是spring-security(Java)的新手,我正在寻找一个好的简单示例:如何使用springsecurity进行登录和... 查看详情

寻找一个简单的 ssl erlang 示例

】寻找一个简单的sslerlang示例【英文标题】:Lookingforasimplesslerlangexample【发布时间】:2011-10-1211:35:52【问题描述】:在ErlangProgramming一书中提出的练习之一是使用gen_tcp在屏幕上打印来自浏览器的请求。我为http请求做了如下:-modu... 查看详情

寻找简单的 MVVM Light 示例

】寻找简单的MVVMLight示例【英文标题】:LookingforsimpleMVVMLightexample【发布时间】:2011-04-2009:18:40【问题描述】:我正在尝试学习MVVMLight,并正在寻找一个很好的基本示例来展示模型以及如何加载不同的视图。我下载MVVMLight后看到... 查看详情

多对多关系示例

...题描述】:我在这里和谷歌中没有找到任何MYSQL。我正在寻找的是一个非常简单的例子,其中php+mysql显示了数据库的结果。谁能写一个非常简单的例子?【问题讨论】:看这个:tonymarston.net/php-mysql/many-to-many.html【参考方案1】:... 查看详情

Azure Redis 缓存简单设置/获取

...Get【发布时间】:2022-01-1006:56:36【问题描述】:我一直在寻找一个使用C#和AzureCacheforRedis的简单get/set示例。我使用默认设置设置AzureCacheforRedis。我有各种访问密钥并遵循:https://stackexchange.github.io/StackExchange. 查看详情

简单的 CUBLAS 矩阵乘法示例?

...ample?【发布时间】:2011-11-3000:21:36【问题描述】:我正在寻找一个非常简单的CUBLAS矩阵乘法示例,它可以使用高性能GPU操作将M乘以N并将结果放在P中以用于以下代码:floatM[500][500],N[500][500],P[500][500];for(inti=0;i<Width;i+ 查看详情

java示例代码_用java编写一个非常简单的登录系统

java示例代码_用java编写一个非常简单的登录系统 查看详情

csharp一个非常简单的手动分页示例(代码片段)

查看详情

无法用crfsuite的C++ API编译一个非常简单的Tagger示例

】无法用crfsuite的C++API编译一个非常简单的Tagger示例【英文标题】:UnabletocompileaverysimpleexampleofTaggerwiththeC++APIofcrfsuite【发布时间】:2020-01-0910:20:32【问题描述】:我已经从源代码(https://github.com/downloads/chokkan/crfsuite/crfsuite-0.12.tar.g... 查看详情

Qt + Ogre3D。我无法构建一个非常简单的示例

】Qt+Ogre3D。我无法构建一个非常简单的示例【英文标题】:Qt+Ogre3D.Icannotbuildaverysimpleexample【发布时间】:2021-10-2715:22:58【问题描述】:我用:Qt5.15.2MinGW32-bitDynamicforDebugbuildOgre13.1.1MinGW静态构建有一个名为ApplicationContextQt的类可以... 查看详情

一个非常简单的多线程并行 URL 获取(无队列)

...时间】:2013-04-1708:42:05【问题描述】:我花了一整天时间寻找最简单的Python多线程URL提取器,但我发现的大多数脚本都使用队列或多处理或复杂库。最后我自己写了一个,我将其报告为答案。请随时提出任何改进建议。我猜其他... 查看详情

登录一个简单的网页进行的操作

...议响应与请求一个普通网页大概分为几块1、查找DNS(1)寻找浏览器自身缓存的DNS(2)寻找自身系统缓存的DNS(3)查找本地的HOST文件(4)运营商本地缓存的DNS调用2、根据DNS解析请求返回到系统与浏览器,得到IP地址3、根据IP地... 查看详情

核心数据和图像缓存

...那将是非常有帮助的。[P.S我知道图像缓存。因此,不要寻找仅用 查看详情

SyncFrameworkToolkit + SqlServerCE + 实体框架示例

...xample【发布时间】:2014-05-0717:11:58【问题描述】:我正在寻找一个非常简单的SyncFrameworkToolkit示例,其中包含一个SQLServerCE本地数据库,该数据库与模板化Web服务和预置的远程sql服务器同步。 查看详情

多个 response.WriteHeader 在非常简单的示例中调用?

...eexample?【发布时间】:2015-03-1409:27:34【问题描述】:我有一个最基本的net/http程序,用来学习Go中的命名空间:packagemainimport("fmt""log""net/http")funcmain()http.Handl 查看详情

mybatis二级缓存简单示例

简单接收Mybatis中二级缓存的使用示例主要部分如下:-引入Maven依赖-SpringBoot配置文件配置、建库与初始化SQL语句-实体类与Mapper编写-测试简介简单接收Mybatis中二级缓存的使用示例概览主要部分如下:引入Maven依赖SpringBoot配置文件... 查看详情

简单的 Android RecyclerView 示例

...浏览众多在线教程之一(this、this和this很好),但我正在寻找一个可以复制和粘贴以快速启动和运行的简单示例。只需要以下功能:垂直布局每行有一个TextV 查看详情

简单的 jQuery SlickGrid JSON 示例或文档

...tation【发布时间】:2011-06-2610:21:00【问题描述】:我正在寻找一个简单的示例,说明在尝试通过jQuery.Ajax以JSon形式检索数据时如何使用SlickGrid。我也找不到SlickGrid插件的任何文档,并且想知道我是否只是在错误的地方寻找。任何... 查看详情