前言

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

参数 默认值 说明
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/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 最简单的 RediscClient https://github.com/2881099/FreeRedis 最宽松的 MIT 协议,可商用
csredis https://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 国产最好用的 ORM https://github.com/dotnetcore/FreeSql 最宽松的 MIT 协议,可商用
FreeSql.Cloud 分布式事务tcc/saga https://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(在线)

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

  1. Redis 详解 (一) StackExchange.Redis Client

    这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓存或者消息代理服务.目前有不少人在使用ServiceS ...

  2. StackExchange.Redis Client

    StackExchange.Redis Client 这期我们来看StackExchange.Redis,这是redis 的.net客户端之一.Redis是一个开源的内存数据存储,可以用来做数据库,缓 ...

  3. .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用

    环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...

  4. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager

    Redis缓存服务器是一款key/value数据库,读110000次/s,写81000次/s,因为是内存操作所以速度飞快,常见用法是存用户token.短信验证码等 官网显示Redis本身并没有Wind ...

  5. StackExchange.Redis通用封装类分享(转)

    阅读目录 ConnectionMultiplexer 封装 RedisHelper 通用操作类封 String类型的封装 List类型的封装 Hash类型的封装 SortedSet 类型的封装 key ...

  6. StackExchange.Redis通用封装类分享

    前两天朋友问我,有没有使用过StackExchange.Redis,问我要个封装类,由于之前都是使用ServiceStack.Redis,由于ServiceStack.Redis v4版本后是收费版的 ...

  7. 『性能』ServiceStack.Redis 和 StackExchange.Redis 性能比较

    背景 近来,需要用到 Redis 这类缓存技术 —— MongoDB 和 Redis 没有进行过比较. 我也懒得在这些细节上 纠结那么多 —— 按照网友给出的文章,听从网友建议,选择 Redis. R ...

  8. Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager 转发非原创

    Windows下Redis缓存服务器的使用 .NET StackExchange.Redis Redis Desktop Manager   Redis缓存服务器是一款key/value数据库,读11 ...

  9. StackExchange.Redis学习笔记(一) Redis的使用初探

    Redis Redis将其数据库完全保存在内存中,仅使用磁盘进行持久化. 与其它键值数据存储相比,Redis有一组相对丰富的数据类型. Redis可以将数据复制到任意数量的从机中 Redis的安装 官 ...

随机推荐

  1. linux 下通过fork实现后台运行进程

    1 # 通常建议使用双fork方法.在每个fork处,父级退出,子级继续 2 3 #!/usr/bin/env python 4 5 import time,platform 6 7 import o ...

  2. 从0开始基于Webpack5 搭建HTML+Less 前端工程

              基于Webpack5 搭建HTMl+Less的前端项目 新建一个文件夹(比如命名为webpack) 用编辑器打开该文件夹,并在编辑器的终端执行 npm init -y 自动创建pa ...

  3. python学习-Day38-HTTP

    目录 HTTP简介 可以充当客户端的有哪些 HTTP 工作原理 HTTP协议 HTTP协议四大特性 数据格式 请求格式: 响应格式: HTTP 请求方法 HTTP 状态码分类 响应分为五类: HTTP ...

  4. 交换机做节点的vlan划分

    基础准备 准备一台个人pc,两台物理服务器和一台三层交换机,以及网线若干. ip地址规划如下: 主机名 IP 控制节点 192.168.100.0 计算节点 192.168.200.0 个人pc 19 ...

  5. 利用expect批量修改Linux服务器密码

    一个执着于技术的公众号 背景 修改Linux系统密码,执行passwd即可更改密码.可如果有成千上百台服务器呢,通过ssh的方式逐一进行修改,对我们来说,工作量是非常大,且效率非常低下.因此采用批量修 ...

  6. 鸭的NOI ONLINE杂刷

    好耶!洛谷账号橙了! 水题 [NOI Online #2 入门组] 未了 这就是一道贪心+二分查找,思路很好想 除法有精度问题,建议不使用除法 code [NOI Online #3 提高组] 水壶 ...

  7. NLTK基础学习

    学习视频来自:Youtube 学习文档来自:简书 NLTK:自然语言工具包 目的:将段落拆分为句子.拆分词语,识别这些词语的词性,高亮主题,帮助机器了解文本关于什么.这个小节将解决意见挖掘或情感分析的 ...

  8. 有了 Promise 和 then,为什么还要使用 async?

    有了 Promise 和 then,为什么还要使用 async? 本文写于 2020 年 5 月 13 日 最近代码写着写着,我突然意识到一个问题--我们既然已经有了 Promise 和 then,为 ...

  9. python DOS 攻击,TCP压测脚本

    pip3 install string&&scapy 1 #!/usr/bin env python 2 #-*-coding:utf-8-*- 3 import socket,ran ...

  10. asp.net6 blazor 文件上传

    微软在asp.net6中给blazor新增了一个IJSStreamReference的接口. 我们今天的所有内容,都要依赖这个接口,因为它可以把流直接传到c#中,这样我们就可以做很多的骚操作了. 今天 ...