Azure - Redis Cache

24 August 2014 — Written by Sky Chang
#ASP.NET MVC#Azure#Redis

在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就可以了。

image

然後我們要輸入一下DNS的位置;然後依據你想要使用的大小,選擇方案,基本上目前Redis Cache有兩種方案,一種是Basic,一種是Standard;Basic比較便宜,但是不保證SLA 99.95,而Standard基本上都有SLA 99.95 ( 詳細資訊可以參考官網 )。

另外,如果不滿1G,通常都會和別人共用,所以如果想獨享,那就要選1G以上方案 ( 好像在講手機4G行動方案的感覺= =|| )

接下來要選擇Resource Group、要使用的帳號、和地區。

image

完成之後,就可以等他建立完成;完成之後,我們就可以從下圖的位置取得密碼等資訊。

image

到這邊,就建立完成了!!

Application

應用程式這邊,則要使用第三方套件,才能對Redis Cache進行操作;我們可以使用NuGet打"StackExchange.Redis"取得,如下圖。而這邊,兩個套件選擇其中一個就可以;如果你喜歡Strong-Name,那可以選擇第二個。( 關於Strong-Name,有興趣的朋友可以Google ),另外,要注意的是目前這個Lib只支援.Net Framework 4以上版本。

image

接下來就是寫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裡面去。

參考資料

Sky & Study4.TW