一、前言

            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);
            

          ?

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                豆花视频一区二区在线播放 | 97精品一区二区三区 | 五月丁香久久综合 | 亚洲无码天堂视频 | 日韩一区二区三区在线观看 |