Redis概念 Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合) ...
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的客戶端工具來看看是否能獲取到剛纔插入的數據