天天看點

Nancy之Cache的簡單使用

原文: 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 }      

效果圖:

Nancy之Cache的簡單使用

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

三、用Redis的Demo

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

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

Nancy之Cache的簡單使用

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

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

Nancy之Cache的簡單使用

示例用的是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的操作進行封裝,是直接在方法裡面進行了操作。

下面是效果圖

Nancy之Cache的簡單使用

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

至于memcached的話,就不在做Demo示範了。 

四、總結

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

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

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

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

繼續閱讀