[开源精品].NETRedisClient又多了一个选择,还在被StackExchange.RedisTimeout问题困扰吗?

博客 分享
0 173
优雅殿下
优雅殿下 2022-07-08 07:01:30
悬赏:0 积分 收藏

[开源精品] .NET Redis Client 又多了一个选择,还在被 StackExchange.Redis Timeout 问题困扰吗?

?? 前言

.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 以及布隆过滤器等。

参数默认值说明
protocolRESP2若使用 RESP3 协议,你需要 Redis 6.0 环境
user<empty>Redis 服务端用户名,要求 Redis 6.0 环境
password<empty>Redis 服务端密码
defaultDatabase0Redis 服务端数据库
max poolsize100连接池最大连接数
min poolsize5连接池最小连接数
idleTimeout20000连接池中元素的空闲时间(单位为毫秒 ms),适用于连接到远程服务器
connectTimeout10000连接超时,单位为毫秒(ms)
receiveTimeout10000接收超时,单位为毫秒(ms)
sendTimeout10000发送超时,单位为毫秒(ms)
encodingutf-8字符串字符集
retry0协议发生错误时,重试执行的次数
sslfalse启用加密传输
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最简单的 RediscClienthttps://github.com/2881099/FreeRedis最宽松的 MIT 协议,可商用
csredishttps://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国产最好用的 ORMhttps://github.com/dotnetcore/FreeSql最宽松的 MIT 协议,可商用
FreeSql.Cloud分布式事务tcc/sagahttps://github.com/2881099/FreeSql.Cloud最宽松的 MIT 协议,可商用
FreeSql.AdminLTE低代码后台管理项目生成https://github.com/2881099/FreeSql.AdminLTE最宽松的 MIT 协议,可商用
FreeSql.DynamicProxy动态代理https://github.com/2881099/FightLandlord最宽松的 MIT 协议,学习用途

需要的请拿走,这些都是最近几年的开源作品,以前更早写的就不发了。

QQ群:4336577(已满)、8578575(在线)、52508226(在线)

posted @ 2022-07-08 06:50 FreeSql 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员