Redis在.net 環境下的使用

Redis概念

        Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

        Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。

Redis 與 Memcached 區別

  • Memcached是多線程,而Redis使用單線程。(個人認爲Memcached在讀寫處理速度上由於Redis)
  • Memcached使用預分配的內存池的方式,Redis使用現場申請內存的方式來存儲數據,並且可以配置虛擬內存。
  • Redis可以實現持久化(也就是說redis需要經常將內存中的數據同步到硬盤中來保證持久化),主從複製,實現故障恢復。
  • Memcached只是簡單的key與value,但是Redis支持數據類型比較多。包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。

Redis支持兩種持久化方式:

   (1):snapshotting(快照)也是默認方式.(把數據做一個備份,將數據存儲到文件)

   (2)Append-only file(縮寫aof)的方式 

   快照是默認的持久化方式,這種方式是將內存中數據以快照的方式寫到二進制文件中,默認的文件名稱爲dump.rdb.可以通過配置設置自動做快照持久化的方式。我們可以配置redis在n秒內如果超過m個key鍵修改就自動做快照.

   aof方式:由於快照方式是在一定間隔時間做一次的,所以如果redis意外down掉的話,就會丟失最後一次快照後的所有修改。aof比快照方式有更好的持久化性,是由於在使用aof時,redis會將每一個收到的寫命令都通過write函數追加到文件中,當redis重啓時會通過重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。 

Windows環境下Redis的安裝

windows版本redis下載地址:https://github.com/microsoftarchive/redis/releases

Redis服務端安裝  

點擊安裝文件安裝以後,打開本地服務管理器,並啓動redis相關服務

 

 

打開redis的安裝目錄文件

用vs打開 redis.windows-service.conf 可以看到相關配置,如redis服務的端口信息

 

 

 

 

在.net開發環境(客戶端)中使用 Redis

 我們創建一個項目,控制檯程序或者web程序都可以。然後通過vs的nuget程序包管理工具安裝  stackExchange.Redis 包

 

安裝以後創建一個 RedisHelper.cs 幫助類,幫助類代碼如下:

    /// <summary>
    /// Redis讀寫幫助類
    /// </summary>
    public class RedisHelper
    {
        private string RedisConnectionStr = ConfigurationManager.AppSettings["RedisConnectionStr"];
        private ConnectionMultiplexer redis { get; set; }
        private IDatabase db { get; set; }
        public RedisHelper()
        {
            redis = ConnectionMultiplexer.Connect(RedisConnectionStr);
            db = redis.GetDatabase();
        }
        #region string類型操作
        /// <summary>
        /// set or update the value for string key 
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetStringValue(string key, string value)
        {
            return db.StringSet(key, value);
        }
        /// <summary>
        /// 保存單個key value
        /// </summary>
        /// <param name="key">Redis Key</param>
        /// <param name="value">保存的值</param>
        /// <param name="expiry">過期時間</param>
        /// <returns></returns>
        public bool SetStringKey(string key, string value, TimeSpan? expiry = default(TimeSpan?))
        {
            return db.StringSet(key, value, expiry);
        }
        /// <summary>
        /// 保存一個對象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        /// <returns></returns>
        public bool SetStringKey<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
        {
            string json = JsonHelper.SerializeObject(obj);
            return db.StringSet(key, json, expiry);
        }
        /// <summary>
        /// 獲取一個key的對象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public T GetStringKey<T>(string key) where T : class
        {
           var result= db.StringGet(key);
            if (string.IsNullOrEmpty(result))
            {
                return null;
            }
            try
            {
                return JsonHelper.DeserializeObject<T>(result);
            }
            catch
            {
                return null;
            }
        }
        /// <summary>
        /// get the value for string key 
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetStringValue(string key)
        {
            return db.StringGet(key);
        }

        /// <summary>
        /// Delete the value for string key 
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool DeleteStringKey(string key)
        {
            return db.KeyDelete(key);
        }
        #endregion

        #region 哈希類型操作
        /// <summary>
        /// set or update the HashValue for string key 
        /// </summary>
        /// <param name="key"></param>
        /// <param name="hashkey"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetHashValue(string key, string hashkey, string value)
        {
            return db.HashSet(key, hashkey, value);
        }
        /// <summary>
        /// set or update the HashValue for string key 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="hashkey"></param>
        /// <param name="t">defined class</param>
        /// <returns></returns>
        public bool SetHashValue<T>(String key, string hashkey, T t) where T : class
        {
            var json = JsonHelper.SerializeObject(t);
            return db.HashSet(key, hashkey, json);
        }
        /// <summary>
        /// 保存一個集合
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">Redis Key</param>
        /// <param name="list">數據集合</param>
        /// <param name="getModelId"></param>
        public 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 = JsonHelper.SerializeObject(item);
                listHashEntry.Add(new HashEntry(getModelId(item), json));
            }
            db.HashSet(key, listHashEntry.ToArray());
        }
        /// <summary>
        /// 獲取hashkey所有的值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public List<T> HashGetAll<T>(string key) where T : class
        {
            List<T> result = new List<T>();
            HashEntry[] arr = db.HashGetAll(key);
            foreach (var item in arr)
            {
                if (!item.Value.IsNullOrEmpty)
                {
                    T t;
                    if (JsonHelper.DeserializeJsonToObject<T>(item.Value,out t))
                    {
                        result.Add(t);
                    }
                   
                }
            }
            return result;
            //result =JsonHelper.DeserializeJsonToList<T>(arr.ToString());                        
            //return result;
        }
        /// <summary>
        /// get the HashValue for string key  and hashkey
        /// </summary>
        /// <param name="key">Represents a key that can be stored in redis</param>
        /// <param name="hashkey"></param>
        /// <returns></returns>
        public RedisValue GetHashValue(string key, string hashkey)
        {
            RedisValue result = db.HashGet(key, hashkey);
            return result;
        }
        /// <summary>
        /// get the HashValue for string key  and hashkey
        /// </summary>
        /// <param name="key">Represents a key that can be stored in redis</param>
        /// <param name="hashkey"></param>
        /// <returns></returns>
        public T GetHashValue<T>(string key, string hashkey) where T : class
        {
            RedisValue result = db.HashGet(key, hashkey);
            if (string.IsNullOrEmpty(result))
            {
                return null;
            }
            T t;
            if (JsonHelper.DeserializeJsonToObject<T>(result,out t))
            {
                return t;
            }
            return null;         
        }
        /// <summary>
        /// delete the HashValue for string key  and hashkey
        /// </summary>
        /// <param name="key"></param>
        /// <param name="hashkey"></param>
        /// <returns></returns>
        public bool DeleteHashValue(string key, string hashkey)
        {
            return db.HashDelete(key, hashkey);
        }
        #endregion
    }

寫一個方法來測試使用Redis

namespace RedisDemo.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {

            RedisHelper redis = new RedisHelper();
            redis.SetStringKey("Name", "ccc");
            string Name= redis.GetStringValue("Name");
            redis.SetStringKey<List<string>>("list", new List<string> { "dada", "daccz", "ccc" });
            return View();
        }
    }
}

 

 我們分別插入了一個string類型和list類型的數據

然後通過redis的客戶端工具來看看是否能獲取到剛纔插入的數據

 

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