StackExchange.Redis 系列 1:基礎使用

来源:https://www.cnblogs.com/deepthought/archive/2020/01/09/12170192.html
-Advertisement-
Play Games

本系列博文已經全部完成,完整系列請訪問: "https://blog.zhuliang.ltd/tags/StackExchange Redis%E7%B3%BB%E5%88%97/" 本文轉自: "https://blog.zhuliang.ltd/2020/01/redis/StackExcha ...


本系列博文已經全部完成,完整系列請訪問:https://blog.zhuliang.ltd/tags/StackExchange-Redis%E7%B3%BB%E5%88%97/

本文轉自:https://blog.zhuliang.ltd/2020/01/redis/StackExchangeRedis-BasicUsage.html

  • 本系列博文是“偽”官方文檔翻譯,並非完全將官方文檔進行翻譯,而是我在查閱、測試原始文檔並轉換為自己東西後進行的“準”翻譯。
  • 原始文檔見此:https://stackexchange.github.io/StackExchange.Redis/
  • 本系列本博文基於 redis 5.0.6,系列中部分博文跟官方文檔有出入,有不同見解 / 說明不當的地方,還請大家不吝拍磚。

ConnectionMultiplexer 說明

命名空間位於:StackExchange.Redis.ConnectionMultiplexer

  • ConnectionMultiplexer 是 StackExchange.Redis 的核心對象,內部繼承了 IDisposable,但建議不要用 using 以便可以愉快重用,你就認為它足夠安全吧。
  • 該對象線程安全,且應該被重用,搞成單例即可,不要每次操作都創建一個。

主從庫示例:

ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");

項目中調用實例

說明:示例基於 .NET CORE 2.1,通過 IoC 進行註入,生命周期為“單例”。
如果不通過 IoC 的話建議直接使用“單例模式”。

    public class RedisClient : ICache
    {
        private readonly RedisSettings _redisSettings;
        private static IDatabaseAsync _db;

        public RedisClient(IOptions<RedisSettings> redisSettings)
        {
            _redisSettings = redisSettings.Value;
            var redis = ConnectionMultiplexer.Connect($"{_redisSettings.Address}:{_redisSettings.Port}");
            _db = redis.GetDatabase(_redisSettings.DataBase);
        }


        #region Implementation of ICache

        public async Task<bool> SetStringAsync(string key, string content)
        {
            return true;
        }

        public async Task<string> GetStringAsync(string key)
        {
            var result = await _db.StringGetAsync(key);
            return result;
        }
        #endregion
    }

其他一些建議和說明

  • StackExchange.Redis 有 3種主要使用機制:
    • 同步
    • 非同步:建議優先使用非同步方法而不是同步方法。
    • 即發即忘(Fire-And-Forget):當你不需要響應結果的時候,可以使用這種機制,被調用方法會立馬返回,但操作會在後臺進行執行。。
  • 即發即忘”機制補充:StackExchange.Redis 的方法中都有 CommandFlags 枚舉,預設值是 “None”,當你需要使用“即發即忘”機制的時候,需要在方法上顯示指定 CommandFlags.FireAndForget,需要註意:
    • 如果返回值是一個字元串類型,則將總是返回 null。
    • 如果返回值是一個 Int64 類型,則將總是返回 0。
    • 需要註意的是,如果返回值是一個 boolean,則返回的是 false(但操作是成功的,此時不要用該返回值作為你後續業務的判斷依據)。
db.StringIncrement(cacheKey, flags: CommandFlags.FireAndForget);
  • StackExchange.Redis.IDatabase 的一些方法,是根據 Redis 的數據類型來進行命名的,如 IDatabase.StringGet,這裡的 StringGet 表示的是獲取一個 String ,跟 C# 中的字元串並非表示同一個東西,可參考:關於 Redis 的數據類型

發佈/訂閱

  • 發佈/訂閱不需要指定 database

例子:
客戶端

private readonly RedisSettings _redisSettings;
private static IDatabaseAsync _db;
private static ConnectionMultiplexer _redis;

public RedisClient(IOptions<RedisSettings> redisSettings)
{
    _redisSettings = redisSettings.Value;
    _redis = ConnectionMultiplexer.Connect($"{_redisSettings.Address}:{_redisSettings.Port}");
    _db = _redis.GetDatabase(_redisSettings.DataBase);
}

public async Task Subscribe(string channel, Action<RedisChannel, RedisValue> fun)
{
    var sub = _redis.GetSubscriber();
    await sub.SubscribeAsync(channel, fun);
}

public async Task Publish(string channel, string message)
{
    var sub = _redis.GetSubscriber();
    await sub.PublishAsync(channel, message);
}

訂閱者

class Program
{
    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");
        var configuration = builder.Build();
        var subscriber = configuration["Subscriber"];
        var settings = configuration.GetSection("RedisSettings").Get<RedisSettings>();

        var redisClient = new RedisClient(settings);
        redisClient.Subscribe(settings.ChannelName, (channel, message) =>
         {
             System.Console.WriteLine($"{subscriber}:{message}");
         }).Wait();

        System.Console.WriteLine("started");
        System.Console.ReadKey();
    }
}

測試效果:

image

伺服器命令

若要使用伺服器命令,需要通過 ConnectionMultiplexer 對象獲取 Server 對象,如下:

var server = _redis.GetServer($"{_redisSettings.Address}:{_redisSettings.Port},allowAdmin=true");
server.ScriptExists("scripts here");

目前支持的方法如下

image


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們可以通過使用DataTime這個類來獲取當前的時間。通過調用類中的各種方法我們可以獲取不同的時間:如:日期(2019-01-09)、時間(16:02:12)、日期+時間(2019-01-09 16:11:10)等。 1.獲取日期和時間 DateTime.Now.ToString(); // 20 ...
  • 本筆記摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,記錄一下學習過程以備後續查用。 一、引言 接上一篇C#設計模式學習筆記:簡單工廠模式(工廠方法模式前奏篇),通過簡單工廠模式的瞭解,它的缺點就是隨著需求的變化我們要不停地修改工廠里 面的 ...
  • 在MVC的Global.asax Application_Error 中處理全局錯誤。判斷為Ajax請求時,我們返回Json對象字元串。不是Ajax請求時,轉到錯誤顯示頁面。 ...
  • 轉載於:https://www.cnblogs.com/nozer1993/p/9042085.html1.安裝 core和netFramework其實是相對獨立的,但是core的IDE是在vs2017才開始支持,而vs2017的安裝環境必須搭配.net4.6,所以: Step1:安裝.net4.6 ...
  • 在MVC中定義自己的許可權特性。在處理未通過許可權的時候,判斷當前請求是否為Ajax請求,如果是Ajax請求,返回Json {state=-1,msg="請登錄"},如過不是Ajax請求那麼就直接重定向到登錄頁面。 ...
  • 簡介 surging 經過兩年多的研發,微服務引擎已經略有雛形,也承蒙各位的厚愛, GitHub上收穫了將近2800星,fork 811,付費用戶企業也有十幾家,還有咨詢培訓, 在2020年,我們將依靠社區的力量,去完善社區版本,更會花更多的精力去維護好付費用戶,大家一起把surging 的社區建設 ...
  • gRpc 官網 鏈接 新建服務端項目 在服務端內先編寫一個 .proto 文件 greet.proto syntax = "proto3"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } message H ...
  • C# FTPHelper實現FTP伺服器文件讀寫操作,支持SSL協議(FTP伺服器為:Serv-U10.0)。 SSL測試調用代碼 任何地方如有紕漏,歡迎諸位道友指教。 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...