使用 Cache 的目地不外乎是為了避免經常性取資料,另一方面也是為了減輕 DB 的負擔而使用,最常見的不外乎是 run time cache 與 redis cache,而這兩者有什麼不同?
Memory cache 主要是單一 server 裡存放在記憶體的資料
寫入的方式非常簡單
public string SetMemeryCache(string name, string value)
{
string key = name;
Stopwatch sw = new Stopwatch();
sw.Start();
HttpRuntime.Cache[key] = value;
sw.Stop();
return $"write to in memery cache, it takes {sw.ElapsedMilliseconds} mili-secs";
}
若要指定 cache 的過期時間則要使用另一種寫法
HttpRuntime.Cache.Insert(
key
, value
, null
, DateTime.Now.AddMinutes( 10 )
, Cache.NoSlidingExpiration
);
取得的方式也非常簡單
public string GetMemeryCache(string name)
{
string key = name;
Stopwatch sw = new Stopwatch();
sw.Start();
var value = HttpRuntime.Cache[key];
sw.Stop();
return $"read from in memery cache, it takes {sw.ElapsedMilliseconds} mili-secs, value is {value.ToString()}";
}
優點:
以實測來講 Set, Get 幾乎是花不到什麼時間,幾乎都是在 10ms 以下的時間
缺點:
Cache 重新啟動程式後即會消失
上述所提的 memory cache 是個不錯的做法,然後 redis cache 的出現,則是要解決其他的問題
若是透過 load balance 指到的機器共有三台,但快取的方式都使用了 memory cache 的方式
在資源上等同於存了三份一樣的東西,如果今天 cache 的 key-value 集合數高達數萬筆以上
等同於是浪費了許多資源在做一樣的事情
所以 redis cache 在 load balance 的環境上是相當常見的使用方式
官方文件也有寫出怎麼快速建立 azure redis cache
初始化 redis cache, 這裡習 GetDatabase 初始化若不指定則為第 0 個 redis db
IDatabase cache = lazyConnection.Value.GetDatabase();
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
{
string cacheConnection = ConfigurationManager.AppSettings["RedisCacheConnection"].ToString();
return ConnectionMultiplexer.Connect(cacheConnection);
});
public static ConnectionMultiplexer Connection
{
get
{
return lazyConnection.Value;
}
}
寫入
public string setCache(string name, string value)
{
Stopwatch sw = new Stopwatch();
sw.Start();
cache.StringSet(name, value, new TimeSpan(0, 1, 0));
sw.Stop();
return $"write to cache, it takes {sw.ElapsedMilliseconds} mili-secs";
}
取出
public string getCache(string name)
{
Stopwatch sw = new Stopwatch();
sw.Start();
var value = cache.StringGet(name);
sw.Stop();
return $"get from cache, value is {value}, it takes {sw.ElapsedMilliseconds} mili-secs";
}
測試下來,讀取與寫入小量資料大約都落在 50-60ms 左右
雖然不像 memory cache 那麼快,但為了省空間與解決 load balance 的問題來說也算是效能不錯的工具
由於資料是寫到 redis 上,有時候想看即時資料要寫測試程式也略顯麻煩
可以使用 Redis Desktop Manager 這套工具,最新版本是要錢的,但舊一點的版本還不需要收費
上面所講的 lazyConnection.Value.GetDatabase(); 沒有指定的話即是寫到 db0 去
可視自己使用的情況去存到不同的 db 去
以管理介面來說,甚至可以 rename key 與查看 TTL (以這個例子來說只剩 18 秒有效) ,可說是相當方便的工具
參考文件:
https://github.com/uglide/RedisDesktopManager/releases