前言
.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 协议
快速入门
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 以及布隆过滤器等。
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 (许可证)
https://www.cnblogs.com/FreeSql/p/LICENSE
结束语
如果你遇到了 StackExchange.Redis Timeout 问题,不妨试试 FreeRedis,它轻巧、强大、听话。
如果你还在使用 ServiceStack.Redis 破解版,不妨试试免费的 FreeRedis,它免费、开源、乖巧。
开源地址:https://github.com/2881099/FreeRedis