前言

.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(超时空版本)。

开源地址:https://github.com/2881099/FreeRedis

FreeRedis 以最宽松的开源协定 MIT 开源,从第一个版本 v0.0.1 公布至今已有 22个月,工夫验证了其可靠性,是时候正式公布 v1.0 版本公开给大家,大家做 .neter 不容易,多一个抉择多一条路。

因为之前异步办法的优化始终未凋谢,v1.0 正式凋谢异步办法

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、RedisJSON 以及布隆过滤器等。
参数默认值阐明
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/kelly...


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 (许可证)

MIT


⛳ 结束语

如果你遇到了 StackExchange.Redis Timeout 问题,无妨试试 FreeRedis,它笨重、弱小、听话。

如果你还在应用 ServiceStack.Redis 破解版,无妨试试收费的 FreeRedis,它收费、开源、灵巧。

开源地址:https://github.com/2881099/FreeRedis


作者是什么人?

作者是一个入行 18年的老批,他目前写的.net 开源我的项目有:

开源我的项目形容开源地址开源协定
FreeIM聊天零碎架构https://github.com/2881099/Fr...MIT
FreeRedisRedis SDKhttps://github.com/2881099/Fr...MIT
csredishttps://github.com/2881099/cs...MIT
FightLandlord斗DI主网络版https://github.com/2881099/Fi...学习用处
FreeScheduler定时工作https://github.com/2881099/Fr...MIT
IdleBus闲暇容器https://github.com/2881099/Id...MIT
FreeSqlORMhttps://github.com/dotnetcore...MIT
FreeSql.Cloud分布式tcc/sagahttps://github.com/2881099/Fr...MIT
FreeSql.AdminLTE低代码后盾生成https://github.com/2881099/Fr...MIT
FreeSql.DynamicProxy动静代理https://github.com/2881099/Fr...学习用处

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