net core WebApi——快取神器Redis
目錄
- 前言
- Redis
- 使用
- RedisUtil
- 測試
- 小結
@
前言
中秋過完不知不覺都已經快兩週沒動這個工程了,最近業務需要總算開始搞後臺雲服務了,果斷直接net core搞起,在做的中間遇到了不少問題,這個後續會一點點列出來包括解決方法,今天就先把之前挖的坑填一個。
Redis
之前在快取那篇提到過,Cookie,Session,Cache這幾個不同的快取方式,Cookie是存在客戶端瀏覽器的,Session實質上也是客戶端的儲存,至於Cache是服務端的,但是如果是分散式的話,這幾個方式可能除了Cookie其他兩個都要有點兒問題,畢竟一臺服務只儲存自身一臺,如果多臺的話,需要涉及到多服務的互動,比如一臺服務做了Cache儲存,需要給其他服務傳送內部訊號或是http請求,其他服務根據請求執行對應操作。
當然這是在沒有用到Redis的前提下,Redis是解決分散式快取的神器,相當於是自身一臺伺服器專門處理資料的讀寫,可以理解為資料伺服器(個人感覺。。。),至於自己業務的分散式只是為了業務需要去執行,需要用到資料快取即可直接呼叫Redis的讀寫操作(當然,各個服務的Redis配置要保持一致)。
Redis的安裝和配置在Linux配置部署_新手向(四)——Redis安裝與配置已經說過,當時就是為了使用Redis而做了個小鋪墊。
使用
首先,只要是類庫肯定是引入Nuget包了,我們在April.Util引入Microsoft.Extensions.Caching.Redis,當然其他也有StackExchange.Redis,CSRedisCore,這裡先試試官方的吧,官方擴充套件包地址。
引入完之後,我們在appsettings.json來配置下地址目錄。
之後我們看下Redis的方法,畢竟呼叫第三方都是看看然後根據自己需要裹一下。
也是先要初始化配置資訊,然後建立實體物件,呼叫方法,這裡說明下,預設的value值是byte[],當然官方也有擴充套件方法。
好了,看完了方法,我們來開始Util吧。
RedisUtil
首先,我們還是要先做配置資訊,前面已經在appsettings寫過配置資訊,這裡直接在AprilConfig中新增上。
private static string _IsOpenCache = string.Empty; /// <summary> /// 是否使用Redis /// </summary> public static bool IsOpenCache { get { if (string.IsNullOrEmpty(_IsOpenCache)) { _IsOpenCache = Configuration["Redis:IsOpenRedis"]; } if (_IsOpenCache.ToLower() == "true") { return true; } return false; } } private static string _RedisConnectionString = string.Empty; /// <summary> /// Redis預設連線串 /// </summary> public static string RedisConnectionString { get { if (string.IsNullOrEmpty(_RedisConnectionString)) { _RedisConnectionString = Configuration["Redis:ConnectionString"]; } return _RedisConnectionString; } }
配置資訊設定完成之後,開始初始化Redis的方法。
private static RedisCache _redisCache = null;
private static RedisCacheOptions options = null;
/// <summary>
/// 初始化Redis
/// </summary>
public static void InitRedis()
{
if (AprilConfig.IsOpenCache)
{
_redisCache = new RedisCache(GetOptions());
}
}
/// <summary>
/// 獲取配置項資訊
/// </summary>
/// <returns></returns>
protected static RedisCacheOptions GetOptions()
{
options = new RedisCacheOptions();
options.Configuration = AprilConfig.RedisConnectionString;
options.InstanceName = "April.Redis";
return options;
}
/// <summary>
/// 新增資料
/// </summary>
/// <param name="key">鍵</param>
/// <param name="value">值</param>
/// <param name="ExprireTime">過期時間</param>
public static void Add(string key, object value, int ExprireTime = 10)
{
if (string.IsNullOrEmpty(key))
{
return;
}
string strValue = string.Empty;
try
{
strValue = JsonConvert.SerializeObject(value);
}
catch (Exception ex)
{
LogUtil.Error($"Redis.Add轉換失敗:{ex.Message}");
}
if (!string.IsNullOrEmpty(strValue))
{
_redisCache.SetString(key, strValue, new Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions()
{
AbsoluteExpiration = DateTime.Now.AddMinutes(ExprireTime)
});
}
}
/// <summary>
/// 獲取資料(物件)
/// </summary>
/// <typeparam name="T">物件型別</typeparam>
/// <param name="key">鍵</param>
/// <returns></returns>
public static T Get<T>(string key)
{
string value = Get(key);
if (string.IsNullOrEmpty(value))
{
return default(T);
}
T obj = default(T);
try
{
obj = JsonConvert.DeserializeObject<T>(value);
}
catch (Exception ex)
{
LogUtil.Error($"Redis.Get轉換失敗:{ex.Message},資料:{value}");
}
return obj;
}
/// <summary>
/// 移除資料
/// </summary>
/// <param name="key">鍵</param>
public static void Remove(string key)
{
if (!string.IsNullOrEmpty(key))
{
_redisCache.Remove(key);
}
}
/// <summary>
/// 重置資料
/// </summary>
/// <param name="key">鍵</param>
/// <param name="value">值</param>
/// <param name="expireTime">過期時間</param>
public static void Replace(string key, object value, int expireTime = 10)
{
if (!string.IsNullOrEmpty(key))
{
Remove(key);
Add(key, value, expireTime);
}
}
具體使用的方法,這裡不多寫了,程式碼地址見net core Webapi 總目錄,感覺程式碼貼的多了,自己也習慣了複製貼上,看一個封裝好的方法,就要去看他的原始碼(如果只是用的話就算了),這樣對方法的使用以及自身的業務需要封裝會有很好的幫助,畢竟會用是第一步,會改是第二步,封裝是第三步,自己寫那就是最終級了(這句純屬自勉)。
測試
好了,寫完之後,習慣來一遍測試,不想自己整理的東西最終還是不能用,千篇一律不可怕,可怕的是不知道最終的效果。
新增
獲取
覆蓋
ps:說是覆蓋,其實就是刪除然後新增-,-|||
刪除
小結
寫到這裡基本上都結束了,簡單的說明了Redis的使用,後續還是會不斷更新,比如那麼多database,如果隨意切換,redis儲存之後會不會有什麼其他問題等等,學以致用,用方知錯,錯而能改,改了就行。