[開源精品] .NET Redis Client 又多了一個選擇,還在被 StackExchange.Redis Timeout 問題困擾嗎?

FreeSql發表於2022-07-08

? 前言

.NET 下 RedisClient SDK 選擇挺多,國人常用免費的有 StackExchange.Redis/CSRedis/Newlife.Redis,收費的有 ServiceStack.Redis。

小弟從接手 CSRedis 程式碼 2016 年至今維護了6年,原因是初入 .NETCore 坑可選擇性少,使用的 StackExchange.Redis 發生 Timeout 問題無法解決,專案首急上線於是使用了 CSRedis,由於作者停止維護一些擴充套件或功能得不到解決,所以後來直接引入原始碼到專案內改進,增加了 RedisHelper、連線池、叢集、以及高版本 Redis-server 的一些命令,最後由於改動太多與原作者開源線路丟失,且初次接觸不懂開源協議,直接建立了 CSRedisCore 倉儲進行了社群開源維護,對此行為給原作者致歉,並且在 CSRedisCore 首頁標明致謝話語。

個人認為 CSRedis API 很符合使用者習慣,因為方法名與 redis-command 保持一致,避免了二次理解成本,否則看完 redis 文件還要去找 SDK 方法用哪個就很蛋疼了。可是越往後面,小弟發現 CSRedisCore 自己一些錯誤的改動,又或者說原作者的程式碼實現理念難以支援 redis-server 高版本,又或者會造成破壞性升級,與其這樣不如重新寫一個 RedisClient,於是 FreeRedis 就這樣誕生了。


? 開源理念

FreeRedis 的命名來自,“自由”、“免費”,它和名字與 FreeSql 是一個理念,簡易是他們一致的追尋方向,最低可支援 .NET Framework 4.0 執行環境,支援到 Redis-server 7.0。

感謝 Nuget FreeRedis 原擁有者對 FreeRedis 的割愛,他的開源地址:https://gitee.com/LeanCai

如今,FreeRedis 從第一個版本釋出至今 20個月,時間驗證了其可靠性,是時候公開給大家,多一個選擇多一條路。FreeRedis 整個原始碼是零依賴,使用它只會在 bin 目錄產生一個 FreeRedis.dll,非常的輕量級,並且其功能非常強大:


? FreeRedis

基於 .NET 的 Redis 客戶端,支援 .NET Core 2.1+、.NET Framework 4.0+ 以及 Xamarin。

  • ? 所有方法名與 redis-cli 保持一致
  • ? 支援 Redis 叢集(服務端要求 3.2 及以上版本)
  • ⛳ 支援 Redis 哨兵模式
  • ? 支援主從分離(Master-Slave)
  • ? 支援釋出訂閱(Pub-Sub)
  • ? 支援 Redis Lua 指令碼
  • ? 支援管道(Pipeline)
  • ? 支援事務
  • ? 支援 GEO 命令(服務端要求 3.2 及以上版本)
  • ? 支援 STREAM 型別命令(服務端要求 5.0 及以上版本)
  • ⚡ 支援本地快取(Client-side-cahing,服務端要求 6.0 及以上版本)
  • ? 支援 Redis 6 的 RESP3 協議

QQ群:4336577(已滿)、8578575(線上)、52508226(線上)


? 快速入門

public static RedisClient cli = new RedisClient("127.0.0.1:6379,password=123,defaultDatabase=13");
//cli.Serialize = obj => JsonConvert.SerializeObject(obj);
//cli.Deserialize = (json, type) => JsonConvert.DeserializeObject(json, type);
cli.Notice += (s, e) => Console.WriteLine(e.Log); //列印命令日誌

cli.Set("key1", "value1");
cli.MSet("key1", "value1", "key2", "value2");

string value1 = cli.Get("key1");
string[] vals = cli.MGet("key1", "key2");

支援 STRING、HASH、LIST、SET、ZSET、BITMAP、HyperLogLog、GEO、Stream 以及布隆過濾器等。

引數 預設值 說明
protocol RESP2 若使用 RESP3 協議,你需要 Redis 6.0 環境
user <empty> Redis 服務端使用者名稱,要求 Redis 6.0 環境
password <empty> Redis 服務端密碼
defaultDatabase 0 Redis 服務端資料庫
max poolsize 100 連線池最大連線數
min poolsize 5 連線池最小連線數
idleTimeout 20000 連線池中元素的空閒時間(單位為毫秒 ms),適用於連線到遠端伺服器
connectTimeout 10000 連線超時,單位為毫秒(ms)
receiveTimeout 10000 接收超時,單位為毫秒(ms)
sendTimeout 10000 傳送超時,單位為毫秒(ms)
encoding utf-8 字串字符集
retry 0 協議發生錯誤時,重試執行的次數
ssl false 啟用加密傳輸
name <empty> 連線名,使用 CLIENT LIST 命令檢視
prefix <empty> key 前輟,所有方法都會附帶此前輟,cli.Set(prefix + "key", 111);

IPv6: [fe80::b164:55b3:4b4f:7ce6%15]:6379


? Master-Slave (讀寫分離)

public static RedisClient cli = new RedisClient(
    "127.0.0.1:6379,password=123,defaultDatabase=13",
    "127.0.0.1:6380,password=123,defaultDatabase=13",
    "127.0.0.1:6381,password=123,defaultDatabase=13"
    );

var value = cli.Get("key1");

寫入時連線 127.0.0.1:6379,讀取時隨機連線 6380 6381


⛳ Redis Sentinel (哨兵高可用)

public static RedisClient cli = new RedisClient(
    "mymaster,password=123", 
    new [] { "192.169.1.10:26379", "192.169.1.11:26379", "192.169.1.12:26379" },
    true //是否讀寫分離
    );

? Redis Cluster (叢集)

假如你有一個 Redis Cluster 叢集,其中有三個主節點(7001-7003)、三個從節點(7004-7006),則連線此叢集的程式碼:

public static RedisClient cli = new RedisClient(
    new ConnectionStringBuilder[] { "192.168.0.2:7001", "192.168.0.2:7002", "192.168.0.2:7003" }
    );

⚡ Client-side-cahing (本地快取)

服務端要求 6.0 及以上版本

cli.UseClientSideCaching(new ClientSideCachingOptions
{
    //本地快取的容量
    Capacity = 3,
    //過濾哪些鍵能被本地快取
    KeyFilter = key => key.StartsWith("Interceptor"),
    //檢查長期未使用的快取
    CheckExpired = (key, dt) => DateTime.Now.Subtract(dt) > TimeSpan.FromSeconds(2)
});

重要功能瞭解詳細:https://www.cnblogs.com/kellynic/p/14009158.html


? Subscribe (訂閱)

using (cli.Subscribe("abc", ondata)) //wait .Dispose()
{
    Console.ReadKey();
}

void ondata(string channel, string data) =>
    Console.WriteLine($"{channel} -> {data}");

? Scripting (指令碼)

var r1 = cli.Eval("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}", 
    new[] { "key1", "key2" }, "first", "second") as object[];

var r2 = cli.Eval("return {1,2,{3,'Hello World!'}}") as object[];

cli.Eval("return redis.call('set',KEYS[1],'bar')", 
    new[] { Guid.NewGuid().ToString() })

? Pipeline (管道)

using (var pipe = cli.StartPipe())
{
    pipe.IncrBy("key1", 10);
    pipe.Set("key2", Null);
    pipe.Get("key1");

    object[] ret = pipe.EndPipe();
    Console.WriteLine(ret[0] + ", " + ret[2]);
}

? Transaction (事務)

using (var tran = cli.Multi())
{
    tran.IncrBy("key1", 10);
    tran.Set("key2", Null);
    tran.Get("key1");

    object[] ret = tran.Exec();
    Console.WriteLine(ret[0] + ", " + ret[2]);
}

? GetDatabase (切庫)

using (var db = cli.GetDatabase(10))
{
    db.Set("key1", 10);
    var val1 = db.Get("key1");
}

? Scan (掃描)

支援叢集模式

foreach (var keys in cli.Scan("*", 10, null))
{
    Console.WriteLine(string.Join(", ", keys));
}

? License (許可證)

MIT


⛳ 結束語

如果你遇到了 StackExchange.Redis Timeout 問題,不妨試試 FreeRedis,它輕巧、強大、聽話。

如果你還在使用 ServiceStack.Redis 破解版,不妨試試免費的 FreeRedis,它免費、開源、乖巧。

開源地址:https://github.com/2881099/FreeRedis


作者是什麼人?

作者是一個入行 18年的老批,他目前寫的.net 開源專案有:

開源專案 描述 開源地址 開源協議
ImCore 架構最簡單,擴充套件性最強的聊天系統架構 https://github.com/2881099/im 最寬鬆的 MIT 協議,可商用
FreeRedis 最簡單的 RediscClient https://github.com/2881099/FreeRedis 最寬鬆的 MIT 協議,可商用
csredis https://github.com/2881099/csredis 最寬鬆的 MIT 協議,可商用
FightLandlord 鬥地主單機或網路版 https://github.com/2881099/FightLandlord 最寬鬆的 MIT 協議,學習用途
IdleScheduler 定時任務 https://github.com/2881099/IdleBus/tree/master/IdleScheduler 最寬鬆的 MIT 協議,可商用
IdleBus 空閒容器 https://github.com/2881099/IdleBus 最寬鬆的 MIT 協議,可商用
FreeSql 國產最好用的 ORM https://github.com/dotnetcore/FreeSql 最寬鬆的 MIT 協議,可商用
FreeSql.Cloud 分散式事務tcc/saga https://github.com/2881099/FreeSql.Cloud 最寬鬆的 MIT 協議,可商用
FreeSql.AdminLTE 低程式碼後臺管理專案生成 https://github.com/2881099/FreeSql.AdminLTE 最寬鬆的 MIT 協議,可商用
FreeSql.DynamicProxy 動態代理 https://github.com/2881099/FreeSql.DynamicProxy 最寬鬆的 MIT 協議,學習用途

需要的請拿走,這些都是最近幾年的開源作品,以前更早寫的就不發了。

QQ群:4336577(已滿)、8578575(線上)、52508226(線上)

相關文章