一、前言
Redis的介紹網(wǎng)上很多不再贅述。本次環(huán)境為net core 2.2,使用的StackExchange.Redis來(lái)操作Redis。
二、引用Microsoft.Extensions.Caching.StackExchangeRedis
通過nuget搜索Microsoft.Extensions.Caching.StackExchangeRedis安裝,因?yàn)橐蕾図?xiàng)版本的問題我這里用的版本是2.2.5,其本質(zhì)上也是封裝的StackExchange.Redis,但是它實(shí)現(xiàn)了net
core規(guī)定的IDistributedCache接口。
三、添加redis服務(wù)
在Startup.cs中的ConfigureServices中添加Redis的服務(wù),會(huì)自動(dòng)進(jìn)行依賴注入。最簡(jiǎn)單的如下:
public void ConfigureServices(IServiceCollection services) {//...... //
添加redis連接 services.AddStackExchangeRedisCache(options => { options.Configuration
="127.0.0.1:6379"; options.InstanceName = "SampleInstance"; }); //...... }
InstaceName:實(shí)例名,加在redis的key前面的。
Configuration:連接redis的鏈接。
還存在一個(gè)優(yōu)先級(jí)更高的ConfigurationOptions,可以配置多個(gè)redis服務(wù)的連接、密碼等。
public void ConfigureServices(IServiceCollection services) {//..... //添加redis連接
services.AddStackExchangeRedisCache(options => { options.ConfigurationOptions =
new ConfigurationOptions() { EndPoints = { { "127.0.0.1", 6379 } }, //Password
= "123456" }; }); //...... }
具體的屬性如下:
配置選項(xiàng)默認(rèn)含義
AbortOnConnectFail true(false在Azure上) 如果為true,Connect則在沒有服務(wù)器可用時(shí)將不會(huì)創(chuàng)建連接
AllowAdmin false 啟用一系列被認(rèn)為具有風(fēng)險(xiǎn)的命令
ChannelPrefix null 所有發(fā)布/訂閱操作的可選通道前綴
ConnectRetry 3 初始期間重復(fù)嘗試連接的次數(shù)?Connect
ConnectTimeout 5000 連接操作超時(shí)(毫秒)
ConfigurationChannel __Booksleeve_MasterChanged 用于傳達(dá)配置更改的廣播頻道名稱
ConfigCheckSeconds 60 檢查配置的時(shí)間(秒)。如果支持,它可以充當(dāng)交互式套接字的保持活動(dòng)狀態(tài)。
DefaultDatabase null 默認(rèn)數(shù)據(jù)庫(kù)索引,從0到databases - 1
KeepAlive -1 發(fā)送消息以幫助套接字保持活動(dòng)的時(shí)間(秒)(默認(rèn)為60秒)
ClientName null 標(biāo)識(shí)Redis中的連接
Password null Redis服務(wù)器密碼
Proxy Proxy.None 使用中的代理類型(如果有);例如“ twemproxy”
ResolveDns false 指定DNS解析應(yīng)該是明確且渴望的,而不是隱式的
ResponseTimeout SyncTimeout 決定套接字是否不健康的時(shí)間(毫秒)
Ssl false 指定應(yīng)使用SSL加密
SslHost null 在服務(wù)器的證書上強(qiáng)制使用特定的SSL主機(jī)身份
SslProtocols null 使用加密連接時(shí)支持Ssl / Tls版本。使用“ |”?提供多個(gè)值。
SyncTimeout 5000 允許同步操作的時(shí)間(毫秒)
TieBreaker __Booksleeve_TieBreak 在模棱兩可的主方案中用于選擇服務(wù)器的密鑰
DefaultVersion (3.0在Azure中,否則2.0) Redis版本級(jí)別(在服務(wù)器不可用時(shí)有用)
WriteBuffer 4096 輸出緩沖區(qū)的大小
四、操作Redis
在控制器中通過構(gòu)造函數(shù)依賴注入獲取redis連接對(duì)象。
public class HomeController : Controller { private readonly
IDistributedCache cache; public HomeController(IDistributedCache _cache) {
this.cache = _cache; } }
由于是實(shí)現(xiàn)了IDistributedCache規(guī)定的接口Get、Set、Remove、Refresh等。
所以設(shè)置緩存(有則更新,無(wú)則新增)、獲取緩存、刷新緩存(不是刷新值是刷新過期時(shí)間)和刪除緩存的代碼如下。
//編輯緩存 cache.SetString(key, value); //獲取緩存 var values = cache.GetString(key);
//更新緩存過期時(shí)間 cache.RefreshAsync(key); //刪除緩存 cache.RemoveAsync(key);
如果想設(shè)置緩存過期時(shí)間則通過DistributedCacheEntryOptions,它可以設(shè)置滑動(dòng)過期時(shí)間(SlidingExpiration)、絕對(duì)過期時(shí)間(AbsoluteExpiration)和相對(duì)于現(xiàn)在的絕對(duì)過期時(shí)間(AbsoluteExpirationRelativeToNow)。
var options = new
DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(20));
cache.SetString(key, value, options);
通過redis的可視化工具Redis Desktop
Manager可以看到緩存存儲(chǔ)在一號(hào)庫(kù)為hash類型,有我們存儲(chǔ)的值、滑動(dòng)過期時(shí)間和絕對(duì)過期時(shí)間。不過獲取到的數(shù)據(jù)為string。
?
?五、使用StackExchange.Redis
上面的代碼存在一個(gè)問題,就是IDistributedCache之后對(duì)緩存的存儲(chǔ)默認(rèn)為其規(guī)定格式的hash類型,雖然我們獲取到的數(shù)據(jù)為string。這樣我們想操作list、set等其他類型就不行了,并且不能指定庫(kù)進(jìn)行存儲(chǔ)。所以為了更加靈活這時(shí)候就要直接用StackExchange.Redis。
因?yàn)橐肕icrosoft.Extensions.Caching.StackExchangeRedis的時(shí)候已經(jīng)帶上了StackExchange.Redis.dll的依賴項(xiàng),所以不用再引用了,否則在nuget中搜索StackExchange.Redis進(jìn)行引用。
1.基本使用
StackExchange.Redis 中核心對(duì)象是在 StackExchange.Redis 命名空間中的 ConnectionMultiplexer
類,這個(gè)對(duì)象隱藏了多個(gè)服務(wù)器的詳細(xì)信息。 因?yàn)?ConnectionMultiplexer
要做很多事,所以它被設(shè)計(jì)為在調(diào)用者之間可以共享和重用,不需要在執(zhí)行每一個(gè)操作的時(shí)候就創(chuàng)建一個(gè) ConnectionMultiplexer
,它完全是線程安全的。 但現(xiàn)在,讓我們來(lái)先創(chuàng)建一個(gè)ConnectionMultiplexer 類的實(shí)例保存以重用。 使用
ConnectionMultiplexer.Connect 或
ConnectionMultiplexer.ConnectAsync方法,傳遞配置字符串或ConfigurationOptions 對(duì)象(同上面提到過的)。
配置字符串可以采用逗號(hào)分隔的一系列節(jié)點(diǎn)的形式訪問多個(gè)服務(wù),所以讓我們?cè)谀J(rèn)端口(6379)上連接到本地機(jī)器上的一個(gè)實(shí)例:
private static ConnectionMultiplexer redisConnection { get; } static
RedisCache() { redisConnection= ConnectionMultiplexer.Connect("127.0.0.1:6379"
); }
ConnectionMultiplexer實(shí)現(xiàn)了IDisposable接口而且可以在不再需要的時(shí)候處理釋放掉。
2.使用Redis
訪問Redis使用上述獲取的連接對(duì)象:
IDatabase db = redisConnection.GetDatabase(0);
用GetDatabase()返回的對(duì)象成本很低,不需要特殊存儲(chǔ)??梢詡魅雛edis數(shù)據(jù)庫(kù)的號(hào)碼,使用指定數(shù)據(jù)庫(kù),上面的例子就是使用0號(hào)數(shù)據(jù)庫(kù)。
擁有了IDatabase就可以調(diào)用方法去操作redis,所有的方法都有同步和異步兩套,命名和微軟要求的一樣。
下面簡(jiǎn)單的對(duì)五種數(shù)據(jù)類型進(jìn)行基礎(chǔ)操作:
(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);
從列表底部和頂部獲取一個(gè)數(shù)據(jù)
//底部獲取一個(gè) await redisConnection.GetDatabase().ListRightPopAsync(key); //頂部獲取一個(gè)
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);
?
熱門工具 換一換