默认搜索
当前位置:主页 > 香港管家婆玄机图 马报 > 正文
  • 内存缓存你需要知道的 10 点
  • 日期:2019-08-07   点击:   作者:admin   来源:未知   字体:[ ]

  为了向你的应用程序加入内存缓存能力,你需要在服务集合上调用 AddMemoryCache() 方法。采用这种办法就可以让一个内存缓存(它是一个 IMemoryCache 对象)的默认实现可以被注入到控制器中去。

  如你所见,上述代码声明了一个 ImemoryCache 的私有变量。该变量会被构造器中被赋值。构造器会通过 DI(依赖注入)接收到缓存参数,然后被存储在本地变量总,提供后续使用。

  等你有了这个 IMemoryCache 对象,就可以读取或者向它写入数据了。向缓存写入数据项是相当直接的。

  上述代码在 Index() 这个 action 中设置了一个缓存项。这是通过使用 IMemoryCache 的 SetT() 来完成的。Set() 方法的第一个参数是键名,用来标识该数据项。第二个参数是键的取值。在此例中,我们存储一个字符串的键和一个字符串的值,而你也可以存储其它类型 (原生以及自定义的类型) 的键值对。

  等你向缓存中添加好了数据,也许会想要在应用程序的其它地方去获取到该数据,可以用 Get() 来做到。如下代码会告诉你如何来做这件事情。

  上述代码从 HomeController 的另外一个action(Show)那里获取到了一个缓存的数据项。Get() 方法会指定数据项的类型以及它的键名。如果该数据项存在的话,就会被返回并且被赋值给 timestamp 这个字符串变量。然后这个 timestamp 的值就会被传递给 Show 视图。

  为了对目前为止你所写的代码进行一下测试,请运行应用程序。首先将浏览器导航至 /Home/Index ,这样 timestamp 键就会被赋值。然后导航至 /Home/Show 并查看 timestamp 值是否会输出。下图所示是 Show() 这个 action 运行起来的一个例

  如果你观察前面的示例,会发现每次你导航至 /Home/Index 的时候, 都会有一个新的 timestamp 被赋值给了缓存项。这是因为我们并没有对此进行检查,规定只有在数据项不存在的时候才赋值。许多时候你都会想要这样做的。这里有两种办法可以在 Index() 这个 action 里面来做这样的检查。我们把两种办法都在下面列了出来。

  第一种办法使用了你早先用过的同一个 Get() 方法,这一次它被拿来跟 if 块一起用。如果 Get() 不能在缓存中找到指定的数据项,IsNullOrEmpty() 就会返回 true。而只有这时候 Set() 才会被调用,一次来添加数据项。

  第二种办法更加优雅一点。它使用 TryGet() 方法来获取一个数据项。TryGet() 方法会返回一个布尔值来指明数据项有没有被找到。实际的数据项可以使用一个输出参数拉取出来。如果 TryGet() 返回false,Set() 就会被用来添加数据。

  有时你需要从缓存中检索现有项。如果该项目不存在,则希望添加该项。这两个任务 – 如果它存在获取值,否则创建之 – 可以使用 GetOrCreate() 方法来实现。修改后的 Show() 方法展示了如何实现的。

  Show() 动作现在使用 GetOrCreate() 方法。 GetOrCreate() 方法将检查时间戳的键值是否存在。如果是,现有值将被赋值给局部变量。否则,将根据第二个参数中指定的逻辑创建一个新条目并将其添加到缓存中。

  为了测试此代码,请直接运行 /Home/Show,不需要跳转到 /Home/Index。你仍然会看到输出的时间戳值,因为在该值不存在的情况下,GetOrCreate() 现在是添加了它。

  在前述示例中,一个缓存项只要被添加到缓存就会一直存储,除非它被明确地使用 Remove() 从缓存中移除。你也可以在一个缓存项上面设置一个绝对和滚动的过期时间。一个绝对的过期设置意味着该缓存项会在严格指定的日期和时间点被移除,而滚动过期设置则意味着它在给定的一段时间量处于空闲状态(也就是没人去访问)之后被移除。

  为了能在一个缓存项上面设置这两种过期策略,你要用到 MemoryCacheEntryOptions 对象。如下代码向你展示了如何去使用。

  上述代码来自于修改过的 Index() action,它创建了一个 MemoryCacheEntryOptions 的对象,然后将它的 AbsoluteExpiration 属性设置为从此刻到一分钟之后的一个 DateTime 值,它还将 SlidingExpiration 属性设置为一分钟。这些值都指定了该缓存项会在一分钟之后从缓存移除,不管其是否会被访问。此外,如果该缓存项如初持续空闲了有一分钟,它也会被从缓存中移除。

  有时你会想要在缓存项从缓存中被移除时收到通知。可能会有多种原因需要从缓存中移除数据项。例如,因为明确地执行了 Remove() 方法而移除了一个缓存项, 也有可能是因为它的 AbsoluteExpiration 和 SlidingExpiration 值已经到期而被移除,诸如此类的原因。

  为了能知道项目是何时从缓存移除的,你需要编写一个缓存函数。如下代码向你展示了如何去做这件事情:

  请仔细观察这段代码。 MyCallback() 是 HomeController 类里面的一个私有静态函数,它有四个参数。前面两个参数表示刚刚删除的缓存项的键和值,第三个参数表示的是该数据项被删除的原因。EvictionReason 是一个枚举类型,它维护者各种可能的删除原因,如过期,删除以及替换。

  在回调函数的内部,我们会基于删除的原因构造一个字符串消息。我们想要将此消息设置成另外一个缓存项。这样做的话就需要访问 HomeController 的缓存对象,此时状态参数就可以排上用场了。使用状态对象,你可以对 HomeController 的缓存对象进行控制,并使用 Set() 增加一个 callbackMessage 缓存项。

  正如你可以设置缓存项的到期策略一样,你还可以为缓存项赋予优先级。如果服务器内存紧缺的话,就会基于此优先级对缓存项进行清理以回收内存。 想要设置优先级的话,就要再一次用到 MemoryCacheEntryOptions。

  你还可以对一组缓存项目之间的依赖关系进行设置,例如在删除一个缓存项时,所有依赖的项也会被删除。 要是你想要了解它是如何工作的,可以像下面这样对 Index()这个 action 做一下修改:

  代码首先创建了一个 CancellationTokenSource 对象,该对象被存储为一个独立的缓存项 cts。然后像之前那样创建出 MemoryCacheEntryOptions 对象。这时候调用 MemoryCacheEntryOptions 的 AddExpirationToken() 方法来指定过期令牌。我们不会在这里探讨 CancellationChangeToken 的细节。可以这样理解,过期令牌能让你有权利让一个缓存项过期。如果令牌处于活动状态的话,则缓存项就会在缓存中维持,而如果令牌被取消掉了,则该缓存项就将从缓存中删除掉。一旦缓存项从缓存中删除掉了,MyCallback 就像之前一样被调用。之后代码又创建了两个缓存项—— key1 和 key2。在添加这两个缓存项时,Set() 的第三个参数将基于之前所创建的 cts 对象传递一个 CancellationChangeToken。

  这样做就意味着这里我们有了三个键 – timestamp 是主键,而 key1 和 key2 则依赖于 timestamp。当 timestamp 被删除时,key1 和 key2 也应该被删除掉。要删除 timestamp,你需要在代码中的某个地方取消其令牌。www493333com开马,我们可以单独的一个 action(Remove())中进行这样的操作。

  这里我们先获取到之前存储的 CancellationTokenSource 对象,并调用它的 Cancel() 方法。这样做会把 timestamp,key1 以及 key2 都删除掉。 你可以通过在 Show() 这个 action 中获取一下所有这三个键来确认它们是否已经被删除掉了。返回搜狐,查看更多


雷锋专题图库| 香港九龙全年历史图库| 2018年香港开奖现场直播结果| 香港黄大仙高手论坛| 财神六合网| 香港马会资料书本大全| 高手收集杀肖统计论坛| 香港九龙六合开奖资料| 一线图库彩图资料大全| 好彩堂特码分析网|