1. 程式人生 > >.net使用CSRedis操作Redis快取的簡單筆記(新手教程)

.net使用CSRedis操作Redis快取的簡單筆記(新手教程)

## 0.介紹 > .NET Core or .NET Framework 4.0+ client for Redis and Redis Sentinel (2.8) and Cluster. Includes both synchronous and asynchronous clients. 本文記錄CSRedis在開發過程中的簡單使用,可以直接除錯樣例原始碼。 ## 1. 參考資料 > github https://github.com/2881099/csredis > 作者部落格 https://www.cnblogs.com/kellynic/p/9952386.html > Redis Runoob教程 https://www.runoob.com/redis/redis-install.html ## 2.核心內容 - #### 使用心得 1.科學使用快取 - 從Redis中讀取資料 從Redis中讀取資料需要考慮"資料存在,但是Redis中過期或者未寫入的情況"這時候就需要根據指定Key先獲取資料再寫入Redis中。 - 將資料寫入Redis 寫入Redis需要增加過期時。增加過期時間的時候可以將時間隨機,這樣可以避免快取在相同時間過期而引發快取雪崩。 在高併發的情況下,如果根據key獲取的資料不存在,也將null儲存至Redis中,而非抽象類(AbstractRedisService)中做刪除動作,這樣可避免快取穿透。 > 我對高併發場景下的快取使用理解不深,AbstractRedisService抽象類在更新失效值的時候使用了lock,使用lock寫法容易造成堵塞,但是如果不使用lock的話,就會出現重複讀取再寫入Redis的情況,並且在當前情況下如何處理快取擊穿也不是很清楚,希望大家能不吝賜教~ 2.在使用CSRedis的時候遇到了多個業務模組都有相識的程式碼,於是抽取了抽象類AbstractRedisService,在業務模組實現的時候只需要實現RedisGroup 屬性與GetKeyByRedisInputKey、GetValueByKey兩個方法。 3.在實際應用中,有可能會出現程式與Redis服務連線不穩定的情況,如果Redis服務沒有發現問題的話,可以嘗試使用下面三種方式解決(參考 https://github.com/2881099/csredis/issues) - connectTimeout=30000 設定連線超時時間 - tryit=3 設定重試次數 - preheat=100 預熱連線數 - #### 初始化RedisHelper ``` // 初始化RedisHelper RedisHelper.Initialization(CSRedisInstance.GetRedis()); /// /// CSRedisClient 單例 /// internal class CSRedisInstance { private static readonly object _lock = new object(); private static CSRedisClient _csRedis = null; private const string ip = "127.0.0.1"; private const string port = "6379"; private const string preheat = "100"; // 設定預熱連線數 private const string connectTimeout = "100"; // 設定連線超時時間 private const string tryit = "1"; // 設定重試次數 private const string prefix = "CSRedisTest."; // 設定字首 private static readonly string _connectString = $"{ip}:{port}," + $"preheat={preheat},connectTimeout={connectTimeout},tryit={tryit},prefix={prefix}"; internal static CSRedisClient GetRedis() { if (_csRedis == null) { lock (_lock) { if (_csRedis == null) { _csRedis = GetCSRedisClient(); } } } return _csRedis; } private static CSRedisClient GetCSRedisClient() { return new CSRedisClient(_connectString); } } ``` - #### 業務應用 - 抽象類分享 ##### AbstractRedisService抽象類 ``` /// /// Redis抽象類 - 快取內容根據Key指定重新整理 ///
/// /// public abstract class AbstractRedi