[開源福利] FreeRedis 歷時兩年正式發布 v1.0 [C#.NET Redis Client]


最近很多 .net QQ 群無故被封停,特別是 wpf 群幾乎全軍覆沒。依樂祝的 .net6交流群,曉晨的 .net跨平台交流群,導致很多碼友流離失所無家可歸,藉此機會使用一次召喚術,有需要的請加群:560611514【.NET C#愛好者】,822074314【DotNet開發交流群】

💻 前言

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

如果你是 CSRedis 或 ServiceStack.Redis 粉,那麼一定要不要錯過關注 FreeRedis,它們的 API 非常相似,方法名、參數與 redis.io 官方命令文檔保持一致,避免了二次轉換的理解成本。 redis 命令可是有接近300個呢~~~

提示:CSRedisCore 與 FreeRedis 是同一個作者,後者是基於 redis6.0 特性重新打造,解決了 CSRedisCore 的一些老問題,擴展性更強。


🌳 開源理念

FreeRedis 的命名來自,「自由」、「免費」,它和名字與 FreeSql 是一個理念,簡易是他們一致的追尋方向,最低可支援 .NET Framework 4.0 運行環境,支援到 Redis-server 8.0(超時空版本)。

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

FreeRedis 以最寬鬆的開源協議 MIT 開源,從第一個版本 v0.0.1 發布至今已有 22個月,時間驗證了其可靠性,是時候正式發布 v1.0 版本公開給大家,大家做 .neter 不容易,多一個選擇多一條路。

由於之前非同步方法的優化一直未開放,v1.0 正式開放非同步方法

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、RedisJSON 以及布隆過濾器等。

參數 默認值 說明
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)
});

重要功能了解詳細://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}");

lpush + blpop:

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

void ondata(string listValue) =>
    Console.WriteLine(listValue);

📃 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,它免費、開源、乖巧。

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


作者是什麼人?

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

開源項目 描述 開源地址 開源協議
FreeIM 聊天系統架構 //github.com/2881099/FreeIM MIT
FreeRedis Redis SDK //github.com/2881099/FreeRedis MIT
csredis //github.com/2881099/csredis MIT
FightLandlord 斗DI主網路版 //github.com/2881099/FightLandlord 學慣用途
FreeScheduler 定時任務 //github.com/2881099/FreeScheduler MIT
IdleBus 空閑容器 //github.com/2881099/IdleBus MIT
FreeSql ORM //github.com/dotnetcore/FreeSql MIT
FreeSql.Cloud 分散式tcc/saga //github.com/2881099/FreeSql.Cloud MIT
FreeSql.AdminLTE 低程式碼後台生成 //github.com/2881099/FreeSql.AdminLTE MIT
FreeSql.DynamicProxy 動態代理 //github.com/2881099/FreeSql.DynamicProxy 學慣用途

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