.net使用CSRedis操作Redis快取的簡單筆記(新手教程)
阿新 • • 發佈:2021-02-21
## 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