在Open Source裡面,Redis其實算是非常紅的NOSQL資料庫,尤其是他的速度非常快(因為都存在Memory裡面),所以大家通常都會把Redis當作Cache使用。
( 這裡有簡體的Redis 設計與實踐手冊,有興趣的朋友可以看看,小弟是還沒空看就是了… )
而近年來,不斷改變形象的MS,現在Azure上,也幫我們實作了以Redis為核心的Cache,讓我們可以不用建立,立馬可以使用!!
除此之外,官方的Blog文章也指出,"微軟公司建議 Azure 用戶所有的新開發的應用系統,未來皆採用 Azure Redis Cache",所以可以看的出來Redis Cache已經取代了原先的Cache機制了…
另外,這邊也有"早期"的Redis Cache vs AppFabric的效能比較資訊,不過這種資訊參考參考就好,畢竟時代不斷的進步~
那接下來這篇,我們就來介紹一下Azure上的Redis Cache。
Create a cache
首先,我們當然是要建立Redis Cache,而在寫這篇文章的時候,還是Prieview,所以要用於正式環境的朋友,要注意一下喔!~要啟用Redis Cache,必須於新版的Azure Portal上,才可以看見,所以大家記得切換到新版的Portal上喔!~
要建立很簡單,只要選擇Redis Cache就可以了。
然後我們要輸入一下DNS的位置;然後依據你想要使用的大小,選擇方案,基本上目前Redis Cache有兩種方案,一種是Basic,一種是Standard;Basic比較便宜,但是不保證SLA 99.95,而Standard基本上都有SLA 99.95 ( 詳細資訊可以參考官網 )。
另外,如果不滿1G,通常都會和別人共用,所以如果想獨享,那就要選1G以上方案 ( 好像在講手機4G行動方案的感覺= =|| )
接下來要選擇Resource Group、要使用的帳號、和地區。
完成之後,就可以等他建立完成;完成之後,我們就可以從下圖的位置取得密碼等資訊。
到這邊,就建立完成了!!
Application
應用程式這邊,則要使用第三方套件,才能對Redis Cache進行操作;我們可以使用NuGet打"StackExchange.Redis"取得,如下圖。而這邊,兩個套件選擇其中一個就可以;如果你喜歡Strong-Name,那可以選擇第二個。( 關於Strong-Name,有興趣的朋友可以Google ),另外,要注意的是目前這個Lib只支援.Net Framework 4以上版本。
接下來就是寫Code了!!~,基本上我們這邊會有三個簡單的Demo;首先我們會使用ConnectionMultiplexer.Connect來設定連線字串;如果不想要SSL,可以把SSL設為False;而後面的Password就是我們上面所看到的Key。
另外,官方網站有特別提到,ConnectionMultiplexer.Connect只需要設定一次,就可以給你的這個應用程式使用,如果設定多次,可能會有效能下降的疑慮。接下來,我們可以使用connection.GetDatabase()來取得IDatabase的實體,到時候我們就可以使用這個Object來操作Redis Cache。
我們要存放資料很簡單,只需要下cache.StringSet("Key1", "value");,而不需要在下啥SaveChange等指令…;Redis裡面存的是Key、Value,而這個Value基本上是文字;但我們也可以把二進位元碼存、C# Object存進去;只是要稍微轉換一下就是了。
要取出來也很簡單;我們可以用StringGet(“Key1”)來把資料放到MVC的ViewData裡面;而如果裡面沒有東西,則會回傳Null,所以透過此機制,我們可以很簡單的實作出Cache-Aside Pattern ( 如Demo-2 )
最後,如果有需要,也可以設定過期時間,如Demo-3。
using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace RedisCacheDemo.Controllers { public class HomeController : Controller { // GET: Home public ActionResult Index() { //設定連線字串 ConnectionMultiplexer connection = ConnectionMultiplexer.Connect( "skyrediscache.redis.cache.windows.net,ssl=true,password=...."); IDatabase cache = connection.GetDatabase(); //Demo-1 存放簡單的形態到Cache cache.StringSet("key1", "value"); cache.StringSet("key2", 25); //取得資料 ViewData["key1"] = cache.StringGet("key1"); ViewData["key2"] = (int)cache.StringGet("key2"); //Demo-2 Cache-Aside Pattern string value = cache.StringGet("key1"); if (value == null) { //如果找不到資料,就從資料庫取得 value = GetValueFromDataSource(); cache.StringSet("key1", value); } //Demo-3 指定時間 cache.StringSet("key1", "value1", TimeSpan.FromMinutes(90)); return View(); } } }
基本上這部份的操作就是這樣,還滿簡單的;下一篇,我們來看看,如何將Session存放到Redis Cache裡面去。
參考資料
- http://redis.io/
- http://redisbook1e-gallery.readthedocs.org/en/latest/?utm_content=buffer98244&utm_medium=social&utm_source=facebook.com&utm_campaign=buffer
- http://blogs.technet.com/b/azuretw/archive/2014/08/09/azure-cache.aspx
- http://azure.microsoft.com/zh-tw/documentation/articles/cache-dotnet-how-to-use-azure-redis-cache/
- http://msdn.microsoft.com/en-us/library/dn589799.aspx
- http://msdn.microsoft.com/en-us/library/dn690523.aspx