关于redis:NET-Redis-Client-又多了一个选择还在被-StackExchangeRedis-Timeout-问题困扰吗

11次阅读

共计 4980 个字符,预计需要花费 13 分钟才能阅读完成。

💻 前言

.NET 下 RedisClient SDK 抉择挺多,国人罕用收费的有 StackExchange.Redis/CSRedis/Newlife.Redis,免费的有 ServiceStack.Redis。

小弟从接手 CSRedis 代码 2016 年至今保护了 6 年,起因是初入 .NETCore 坑可选择性少,应用的 StackExchange.Redis 产生 Timeout 问题无奈解决,我的项目首急上线于是应用了 CSRedis,因为作者进行保护一些扩大或性能得不到解决,所以起初间接引入源码到我的项目内改良,减少了 RedisHelper、连接池、集群、以及高版本 Redis-server 的一些命令,最初因为改变太多与原作者开源线路失落,且首次接触不懂开源协定,间接创立了 CSRedisCore 仓储进行了社区开源保护,对此行为给原作者致歉,并且在 CSRedisCore 首页表明致谢话语。

越往后面,小弟发现 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,十分的轻量级,并且其性能十分弱小:


<h1> 🦄 FreeRedis </h1>

基于 .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/kelly…


📡 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/Fr… 最宽松的 MIT 协定,可商用
csredis https://github.com/2881099/cs… 最宽松的 MIT 协定,可商用
FightLandlord 斗地主单机或网络版 https://github.com/2881099/Fi… 最宽松的 MIT 协定,学习用处
IdleScheduler 定时工作 https://github.com/2881099/Id… 最宽松的 MIT 协定,可商用
IdleBus 闲暇容器 https://github.com/2881099/Id… 最宽松的 MIT 协定,可商用
FreeSql 国产最好用的 ORM https://github.com/dotnetcore… 最宽松的 MIT 协定,可商用
FreeSql.Cloud 分布式事务 tcc/saga https://github.com/2881099/Fr… 最宽松的 MIT 协定,可商用
FreeSql.AdminLTE 低代码后盾治理我的项目生成 https://github.com/2881099/Fr… 最宽松的 MIT 协定,可商用
FreeSql.DynamicProxy 动静代理 https://github.com/2881099/Fi… 最宽松的 MIT 协定,学习用处

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

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

正文完
 0