最近c#項目中遇到圖片讀取的性能問題,公司的技術總監推薦使用redis來存儲。為什么想到用redis來存儲:
第一:每張圖片不大,都是10-30kb左右一張。
第二:一個項目的圖片數量多,一個項目有20-30張圖片,並且圖片存儲在一個專門的圖片站點要求要1秒內把圖片下載到本地
第三:可以把圖片轉base64字符串存儲到redis中
最開始找的是ServiceStack.Redis,在找資料和技術文檔的時候發現是收費的,后面就選用了StackExchange.Redis。
/// <summary> /// Redis操作 /// </summary> public class RedisHelper { private static string connstr = System.Configuration.ConfigurationManager.AppSettings["RedisConnectStr"];// "127.0.0.1:6379,allowadmin=true"; private static ConnectionMultiplexer conn = ConnectionMultiplexer.Connect(connstr); private static IDatabase db = conn.GetDatabase(1); /// <summary> /// 獲取系統的redis key前綴 /// </summary> /// <param name="resourceid">資源Id</param> /// <returns></returns> public static string GetMyKey(string resourceid = "") { string Key = "report_"; if (!string.IsNullOrWhiteSpace(resourceid)) { Key = string.Format("report_res_{0}", resourceid); } return Key; } #region String 可以設置過期時間 /// <summary> /// 保存單個key value /// </summary> /// <param name="key">Redis Key</param> /// <param name="value">保存的值</param> /// <param name="expiry">過期時間</param> /// <returns></returns> public static bool SetStringKey(string key, string value, TimeSpan? expiry = default(TimeSpan?)) { return db.StringSet(key, value, expiry); } /// <summary> /// 保存多個key value /// </summary> /// <param name="arr">key</param> /// <returns></returns> public static bool SetStringKey(KeyValuePair<RedisKey, RedisValue>[] arr) { return db.StringSet(arr); } /// <summary> /// 保存一個對象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <param name="obj"></param> /// <returns></returns> public static bool SetStringKey<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?)) { string json = JsonConvert.SerializeObject(obj); return db.StringSet(key, json, expiry); } /// <summary> /// 獲取單個key的值 /// </summary> /// <param name="key">Redis Key</param> /// <returns></returns> public static RedisValue GetStringKey(string key) { return db.StringGet(key); } /// <summary> /// 獲取多個Key /// </summary> /// <param name="listKey">Redis Key集合</param> /// <returns></returns> public static RedisValue[] GetStringKey(List<RedisKey> listKey) { return db.StringGet(listKey.ToArray()); } /// <summary> /// 獲取一個key的對象 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public static T GetStringKey<T>(string key) { return JsonConvert.DeserializeObject<T>(db.StringGet(key)); } #endregion #region Hash /// <summary> /// 保存一個集合 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">Redis Key</param> /// <param name="list">數據集合</param> /// <param name="getModelId"></param> public static void HashSet<T>(string key, List<T> list, Func<T, string> getModelId) { List<HashEntry> listHashEntry = new List<HashEntry>(); foreach (var item in list) { string json = JsonConvert.SerializeObject(item); listHashEntry.Add(new HashEntry(getModelId(item), json)); } db.HashSet(key, listHashEntry.ToArray()); } /// <summary> /// 獲取Hash中的單個key的值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">Redis Key</param> /// <param name="hasFildValue">RedisValue</param> /// <returns></returns> public static T GetHashKey<T>(string key, string hasFildValue) { if (!string.IsNullOrWhiteSpace(key) && !string.IsNullOrWhiteSpace(hasFildValue)) { RedisValue value = db.HashGet(key, hasFildValue); if (!value.IsNullOrEmpty) { return JsonConvert.DeserializeObject<T>(value); } } return default(T); } /// <summary> /// 獲取hash中的多個key的值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">Redis Key</param> /// <param name="listhashFields">RedisValue value</param> /// <returns></returns> public static List<T> GetHashKey<T>(string key, List<RedisValue> listhashFields) { List<T> result = new List<T>(); if (!string.IsNullOrWhiteSpace(key) && listhashFields.Count > 0) { RedisValue[] value = db.HashGet(key, listhashFields.ToArray()); foreach (var item in value) { if (!item.IsNullOrEmpty) { result.Add(JsonConvert.DeserializeObject<T>(item)); } } } return result; } /// <summary> /// 獲取hashkey所有Redis key /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public static List<T> GetHashAll<T>(string key) { List<T> result = new List<T>(); RedisValue[] arr = db.HashKeys(key); foreach (var item in arr) { if (!item.IsNullOrEmpty) { result.Add(JsonConvert.DeserializeObject<T>(item)); } } return result; } /// <summary> /// 獲取hashkey所有的值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key"></param> /// <returns></returns> public static List<T> HashGetAll<T>(string key) { List<T> result = new List<T>(); HashEntry[] arr = db.HashGetAll(key); foreach (var item in arr) { if (!item.Value.IsNullOrEmpty) { result.Add(JsonConvert.DeserializeObject<T>(item.Value)); } } return result; } /// <summary> /// 刪除hasekey /// </summary> /// <param name="key"></param> /// <param name="hashField"></param> /// <returns></returns> public static bool DeleteHase(RedisKey key, RedisValue hashField) { return db.HashDelete(key, hashField); } #endregion #region key /// <summary> /// 刪除單個key /// </summary> /// <param name="key">redis key</param> /// <returns>是否刪除成功</returns> public static bool KeyDelete(string key) { return db.KeyDelete(key); } /// <summary> /// 刪除多個key /// </summary> /// <param name="keys">rediskey</param> /// <returns>成功刪除的個數</returns> public static long keyDelete(RedisKey[] keys) { return db.KeyDelete(keys); } /// <summary> /// 判斷key是否存儲 /// </summary> /// <param name="key">redis key</param> /// <returns></returns> public static bool KeyExists(string key) { return db.KeyExists(key); } /// <summary> /// 重新命名key /// </summary> /// <param name="key">就的redis key</param> /// <param name="newKey">新的redis key</param> /// <returns></returns> public static bool KeyRename(string key, string newKey) { return db.KeyRename(key, newKey); } #endregion /// <summary> /// 追加值 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public static void StringAppend(string key, string value) { ////追加值,返回追加后長度 long appendlong = db.StringAppend(key, value); } }