[開源福利] FreeRedis 歷時兩年正式發布 v1.0 [C#.NET Redis Client]
- 2022 年 9 月 19 日
- 筆記
- freeredis, client-side-cahing, .net redis, C# redis, RedisClient
最近很多 .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 (許可證)
⛳ 結束語
如果你遇到了 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 | 學慣用途 |
需要的請拿走,這些都是最近幾年的開源作品,以前更早寫的就不發了。
