C# Redis使用及幫助類

環境準備

目前官網已經沒有window版本的安裝文件了,window環境需要到github下載,地址如下:https://github.com/microsoftarchive/redis/tags
下載安裝文件安裝完成後,切換到安裝目錄,運行如下命令啓動redis服務:

redis-server.exe redis.windows.conf

提示服務啓動成功後,進行簡單的測試
在這裏插入圖片描述
讀取寫入及刪除都正常,環境準備已經完成。

C#操縱Redis

首先VS通過nuget安裝StackExchange.Redis
在這裏插入圖片描述
然後我們嘗試通過StackExchange.Redis對Redis緩存數據庫做一些基本的操作。
首先需要引用命名空間

using StackExchange.Redis;

然後建立連接並且選擇數據庫,注意每個數據庫對外都是一個從0開始的遞增數字命名,Redis默認支持16個數據庫,可以通過配置databases來修改這一數字。客戶端與Redis建立連接後會自動選擇0號數據庫,不過可以隨時使用SELECT命令更換數據庫。

//不傳端口號時爲默認端口號6379
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();//不傳參的情況下選擇0號數據庫

然後就可以調用API設置讀取Redis緩存了,例如我們嘗試寫入並去讀一個字符串

string value = "abcdefg";
db.StringSet("mykey", value);
...
string value = db.StringGet("mykey");
Console.WriteLine(value); // writes: "abcdefg"

C# Redis幫助類

基本配置使用我們已經會了,然後嘗試封裝一個幫助類可以進行一些常用的操作,例如下面我們封裝了四個方法,分別可以將一個泛型List添加到緩存,從緩存中獲取指定泛型List,通過Lambda表達式刪除指定List中滿足條件的元素,通過Lambda表達式獲取指定List中滿足條件的集合。更多的方法如果有興趣可以自己嘗試封裝

public class RedisHelper
    {
        static ConnectionMultiplexer redis = null;
        public RedisHelper(string connstr)
        {
            redis = ConnectionMultiplexer.Connect(connstr);
        }
        /// <summary>
        /// 將一個泛型List添加到緩存中
        /// </summary>
        /// <typeparam name="T">泛型T</typeparam>
        /// <param name="listkey">Key</param>
        /// <param name="list">list</param>
        /// <param name="db_index">數據庫序號,不傳默認爲0</param>
        /// <returns></returns>
        public bool addList<T>(string listkey,List<T> list,int db_index=0)
        {
            var db = redis.GetDatabase(db_index);
            var value = JsonConvert.SerializeObject(list);
            return db.StringSet(listkey, value);
            
        }
        /// <summary>
        /// 通過指定Key值獲取泛型List
        /// </summary>
        /// <typeparam name="T">泛型T</typeparam>
        /// <param name="listkey">Key</param>
        /// <param name="db_index">數據庫序號,不傳默認爲0</param>
        /// <returns></returns>
        public List<T> getList<T>(string listkey,int db_index = 0)
        {
            var db = redis.GetDatabase(db_index);
            if (db.KeyExists(listkey))
            {
                var value = db.StringGet(listkey);
                if (!string.IsNullOrEmpty(value))
                {
                    var list = JsonConvert.DeserializeObject<List<T>>(value);
                    return list;
                }
                else
                {
                    return new List<T>();
                }
            }
            else
            {
                return new List<T>();
            }
        }
        /// <summary>
        /// 刪除指定List<T>中滿足條件的元素
        /// </summary>
        /// <param name="listkey">Key</param>
        /// <param name="func">lamdba表達式</param>
        /// <param name="db_index">數據庫序號,不傳默認爲0</param>
        /// <returns></returns>
        public bool delListByLambda<T>(string listkey, Func<T, bool> func,int db_index = 0)
        {
            var db = redis.GetDatabase(db_index);
            if (db.KeyExists(listkey))
            {
                var value = db.StringGet(listkey);
                if (!string.IsNullOrEmpty(value))
                {
                    var list = JsonConvert.DeserializeObject<List<T>>(value);
                    if (list.Count>0)
                    {
                        list = list.SkipWhile<T>(func).ToList();
                        value = JsonConvert.SerializeObject(list);
                        return db.StringSet(listkey, value);
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 獲取指定List<T>中滿足條件的元素
        /// </summary>
        /// <param name="listkey">Key</param>
        /// <param name="func">lamdba表達式</param>
        /// <param name="db_index">數據庫序號,不傳默認爲0</param>
        /// <returns></returns>
        public List<T> getListByLambda<T>(string listkey, Func<T, bool> func, int db_index = 0)
        {
            var db = redis.GetDatabase(db_index);
            if (db.KeyExists(listkey))
            {
                var value = db.StringGet(listkey);
                if (!string.IsNullOrEmpty(value))
                {
                    var list = JsonConvert.DeserializeObject<List<T>>(value);
                    if (list.Count > 0)
                    {
                        list = list.Where(func).ToList();
                        return list;
                    }
                    else
                    {
                        return new List<T>();
                    }
                }
                else
                {
                    return new List<T>();
                }
            }
            else
            {
                return new List<T>();
            }
        }
    }

在本篇中我們介紹了Redis的安裝配置及如何使用C#操縱Redis緩存並且簡單封裝了一個幫助類,在下篇將通過一個爬蟲的案例分享Redis在實際項目中的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章