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的簡單使用