1. 程式人生 > >Nancy之Cache的簡單使用

Nancy之Cache的簡單使用

memcach span AR col only private lib 是否 對象

原文:Nancy之Cache的簡單使用

一、前言

說起緩存,或許大家都不陌生,甚至是天天都在用!當然緩存也被分的越來越細,頁面緩存、數據緩存、文件緩存等等。

其實呢,我個人覺得,主要還是兩大類:數據的緩存和頁面的緩存。數據緩存的話就包括所有跟數據扯上關系的都可以

歸到這一類,至於頁面緩存的話,就是把一些頁面緩存起來,尤其是靜態的頁面,對訪問速度可以說是杠杠的。本文主要

介紹的是數據的緩存。當然本文說是這Nancy中使用,但是這一塊是通用的,無論你是在MVC、WebForm、甚至是最新的

Asp.Net Core都是基本一致的。可以選擇的緩存類型又有很多,可以用微軟自己的MemoryCache,可以用牛逼的Redis,當然

也可以用分布式緩存MemCached,如果問要怎麽選的話,那就是視情況而定!

說起數據緩存,最直接想到的肯定就是對時間的緩存。在某個頁面顯示一個時間,緩存了10秒的話,那這10秒怎麽刷新都是不換

變化的。這個可以說是理解緩存最最最簡單的一個例子了。下面就來看看Demo吧。

二、用MemoryCache的Demo

先簡單介紹一下MemoryCache吧,MemoryCache是位於System.Runtime.Caching下面的一個類。

裏面具體的一些屬性和方法可以參見msdn上的介紹

https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache

值得一提的是Default這個屬性。這個屬性也是我們等下要用到的。MemoryCache中的實現用了單例模式,更具體的可以參見源碼

http://referencesource.microsoft.com/#System.Runtime.Caching/System/Caching/MemoryCache.cs

好了,不廢話了,開始正題了。

首先定義一個ICache的接口

 1 namespace NancyFxDemo01.MyCache
 2 {
 3     public interface ICache
 4     {
 5         /// <summary>
6 /// 添加緩存對象 7 /// </summary> 8 /// <param name="key">緩存Key</param> 9 /// <param name="obj">要緩存的對象</param> 10 void Add(string key, object obj); 11 /// <summary> 12 /// 添加有時間限制的緩存對象 13 /// </summary> 14 /// <param name="key">緩存Key</param> 15 /// <param name="obj">要緩存的對象</param> 16 /// <param name="seconds">緩存時間</param> 17 void Add(string key, object obj, int seconds); 18 /// <summary> 19 /// 判斷指定的Key是否已經有緩存數據 20 /// </summary> 21 /// <param name="key">緩存Key</param> 22 /// <returns>true/false</returns> 23 bool Exists(string key); 24 /// <summary> 25 /// 獲取緩存的對象 26 /// </summary> 27 /// <typeparam name="T">緩存對象的類型</typeparam> 28 /// <param name="key">緩存Key</param> 29 /// <returns>緩存的對象</returns> 30 T Get<T>(string key); 31 /// <summary> 32 /// 移除緩存項 33 /// </summary> 34 /// <param name="key">緩存Key</param> 35 void Remove(string key); 36 } 37 }

這個接口應該沒有什麽好說的,了解過緩存的應該都是懂的,不過寫的也不全,像清空緩存等方法還是沒有寫,不都都是挺好理解的。

有了接口,肯定會有實現!Cache就是基於MemoryCache實現的。

 1 using System;
 2 using System.Runtime.Caching;
 3 namespace NancyFxDemo01.MyCache
 4 {
 5     public class Cache : ICache
 6     {       
 7         private readonly MemoryCache _cache;
 8         private readonly CacheItemPolicy _defaultCacheItemPolicy;
 9         public Cache()
10         {
11             _cache = MemoryCache.Default;
12             _defaultCacheItemPolicy = new CacheItemPolicy { SlidingExpiration = TimeSpan.FromSeconds(60 * 2) };
13         }
14         /// <summary>
15         /// 添加緩存對象
16         /// </summary>
17         /// <param name="key">緩存Key</param>
18         /// <param name="obj">要緩存的對象</param>
19         public void Add(string key, object obj)
20         {
21             var cacheItem = new CacheItem(key, obj);
22             _cache.Set(cacheItem, _defaultCacheItemPolicy);
23         }
24         /// <summary>
25         /// 添加有時間限制的緩存對象
26         /// </summary>
27         /// <param name="key">緩存Key</param>
28         /// <param name="obj">要緩存的對象</param>
29         /// <param name="seconds">緩存時間</param>
30         public void Add(string key, object obj, int seconds)
31         {
32             _cache.Set(key, obj, DateTimeOffset.Now.AddSeconds(seconds));
33         }
34         /// <summary>
35         /// 判斷指定的Key是否已經有緩存數據
36         /// </summary>
37         /// <param name="key">緩存Key</param>
38         /// <returns>true/false</returns>
39         public bool Exists(string key)
40         {
41             return _cache.Get(key) != null;
42         }   
43         /// <summary>
44         /// 獲取緩存的對象
45         /// </summary>
46         /// <typeparam name="T">緩存對象的類型</typeparam>
47         /// <param name="key">緩存Key</param>
48         /// <returns>緩存的對象</returns>
49         public T Get<T>(string key)
50         {
51             return (T)_cache.Get(key);
52         }
53         /// <summary>
54         /// 移除緩存項
55         /// </summary>
56         /// <param name="key">緩存Key</param>
57         public void Remove(string key)
58         {
59             _cache.Remove(key);
60         }
61     }
62 }

前面說過,會用到Default這個屬性。我是在構造函數中去賦值的。那些常規的操作就是通過MemoryCache.Default去進行操作的!

下面就是Nancy的代碼了,如果對Nancy還有疑問的話,可以去看看我前面介紹Nancy的文章。

 1 using System;
 2 using Nancy;
 3 using NancyFxDemo01.MyCache;
 4 namespace NancyFxDemo01
 5 {
 6     public class FirstModule : NancyModule
 7     {
 8         public FirstModule()
 9         {
10             Get["/"] = _ => 
11             {
12                 string time = DateTime.Now.ToString();
13                 ICache cache = new Cache();
14                 if (!cache.Exists("time"))
15                 {
16                     cache.Add("time", time , 10);
17                     return DateTime.Now.ToString();
18                 }
19                 return cache.Get<string>("time");
20             };
21         }
22     }
23 }

效果圖:

技術分享圖片

可以看到,這個時間被緩存了10秒,十秒之後才會發生變化。

三、用Redis的Demo

Redis可以說是神器啊,它的性能確實比memcached要好一些。

要用Redis,肯定要先裝一個redis,這個是必不可少的,本人裝的是windows版,具體如下:

技術分享圖片

當然,這只是個大前提,要想去操作Redis還得用工具的,這個時候我們可以通過NuGet去安裝

StackExchange.Redis 或者是 ServiceStack.Redis ,相信這兩個是大家用的最多的。

技術分享圖片

示例用的是StackExchange.Redis這個包。

 1 using System;
 2 using Nancy;
 3 using StackExchange.Redis;
 4 namespace NancyFxDemo01
 5 {
 6     public class SecondModule : NancyModule 
 7     {
 8         private string _host = "127.0.0.1";
 9         public SecondModule()
10         {
11             Get["/redis"] = _ => 
12             {
13                 string time = DateTime.Now.ToString();
14                 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(_host);
15                 IDatabase db = redis.GetDatabase();
16                 if (!db.KeyExists("time"))
17                 {
18                     db.StringSet("time", time, TimeSpan.FromSeconds(10));
19                 }
20            
21                 return db.StringGet("time").ToString() ;
22             };
23         }
24     }
25 }

這個是在Nancy中使用Redis的代碼,這裏的話就沒對Reids的操作進行封裝,是直接在方法裏面進行了操作。

下面是效果圖

技術分享圖片

可以看到效果已經出來了!!!

至於memcached的話,就不在做Demo演示了。

四、總結

本文這兩個例子比較簡單,但是應該是通俗易懂的。不過篇幅基本都在介紹緩存,只是在Nancy中使用到了

這些知識而已。緩存說復雜的話,它並不那麽復雜,無非就是讀和寫。但是說簡單,它也並不簡單,用的時機以及怎麽用

對一個網站會帶來很重要的影響。

後面有時間的話會用Nancy和Redis做一個復雜一點的例子。

Nancy之Cache的簡單使用