原文: 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做一個複雜一點的例子。