Asp.net Core 緩存 MemoryCache 和 Redis
目錄索引
簡介
經過 N 久反復的嘗試,翻閱了網上無數的資料,GitHub上下載了十幾個源碼參考, Memory 和 Redis 終於寫出一個 簡陋 的 封裝,為了統一和易用,我們兩種緩存都統一實現了一個接口 ICacheService,微軟也有很多是通過IDistributedCache,大家可以參考 https://docs.asp.net/en/latest/performance/caching/distributed.html ,GitHub上也有很多很好的封裝,這里我們就不一一介紹了,大家自行參考,現在搞 Asp.net Core的還是不是很多,中文的資料也少的可憐,而且基本都是千篇一律照搬,對於只認識 ABCDEFG的我來說,過程是十分艱辛的,一篇文章往往要看四五遍,逐行逐句翻譯,說多了都是淚,不說了,我們開始。期間,得到了很多朋友的幫助,在此表示感謝!
緩存接口 ICacheService
緩存也好,數據庫也好,我們就是進行CRUD操作,接口沒什么好解釋的,注釋我寫的很明白,這里就列給大家:
# 驗證緩存項是否存在
1 /// <summary> 2 /// 驗證緩存項是否存在 3 /// </summary> 4 /// <param name="key">緩存Key</param> 5 /// <returns></returns> 6 bool Exists(string key); 7 8 /// <summary> 9 /// 驗證緩存項是否存在(異步方式) 10 /// </summary> 11 /// <param name="key">緩存Key</param> 12 /// <returns></returns> 13 Task<bool> ExistsAsync(string key);
# 添加緩存
1 /// <summary> 2 /// 添加緩存 3 /// </summary> 4 /// <param name="key">緩存Key</param> 5 /// <param name="value">緩存Value</param> 6 /// <returns></returns> 7 bool Add(string key, object value); 8 9 /// <summary> 10 /// 添加緩存(異步方式) 11 /// </summary> 12 /// <param name="key">緩存Key</param> 13 /// <param name="value">緩存Value</param> 14 /// <returns></returns> 15 Task<bool> AddAsync(string key, object value); 16 17 /// <summary> 18 /// 添加緩存 19 /// </summary> 20 /// <param name="key">緩存Key</param> 21 /// <param name="value">緩存Value</param> 22 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 23 /// <param name="expiressAbsoulte">絕對過期時長</param> 24 /// <returns></returns> 25 bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte); 26 27 /// <summary> 28 /// 添加緩存(異步方式) 29 /// </summary> 30 /// <param name="key">緩存Key</param> 31 /// <param name="value">緩存Value</param> 32 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 33 /// <param name="expiressAbsoulte">絕對過期時長</param> 34 /// <returns></returns> 35 Task<bool> AddAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte); 36 37 /// <summary> 38 /// 添加緩存 39 /// </summary> 40 /// <param name="key">緩存Key</param> 41 /// <param name="value">緩存Value</param> 42 /// <param name="expiresIn">緩存時長</param> 43 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 44 /// <returns></returns> 45 bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false); 46 47 /// <summary> 48 /// 添加緩存(異步方式) 49 /// </summary> 50 /// <param name="key">緩存Key</param> 51 /// <param name="value">緩存Value</param> 52 /// <param name="expiresIn">緩存時長</param> 53 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 54 /// <returns></returns> 55 Task<bool> AddAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false);
# 刪除緩存
1 /// <summary> 2 /// 刪除緩存 3 /// </summary> 4 /// <param name="key">緩存Key</param> 5 /// <returns></returns> 6 bool Remove(string key); 7 8 /// <summary> 9 /// 刪除緩存(異步方式) 10 /// </summary> 11 /// <param name="key">緩存Key</param> 12 /// <returns></returns> 13 Task<bool> RemoveAsync(string key); 14 15 /// <summary> 16 /// 批量刪除緩存 17 /// </summary> 18 /// <param name="key">緩存Key集合</param> 19 /// <returns></returns> 20 void RemoveAll(IEnumerable<string> keys); 21 22 /// <summary> 23 /// 批量刪除緩存(異步方式) 24 /// </summary> 25 /// <param name="key">緩存Key集合</param> 26 /// <returns></returns> 27 Task RemoveAllAsync(IEnumerable<string> keys);
# 獲取緩存
1 /// <summary> 2 /// 獲取緩存 3 /// </summary> 4 /// <param name="key">緩存Key</param> 5 /// <returns></returns> 6 T Get<T>(string key) where T : class; 7 8 /// <summary> 9 /// 獲取緩存(異步方式) 10 /// </summary> 11 /// <param name="key">緩存Key</param> 12 /// <returns></returns> 13 Task<T> GetAsync<T>(string key) where T : class; 14 15 /// <summary> 16 /// 獲取緩存 17 /// </summary> 18 /// <param name="key">緩存Key</param> 19 /// <returns></returns> 20 object Get(string key); 21 22 /// <summary> 23 /// 獲取緩存(異步方式) 24 /// </summary> 25 /// <param name="key">緩存Key</param> 26 /// <returns></returns> 27 Task<object> GetAsync(string key); 28 29 /// <summary> 30 /// 獲取緩存集合 31 /// </summary> 32 /// <param name="keys">緩存Key集合</param> 33 /// <returns></returns> 34 IDictionary<string, object> GetAll(IEnumerable<string> keys); 35 36 /// <summary> 37 /// 獲取緩存集合(異步方式) 38 /// </summary> 39 /// <param name="keys">緩存Key集合</param> 40 /// <returns></returns> 41 Task<IDictionary<string, object>> GetAllAsync(IEnumerable<string> keys);
# 修改緩存
1 /// <summary> 2 /// 修改緩存 3 /// </summary> 4 /// <param name="key">緩存Key</param> 5 /// <param name="value">新的緩存Value</param> 6 /// <returns></returns> 7 bool Replace(string key, object value); 8 9 /// <summary> 10 /// 修改緩存(異步方式) 11 /// </summary> 12 /// <param name="key">緩存Key</param> 13 /// <param name="value">新的緩存Value</param> 14 /// <returns></returns> 15 Task<bool> ReplaceAsync(string key, object value); 16 17 /// <summary> 18 /// 修改緩存 19 /// </summary> 20 /// <param name="key">緩存Key</param> 21 /// <param name="value">新的緩存Value</param> 22 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 23 /// <param name="expiressAbsoulte">絕對過期時長</param> 24 /// <returns></returns> 25 bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte); 26 27 /// <summary> 28 /// 修改緩存(異步方式) 29 /// </summary> 30 /// <param name="key">緩存Key</param> 31 /// <param name="value">新的緩存Value</param> 32 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 33 /// <param name="expiressAbsoulte">絕對過期時長</param> 34 /// <returns></returns> 35 Task<bool> ReplaceAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte); 36 37 /// <summary> 38 /// 修改緩存 39 /// </summary> 40 /// <param name="key">緩存Key</param> 41 /// <param name="value">新的緩存Value</param> 42 /// <param name="expiresIn">緩存時長</param> 43 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 44 /// <returns></returns> 45 bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false); 46 47 /// <summary> 48 /// 修改緩存(異步方式) 49 /// </summary> 50 /// <param name="key">緩存Key</param> 51 /// <param name="value">新的緩存Value</param> 52 /// <param name="expiresIn">緩存時長</param> 53 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> 54 /// <returns></returns> 55 Task<bool> ReplaceAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false);
緩存實現類 MemoryCache
MemoryCache 這個比較簡單,有微軟比較完善的文檔和一些比較好的文章,這個大家都用好久了。
我們新建一個緩存實現類 MemoryCacheService 實現接口 ICacheService
public class MemoryCacheService :ICacheService { }
通過構造器注入 IMemoryCache:
protected IMemoryCache _cache;
public MemoryCacheService(IMemoryCache cache)
{
_cache = cache;
}
實現接口的方法,我們的方法都帶有 異步 和 同步 兩種,我們節約篇章和時間,異步的就不大家寫了,大家自己添加一下就好。
# 驗證緩存項是否存在
在MemoryCache中,我們是通過 TryGetValue 來檢測 Key是否存在的
1 /// <summary>
2 /// 驗證緩存項是否存在
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <returns></returns>
6 public bool Exists(string key)
7 {
8 if (key == null)
9 {
10 throw new ArgumentNullException(nameof(key));
11 }
12 object cached;
13 return _cache.TryGetValue(key,out cached);
14 }
# 添加緩存
三個添加方法 :
1 /// <summary>
2 /// 添加緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <param name="value">緩存Value</param>
6 /// <returns></returns>
7 public bool Add(string key, object value)
8 {
9 if (key == null)
10 {
11 throw new ArgumentNullException(nameof(key));
12 }
13 if (value == null)
14 {
15 throw new ArgumentNullException(nameof(value));
16 }
17 _cache.Set(key, value);
18 return Exists(key);
19 }
20 /// <summary>
21 /// 添加緩存
22 /// </summary>
23 /// <param name="key">緩存Key</param>
24 /// <param name="value">緩存Value</param>
25 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param>
26 /// <param name="expiressAbsoulte">絕對過期時長</param>
27 /// <returns></returns>
28 public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
29 {
30 if (key == null)
31 {
32 throw new ArgumentNullException(nameof(key));
33 }
34 if (value == null)
35 {
36 throw new ArgumentNullException(nameof(value));
37 }
38 _cache.Set(key, value,
39 new MemoryCacheEntryOptions()
40 .SetSlidingExpiration(expiresSliding)
41 .SetAbsoluteExpiration(expiressAbsoulte)
42 );
43
44 return Exists(key);
45 }
46 /// <summary>
47 /// 添加緩存
48 /// </summary>
49 /// <param name="key">緩存Key</param>
50 /// <param name="value">緩存Value</param>
51 /// <param name="expiresIn">緩存時長</param>
52 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param>
53 /// <returns></returns>
54 public bool Add(string key, object value, TimeSpan expiresIn,bool isSliding = false)
55 {
56 if (key == null)
57 {
58 throw new ArgumentNullException(nameof(key));
59 }
60 if (value == null)
61 {
62 throw new ArgumentNullException(nameof(value));
63 }
64 if (isSliding)
65 _cache.Set(key, value,
66 new MemoryCacheEntryOptions()
67 .SetSlidingExpiration(expiresIn)
68 );
69 else
70 _cache.Set(key, value,
71 new MemoryCacheEntryOptions()
72 .SetAbsoluteExpiration(expiresIn)
73 );
74
75 return Exists(key);
76 }
# 刪除緩存
單個刪除 和 批量刪除
1 /// <summary>
2 /// 刪除緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <returns></returns>
6 public bool Remove(string key)
7 {
8 if (key == null)
9 {
10 throw new ArgumentNullException(nameof(key));
11 }
12 _cache.Remove(key);
13
14 return !Exists(key);
15 }
16 /// <summary>
17 /// 批量刪除緩存
18 /// </summary>
19 /// <param name="key">緩存Key集合</param>
20 /// <returns></returns>
21 public void RemoveAll(IEnumerable<string> keys)
22 {
23 if (keys == null)
24 {
25 throw new ArgumentNullException(nameof(keys));
26 }
27
28 keys.ToList().ForEach(item => _cache.Remove(item));
29 }
# 獲取緩存
1 /// <summary>
2 /// 獲取緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <returns></returns>
6 public T Get<T>(string key) where T : class
7 {
8 if (key == null)
9 {
10 throw new ArgumentNullException(nameof(key));
11 }
12 return _cache.Get(key) as T;
13 }
14 /// <summary>
15 /// 獲取緩存
16 /// </summary>
17 /// <param name="key">緩存Key</param>
18 /// <returns></returns>
19 public object Get(string key)
20 {
21 if (key == null)
22 {
23 throw new ArgumentNullException(nameof(key));
24 }
25 return _cache.Get(key);
26 }
27 /// <summary>
28 /// 獲取緩存集合
29 /// </summary>
30 /// <param name="keys">緩存Key集合</param>
31 /// <returns></returns>
32 public IDictionary<string, object> GetAll(IEnumerable<string> keys)
33 {
34 if (keys == null)
35 {
36 throw new ArgumentNullException(nameof(keys));
37 }
38
39 var dict = new Dictionary<string, object>();
40
41 keys.ToList().ForEach(item => dict.Add(item, _cache.Get(item)));
42
43 return dict;
44 }
# 修改緩存
1 /// <summary>
2 /// 修改緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <param name="value">新的緩存Value</param>
6 /// <returns></returns>
7 public bool Replace(string key, object value)
8 {
9 if (key == null)
10 {
11 throw new ArgumentNullException(nameof(key));
12 }
13 if (value == null)
14 {
15 throw new ArgumentNullException(nameof(value));
16 }
17 if (Exists(key))
18 if (!Remove(key)) return false;
19
20 return Add(key, value);
21
22 }
23 /// <summary>
24 /// 修改緩存
25 /// </summary>
26 /// <param name="key">緩存Key</param>
27 /// <param name="value">新的緩存Value</param>
28 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param>
29 /// <param name="expiressAbsoulte">絕對過期時長</param>
30 /// <returns></returns>
31 public bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
32 {
33 if (key == null)
34 {
35 throw new ArgumentNullException(nameof(key));
36 }
37 if (value == null)
38 {
39 throw new ArgumentNullException(nameof(value));
40 }
41 if (Exists(key))
42 if (!Remove(key)) return false;
43
44 return Add(key, value, expiresSliding, expiressAbsoulte);
45 }
46 /// <summary>
47 /// 修改緩存
48 /// </summary>
49 /// <param name="key">緩存Key</param>
50 /// <param name="value">新的緩存Value</param>
51 /// <param name="expiresIn">緩存時長</param>
52 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param>
53 /// <returns></returns>
54 public bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false)
55 {
56 if (key == null)
57 {
58 throw new ArgumentNullException(nameof(key));
59 }
60 if (value == null)
61 {
62 throw new ArgumentNullException(nameof(value));
63 }
64 if (Exists(key))
65 if (!Remove(key)) return false;
66
67 return Add(key, value, expiresIn, isSliding);
68 }
最后 釋放:
public void Dispose()
{
if (_cache != null)
_cache.Dispose();
GC.SuppressFinalize(this);
}
緩存實現類 Redis
Redis一般都是運行的Liunx的,我們在 【(第十章)】發布項目到 Linux 上運行 Core 項目 中介紹了,如何在Linux上開發運行Core項目,當然,我相信,很多朋友還是在 Windows 上做開發、測試的,這里給大家一個windows 上的Redis和管理軟件,如果沒有或者不知道怎么找的朋友可以下載下來,在windows上測試 Redis :連接可能失效 百度網盤 提取碼:uglb 百度網盤 提取碼:gl0e
安裝第一個后,啟動Redis服務就行了,管理軟件的界面也很簡潔


我們先來看我們的 RedisCacheService:
為了統一管理和切換使用,我們的 RedisCacheService 同樣實現接口 ICacheService
public class RedisCacheService : ICacheService { }
同樣,我們通過構造器注入:
protected IDatabase _cache;
private ConnectionMultiplexer _connection;
private readonly string _instance;
public RedisCacheService(RedisCacheOptions options, int database = 0)
{
_connection = ConnectionMultiplexer.Connect(options.Configuration);
_cache = _connection.GetDatabase(database);
_instance = options.InstanceName;
}
說明一下:我們需要添加一個Redis包:Microsoft.Extensions.Caching.Redis,這是官方的,但是不知道是我程序的原因還是什么原因,總是還原失敗,命令強行還原包也不行,所以 我用的是移植的包: Microsoft.Extensions.Caching.Redis.Core,如果你們可以,最好還是用官方的包。
這里我們寫了個方法,來組合Key值和實例名,就是Key值轉為 實例名+Key
public string GetKeyForRedis(string key)
{
return _instance + key;
}
# 驗證緩存項是否存在
1 /// <summary>
2 /// 驗證緩存項是否存在
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <returns></returns>
6 public bool Exists(string key)
7 {
8 if (key == null)
9 {
10 throw new ArgumentNullException(nameof(key));
11 }
12 return _cache.KeyExists(GetKeyForRedis(key));
13 }
# 添加緩存
注意:我翻閱了很多資料,沒有找到Redis支持滑動和絕對過期,但是都是繼承的統一接口,所以這里添加方法 滑動過期時沒有用的。
1 /// <summary>
2 /// 添加緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <param name="value">緩存Value</param>
6 /// <returns></returns>
7 public bool Add(string key, object value)
8 {
9 if (key == null)
10 {
11 throw new ArgumentNullException(nameof(key));
12 }
13 return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)));
14 }
15 /// <summary>
16 /// 添加緩存
17 /// </summary>
18 /// <param name="key">緩存Key</param>
19 /// <param name="value">緩存Value</param>
20 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間,Redis中無效)</param>
21 /// <param name="expiressAbsoulte">絕對過期時長</param>
22 /// <returns></returns>
23 public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
24 {
25 if (key == null)
26 {
27 throw new ArgumentNullException(nameof(key));
28 }
29 return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)),expiressAbsoulte);
30 }
31 /// <summary>
32 /// 添加緩存
33 /// </summary>
34 /// <param name="key">緩存Key</param>
35 /// <param name="value">緩存Value</param>
36 /// <param name="expiresIn">緩存時長</param>
37 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間,Redis中無效)</param>
38 /// <returns></returns>
39 public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false)
40 {
41 if (key == null)
42 {
43 throw new ArgumentNullException(nameof(key));
44 }
45
46
47 return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), expiresIn);
48 }
# 刪除緩存
1 /// <summary>
2 /// 刪除緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <returns></returns>
6 public bool Remove(string key)
7 {
8 if (key == null)
9 {
10 throw new ArgumentNullException(nameof(key));
11 }
12 return _cache.KeyDelete(GetKeyForRedis(key));
13 }
14 /// <summary>
15 /// 批量刪除緩存
16 /// </summary>
17 /// <param name="key">緩存Key集合</param>
18 /// <returns></returns>
19 public void RemoveAll(IEnumerable<string> keys)
20 {
21 if (keys == null)
22 {
23 throw new ArgumentNullException(nameof(keys));
24 }
25
26 keys.ToList().ForEach(item => Remove(GetKeyForRedis(item)));
27 }
# 獲取緩存
1 /// <summary>
2 /// 獲取緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <returns></returns>
6 public T Get<T>(string key) where T : class
7 {
8 if (key == null)
9 {
10 throw new ArgumentNullException(nameof(key));
11 }
12
13 var value = _cache.StringGet(GetKeyForRedis(key));
14
15 if (!value.HasValue)
16 {
17 return default(T);
18 }
19
20 return JsonConvert.DeserializeObject<T>(value);
21 }
22 /// <summary>
23 /// 獲取緩存
24 /// </summary>
25 /// <param name="key">緩存Key</param>
26 /// <returns></returns>
27 public object Get(string key)
28 {
29 if (key == null)
30 {
31 throw new ArgumentNullException(nameof(key));
32 }
33
34 var value = _cache.StringGet(GetKeyForRedis(key));
35
36 if(!value.HasValue)
37 {
38 return null;
39 }
40 /// <summary>
41 /// 獲取緩存集合
42 /// </summary>
43 /// <param name="keys">緩存Key集合</param>
44 /// <returns></returns>
45 public IDictionary<string, object> GetAll(IEnumerable<string> keys)
46 {
47 if (keys == null)
48 {
49 throw new ArgumentNullException(nameof(keys));
50 }
51 var dict = new Dictionary<string, object>();
52
53 keys.ToList().ForEach(item => dict.Add(item, Get(GetKeyForRedis(item))));
54
55 return dict;
56 }
57
58 return JsonConvert.DeserializeObject(value);
59 }
# 修改緩存
1 /// <summary>
2 /// 修改緩存
3 /// </summary>
4 /// <param name="key">緩存Key</param>
5 /// <param name="value">新的緩存Value</param>
6 /// <returns></returns>
7 public bool Replace(string key, object value)
8 {
9 if (key == null)
10 {
11 throw new ArgumentNullException(nameof(key));
12 }
13
14 if(Exists(key))
15 if (!Remove(key))
16 return false;
17
18 return Add(key, value);
19
20 }
21 /// <summary>
22 /// 修改緩存
23 /// </summary>
24 /// <param name="key">緩存Key</param>
25 /// <param name="value">新的緩存Value</param>
26 /// <param name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param>
27 /// <param name="expiressAbsoulte">絕對過期時長</param>
28 /// <returns></returns>
29 public bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
30 {
31 if (key == null)
32 {
33 throw new ArgumentNullException(nameof(key));
34 }
35
36 if (Exists(key))
37 if (!Remove(key))
38 return false;
39
40 return Add(key, value, expiresSliding, expiressAbsoulte);
41 }
42 /// <summary>
43 /// 修改緩存
44 /// </summary>
45 /// <param name="key">緩存Key</param>
46 /// <param name="value">新的緩存Value</param>
47 /// <param name="expiresIn">緩存時長</param>
48 /// <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param>
49 /// <returns></returns>
50 public bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false)
51 {
52 if (key == null)
53 {
54 throw new ArgumentNullException(nameof(key));
55 }
56
57 if (Exists(key))
58 if (!Remove(key)) return false;
59
60 return Add(key, value, expiresIn, isSliding);
61 }
同樣,釋放:
public void Dispose()
{
if (_connection != null)
_connection.Dispose();
GC.SuppressFinalize(this);
}
Startup.cs 和 緩存配置
我們在 【(第八章)】讀取配置文件(二) 讀取自定義配置文件 中講到了如何讀取自定義配置文件,同樣,我們把緩存的配置 也放在 我們的自定義配置文件siteconfig.json中:

我們寫一個類,來獲取配置幾個配置:
CacheProvider: _isUseRedis --- 是否使用Redis
_connectionString --- Redis連接
_instanceName ---Redis實例名稱
在 Startup.cs 的 ConfigureServices(IServiceCollection services) 中:
首先添加:services.AddMemoryCache();
判斷是否使用Redis,如果不使用 Redis就默認使用 MemoryCache:
if (_cacheProvider._isUseRedis)
{
//Use Redis
services.AddSingleton(typeof(ICacheService), new RedisCacheService(new RedisCacheOptions
{
Configuration = _cacheProvider._connectionString,
InstanceName = _cacheProvider._instanceName
},0));
}
else
{
//Use MemoryCache
services.AddSingleton<IMemoryCache>(factory =>
{
var cache = new MemoryCache(new MemoryCacheOptions());
return cache;
});
services.AddSingleton<ICacheService, MemoryCacheService>();
}

OK,完成了,因為也是研究Core不到一個月,所以這里面肯定會有些地方寫的不好,希望大家指出來,如果有更高的方案或者方法,也麻煩告知一聲,在此表示感謝!
希望跟大家一起學習Asp.net Core

