.Net Core使用分佈式緩存Redis:基礎

原文: .Net Core使用分佈式緩存Redis:基礎

1、前言

  Redis的介紹網上不少再也不贅述。本次環境爲net core 2.2,使用的StackExchange.Redis來操做Redis。html

2、引用Microsoft.Extensions.Caching.StackExchangeRedis

  經過nuget搜索Microsoft.Extensions.Caching.StackExchangeRedis安裝,由於依賴項版本的問題我這裏用的版本是2.2.5,其本質上也是封裝的StackExchange.Redis,可是它實現了net core規定的IDistributedCache接口。redis

3、添加redis服務

  在Startup.cs中的ConfigureServices中添加Redis的服務,會自動進行依賴注入。最簡單的以下:數據庫

複製代碼
public void ConfigureServices(IServiceCollection services) {//...... //添加redis鏈接
            services.AddStackExchangeRedisCache(options => { options.Configuration = "127.0.0.1:6379"; options.InstanceName = "SampleInstance"; }); //......
        }
複製代碼

  InstaceName:實例名,加在redis的key前面的。緩存

  Configuration:鏈接redis的連接。安全

  還存在一個優先級更高的ConfigurationOptions,能夠配置多個redis服務的鏈接、密碼等。服務器

複製代碼
public void ConfigureServices(IServiceCollection services) {//..... //添加redis鏈接
            services.AddStackExchangeRedisCache(options => { options.ConfigurationOptions = new ConfigurationOptions() { EndPoints = { { "127.0.0.1", 6379 } }, //Password = "123456"
 }; }); //......
        }
複製代碼

  具體的屬性以下:異步

配置選項 默認 含義
AbortOnConnectFail truefalse在Azure上) 若是爲true,Connect則在沒有服務器可用時將不會建立鏈接
AllowAdmin false 啓用一系列被認爲具備風險的命令
ChannelPrefix null 全部發布/訂閱操做的可選通道前綴
ConnectRetry 3 初始期間重複嘗試鏈接的次數 Connect
ConnectTimeout 5000 鏈接操做超時(毫秒)
ConfigurationChannel __Booksleeve_MasterChanged 用於傳達配置更改的廣播頻道名稱
ConfigCheckSeconds 60 檢查配置的時間(秒)。若是支持,它能夠充當交互式套接字的保持活動狀態。
DefaultDatabase null 默認數據庫索引,從0databases - 1
KeepAlive -1 發送消息以幫助套接字保持活動的時間(秒)(默認爲60秒)
ClientName null 標識Redis中的鏈接
Password null Redis服務器密碼
Proxy Proxy.None 使用中的代理類型(若是有);例如「 twemproxy」
ResolveDns false 指定DNS解析應該是明確且渴望的,而不是隱式的
ResponseTimeout SyncTimeout 決定套接字是否不健康的時間(毫秒)
Ssl false 指定應使用SSL加密
SslHost null 在服務器的證書上強制使用特定的SSL主機身份
SslProtocols null 使用加密鏈接時支持Ssl / Tls版本。使用「 |」 提供多個值。
SyncTimeout 5000 容許同步操做的時間(毫秒)
TieBreaker __Booksleeve_TieBreak 在模棱兩可的主方案中用於選擇服務器的密鑰
DefaultVersion 3.0在Azure中,不然2.0 Redis版本級別(在服務器不可用時有用)
WriteBuffer 4096 輸出緩衝區的大小

4、操做Redis

  在控制器中經過構造函數依賴注入獲取redis鏈接對象。分佈式

複製代碼
public class HomeController : Controller {   private readonly IDistributedCache cache;   public HomeController(IDistributedCache _cache)   {     this.cache = _cache;   } }
複製代碼

  因爲是實現了IDistributedCache規定的接口Get、Set、Remove、Refresh等。函數

  因此設置緩存(有則更新,無則新增)、獲取緩存、刷新緩存(不是刷新值是刷新過時時間)和刪除緩存的代碼以下。工具

複製代碼
//編輯緩存
cache.SetString(key, value); //獲取緩存
var values = cache.GetString(key); //更新緩存過時時間
cache.RefreshAsync(key); //刪除緩存
cache.RemoveAsync(key);
複製代碼

  若是想設置緩存過時時間則經過DistributedCacheEntryOptions,它能夠設置滑動過時時間(SlidingExpiration)、絕對過時時間(AbsoluteExpiration)和相對於如今的絕對過時時間(AbsoluteExpirationRelativeToNow)。

var options = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(20)); cache.SetString(key, value, options);

  經過redis的可視化工具Redis Desktop Manager能夠看到緩存存儲在一號庫爲hash類型,有咱們存儲的值、滑動過時時間和絕對過時時間。不過獲取到的數據爲string。

 

 5、使用StackExchange.Redis

  上面的代碼存在一個問題,就是IDistributedCache以後對緩存的存儲默認爲其規定格式的hash類型,雖然咱們獲取到的數據爲string。這樣咱們想操做list、set等其餘類型就不行了,而且不能指定庫進行存儲。因此爲了更加靈活這時候就要直接用StackExchange.Redis。

  由於引用Microsoft.Extensions.Caching.StackExchangeRedis的時候已經帶上了StackExchange.Redis.dll的依賴項,因此不用再引用了,不然在nuget中搜索StackExchange.Redis進行引用。

  1.基本使用

  StackExchange.Redis 中核心對象是在 StackExchange.Redis 命名空間中的 ConnectionMultiplexer 類,這個對象隱藏了多個服務器的詳細信息。 由於 ConnectionMultiplexer 要作不少事,因此它被設計爲在調用者之間能夠共享和重用,不須要在執行每個操做的時候就建立一個 ConnectionMultiplexer ,它徹底是線程安全的。 但如今,讓咱們來先建立一個ConnectionMultiplexer 類的實例保存以重用。 使用 ConnectionMultiplexer.Connect 或 ConnectionMultiplexer.ConnectAsync方法,傳遞配置字符串或ConfigurationOptions 對象(同上面提到過的)。 配置字符串能夠採用逗號分隔的一系列節點的形式訪問多個服務,因此讓咱們在默認端口(6379)上鍊接到本地機器上的一個實例:

private static ConnectionMultiplexer redisConnection { get; } static RedisCache() {   redisConnection = ConnectionMultiplexer.Connect("127.0.0.1:6379"); }

  ConnectionMultiplexer實現了IDisposable接口並且能夠在再也不須要的時候處理釋放掉。

  2.使用Redis

  訪問Redis使用上述獲取的鏈接對象:

IDatabase db = redisConnection.GetDatabase(0);

  用GetDatabase()返回的對象成本很低,不須要特殊存儲。能夠傳入redis數據庫的號碼,使用指定數據庫,上面的例子就是使用0號數據庫。

  擁有了IDatabase就能夠調用方法去操做redis,全部的方法都有同步和異步兩套,命名和微軟要求的同樣。

  下面簡單的對五種數據類型進行基礎操做:

  (1)String字符串

  添加

await redisConnection.GetDatabase().StringSetAsync(key, value, TimeSpan.FromSeconds(20));

  獲取

await redisConnection.GetDatabase().StringGetAsync(key);

  (2)List列表

  從列表底部和頂部插入

//底部插入
await redisConnection.GetDatabase().ListRightPushAsync(key, value); //頂部插入
await redisConnection.GetDatabase().ListLeftPushAsync(key, value);

  從列表底部和頂部獲取一個數據

//底部獲取一個
await redisConnection.GetDatabase().ListRightPopAsync(key); //頂部獲取一個
await redisConnection.GetDatabase().ListLeftPopAsync(key);

  (3)Hash哈希

  添加

await redisConnection.GetDatabase().HashSetAsync(key, primaryKey, value1); await redisConnection.GetDatabase().HashSetAsync(key, primaryKey, value2);

  獲取

await redisConnection.GetDatabase().HashGetAsync(key, primaryKey);

  (4)Set集合

  添加

await redisConnection.GetDatabase().SetAddAsync(key, value);

  獲取並集

await redisConnection.GetDatabase().SetCombine(SetOperation.Union, key1, key2);

  (5)Sorted Set有序集合

  添加

await redisConnection.GetDatabase().SortedSetAdd(key, value, sort);
相關文章
相關標籤/搜索