C#中如何使用Cache框架快速实现Cache操作

   2023-02-09 学习力0
核心提示:今天小编给大家分享一下C#中如何使用Cache框架快速实现Cache操作的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一个Cache框架主要

今天小编给大家分享一下C#中如何使用Cache框架快速实现Cache操作的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一个Cache框架主要包括三个部分:ObjectCache、CacheItemPolicy、ChangeMonitor。

  • ObjectCache表示一个CachePool,它提供了Cache对象的添加、获取、更新等接口,是Cache框架的主体。它是一个抽象类,并且系统给了一个常用的实现——MemoryCache。

  • CacheItemPolicy则表示Cache过期策略,例如保存一定时间后过期。它也经常和ChangeMonitor一起使用,以实现更复杂的策略。

  • ChangeMonitor则主要负责CachePool对象的状态维护,判断对象是否需要更新。它也是一个抽象类,系统也提供了几个常见的实现:CacheEntryChangeMonitor、FileChangeMonitor、HostFileChangeMonitor、SqlChangeMonitor。

如下是一个简单的示例:

    class MyCachePool
    {
        ObjectCache cache = MemoryCache.Default;
        const string CacheKey = "TestCacheKey";

        public string GetValue()
        {
            var content = cache[CacheKey] as string;
            if(content == null)
            {
                Console.WriteLine("Get New Item");

                var policy = new CacheItemPolicy() { AbsoluteExpiration = DateTime.Now.AddSeconds(3) };
                content = Guid.NewGuid().ToString();
                cache.Set(CacheKey, content, policy);
            }
            else
            {
                Console.WriteLine("Get cached item");
            }

            return content;
        }

        public static void Test()
        {
            var cachePool = new MyCachePool();
            while (true)
            {
                Thread.Sleep(1000);
                var value = cachePool.GetValue();
                Console.WriteLine(value);
                Console.WriteLine();

            }
        }
    }

这个例子创建了一个保存3秒钟Cache:三秒钟内获取到的是同一个值,超过3秒钟后,数据过期,更新Cache,获取到新的值。

过期策略:

从前面的例子中我们可以看到,将一个Cache对象加入CachePool中的时候,同时加入了一个CacheItemPolicy对象,它实现着对Cache对象超期的控制。例如前面的例子中,我们设置超时策略的方式是:AbsoluteExpiration = DateTime.Now.AddSeconds(3)。它表示的是一个绝对时间过期,当超过3秒钟后,Cache内容就会过期。

除此之外,我们还有一种比较常见的超期策略:按访问频度决定超期。例如,如果我们设置如下超期策略:SlidingExpiration = TimeSpan.FromSeconds(3)。它表示当对象3秒钟内没有得到访问时,就会过期。相对的,如果对象一直被访问,则不会过期。这两个策略并不能同时使用。

CacheItemPolicy也可以制定UpdateCallback和RemovedCallback,方便我们记日志或执行一些处理操作,非常方便。

ChangeMonitor

虽然前面列举的过期策略是非常常用的策略,能满足我们大多数时候的需求。但是有的时候,过期策略并不能简单的按照时间来判断。例如,我Cache的内容是从一个文本文件中读取的,此时过期的条件则是文件内容是否发生变化:当文件没有发生变更时,直接返回Cache内容,当问及发生变更时,Cache内容超期,需要重新读取文件。这个时候就需要用到ChangeMonitor来实现更为高级的超期判断了。

由于系统已经提供了文件变化的ChangeMonitor——HostFileChangeMonitor,这里就不用自己实现了,直接使用即可。

    public string GetValue()
    {
        var content = cache[CacheKey] as string;
        if(content == null)
        {
            Console.WriteLine("Get New Item");

            var file = @"r:\test.txt";
            CacheItemPolicy policy = new CacheItemPolicy();
            policy.ChangeMonitors.Add(new HostFileChangeMonitor(new List<string> { file }));

            content = File.ReadAllText(file);
            cache.Set(CacheKey, content, policy);
        }
        else
        {
            Console.WriteLine("Get cached item");
        }

        return content;
    }

以上就是“C#中如何使用Cache框架快速实现Cache操作”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注***行业资讯频道。

 
标签: cache
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • bloom-server 基于 rust 编写的 rest api cache 中间件
    bloom-server 基于 rust 编写的 rest api cache
    bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同时他使用基于share 的概念,进行cache 的分布存储,包含了请求端口(proxy,访问数据) 以及cache 控制端口(
    03-08
  • Memcached中Perl序列化存储的对象PHP无法读取的
    Perl Memcached的客户端序列化对象采用的是Storable模块的nfreeze方法,而这个方法又调用了c扩展的do_store方法;反序列化使用的是Storable模块的thaw方法,而这个方法又是调用的c扩展的do_retrieve方法。而在PHP中,进行的却是serialize和unserialize操作。
    02-09
  • 一、创建一个新的react环境(npm ERR! Could not install from "Files\nodejs\node_cache\_npx\13472" as it
    一、创建一个新的react环境(npm ERR! Could no
    2. 执行 npx create-react-app my-app 创建一个 react 项目。3. cd my-app4. npm start问题:在创建 npm create-react-app my-app 时,报错:npm ERR! Could not install from "Files\nodejs\node_cache\_npx\13472" as it doesnot contain a package.json f
    02-09
  • 【Azure Cache for Redis】Python Djange-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer'
    【Azure Cache for Redis】Python Djange-Redis
    问题描述使用Python连接Azure Redis服务,因为在代码中使用的是Djange-redis组件,所以通过如下的配置连接到Azure Redis服务:CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://xxxxxxxxx.redis.cache.chinacloudapi.
    02-09
  • cache2go-源码阅读
    cache2go-源码阅读
    简介cache2go 是非常简短的 go 开源项目了,很适合作为第一个读源码项目。如果你有一定的 go 开发经验,读起来会感觉到比较容易。如果你刚刚接触 go 语音,基础知识还不完全了解,希望阅读本文时,遇到一个不会的知识点,去攻克一个,带着为了看懂本文源码的
    02-09
  • 警告! 无法更新 wp-config.php!必须设置WPCACHE
    安装的wp super cache出现下图中让人挠头的问题,不用怕,接下来我们一点点解决掉这个问题。这个问题基本上分为两种情况,一是无法更新wp-config.php需要设置WPCACHEHOME的问题,二是缺少wp super cache各种文件的问题。   解决方法1、首先将wp-content的
    02-09
  • 为php安装memcached扩展连接memcached服务器
    为php安装memcached扩展连接memcached服务器
    首先必须完成必要的软件安装,memcached是php连接memcached服务器的php扩展以前有个叫memcache也是php连接memcached服务器的扩展php的memcache和memcached扩展都是作为客户端去连接memcached服务器但memcached作为客户端比memcache性能更好功能更强大,而且me
    02-09
  • PHP 对Memcache的使用实例
    ?php//连接Memcache$mem = new Memcache;$mem-connect("localhost", 11211) or die ("Could not connect");//保存数据$mem-set('key1', 'This is first value', 0, 60);$val = $mem-get('key1');echo "Get key1 value: &qu
    02-09
  • Apache + PHP + PEAR 安装配置 + Memcache 简
    Memcache是什么Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建
    02-09
  • Rust编译问题Blocking waiting for file lock on package cache
    Rust编译问题Blocking waiting for file lock o
    在执行 cargo build 命令后,命令行提示:  Blocking waiting for file lock on package cache。这个问题的原因是:当您同时运行同一项目的2个编译时,会发生这种情况。编译器使用锁定文件来避免数据争用问题。有如下几种可能:1.如果您自己运行这两个编
    02-09
点击排行