啥呢 發表於 2022-9-19 00:30:00

[开源福利] FreeRedis 历时两年正式发布 v1.0 [C#.NET Redis Client]

<h2 id="-开源理念">🌳 开源理念</h2>
<p>FreeRedis 的命名来自,“自由”、“免费”,它和名字与 FreeSql 是一个理念,简易是他们一致的追寻方向,最低可支持 .NET Framework 4.0 运行环境,支持到 Redis-server 8.0(超时空版本)。</p>
<p>开源地址:https://github.com/2881099/FreeRedis</p>
<p>FreeRedis 以<strong>最宽松的开源协议</strong> MIT 开源,从第一个版本 v0.0.1 发布至今已有 22个月,时间验证了其可靠性,是时候正式发布 v1.0 版本公开给大家,大家做 .neter 不容易,多一个选择多一条路。</p>
<blockquote>
<p>由于之前异步方法的优化一直未开放,v1.0 正式开放异步方法</p>
</blockquote>
<p>FreeRedis 整个源码是<strong>零依赖</strong>,使用它只会在 bin 目录产生一个 FreeRedis.dll,非常的轻量级,并且其功能非常强大:</p>
<hr>
<h1> 🦄 FreeRedis </h1>
<p>基于 .NET 的 Redis 客户端,支持 .NET Core 2.1+、.NET Framework 4.0+ 以及 Xamarin。</p>
<ul>
<li>🌈 所有方法名与 redis-cli 保持一致</li>
<li>🌌 支持 Redis 集群(服务端要求 3.2 及以上版本)</li>
<li>⛳ 支持 Redis 哨兵模式</li>
<li>🎣 支持主从分离(Master-Slave)</li>
<li>📡 支持发布订阅(Pub-Sub)</li>
<li>📃 支持 Redis Lua 脚本</li>
<li>💻 支持管道(Pipeline)</li>
<li>📰 支持事务、命令拦截、日志事件</li>
<li>🌴 支持 GEO 命令(服务端要求 3.2 及以上版本)</li>
<li>🌲 支持 STREAM 类型命令(服务端要求 5.0 及以上版本)</li>
<li>⚡ 支持本地缓存(Client-side-cahing,服务端要求 6.0 及以上版本)</li>
<li>🌳 支持 Redis 6 的 RESP3 协议</li>
</ul>
<p>QQ群:561616019(在线)、4336577(已满)、8578575(已满)、52508226(已满)</p>
<hr>
<h2 id="-快速入门">🚀 快速入门</h2>
<pre><code class="language-csharp">public static RedisClient cli = new RedisClient("127.0.0.1:6379,password=123,defaultDatabase=13");
cli.Serialize = obj =&gt; JsonConvert.SerializeObject(obj); //序列化,存对象
cli.Deserialize = (json, type) =&gt; JsonConvert.DeserializeObject(json, type);
cli.Notice += (s, e) =&gt; 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");
</code></pre>
<blockquote>
<p>支持 STRING、HASH、LIST、SET、ZSET、BITMAP、HyperLogLog、GEO、Stream、RedisJSON 以及布隆过滤器等。</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align: left">参数</th>
<th style="text-align: right">默认值</th>
<th style="text-align: left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left">protocol</td>
<td style="text-align: right">RESP2</td>
<td style="text-align: left">若使用 RESP3 协议,你需要 Redis 6.0 环境</td>
</tr>
<tr>
<td style="text-align: left">user</td>
<td style="text-align: right">&lt;empty&gt;</td>
<td style="text-align: left">Redis 服务端用户名,要求 Redis 6.0 环境</td>
</tr>
<tr>
<td style="text-align: left">password</td>
<td style="text-align: right">&lt;empty&gt;</td>
<td style="text-align: left">Redis 服务端密码</td>
</tr>
<tr>
<td style="text-align: left">defaultDatabase</td>
<td style="text-align: right">0</td>
<td style="text-align: left">Redis 服务端数据库</td>
</tr>
<tr>
<td style="text-align: left">max poolsize</td>
<td style="text-align: right">100</td>
<td style="text-align: left">连接池最大连接数</td>
</tr>
<tr>
<td style="text-align: left">min poolsize</td>
<td style="text-align: right">5</td>
<td style="text-align: left">连接池最小连接数</td>
</tr>
<tr>
<td style="text-align: left">idleTimeout</td>
<td style="text-align: right">20000</td>
<td style="text-align: left">连接池中元素的空闲时间(单位为毫秒 ms),适用于连接到远程服务器</td>
</tr>
<tr>
<td style="text-align: left">connectTimeout</td>
<td style="text-align: right">10000</td>
<td style="text-align: left">连接超时,单位为毫秒(ms)</td>
</tr>
<tr>
<td style="text-align: left">receiveTimeout</td>
<td style="text-align: right">10000</td>
<td style="text-align: left">接收超时,单位为毫秒(ms)</td>
</tr>
<tr>
<td style="text-align: left">sendTimeout</td>
<td style="text-align: right">10000</td>
<td style="text-align: left">发送超时,单位为毫秒(ms)</td>
</tr>
<tr>
<td style="text-align: left">encoding</td>
<td style="text-align: right">utf-8</td>
<td style="text-align: left">字符串字符集</td>
</tr>
<tr>
<td style="text-align: left">retry</td>
<td style="text-align: right">0</td>
<td style="text-align: left">协议发生错误时,重试执行的次数</td>
</tr>
<tr>
<td style="text-align: left">ssl</td>
<td style="text-align: right">false</td>
<td style="text-align: left">启用加密传输</td>
</tr>
<tr>
<td style="text-align: left">name</td>
<td style="text-align: right">&lt;empty&gt;</td>
<td style="text-align: left">连接名,使用 CLIENT LIST 命令查看</td>
</tr>
<tr>
<td style="text-align: left">prefix</td>
<td style="text-align: right">&lt;empty&gt;</td>
<td style="text-align: left"><code>key</code> 前辍,所有方法都会附带此前辍,cli.Set(prefix + "key", 111);</td>
</tr>
</tbody>
</table>
<blockquote>
<p>IPv6: :6379</p>
</blockquote>
<hr>
<h3 id="-master-slave-读写分离">🎣 Master-Slave (读写分离)</h3>
<pre><code class="language-csharp">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");
</code></pre>
<blockquote>
<p>写入时连接 127.0.0.1:6379,读取时随机连接 6380 6381</p>
</blockquote>
<hr>
<h3 id="-redis-sentinel-哨兵高可用">⛳ Redis Sentinel (哨兵高可用)</h3>
<pre><code class="language-csharp">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 //是否读写分离
    );
</code></pre>
<hr>
<h3 id="-redis-cluster-集群">🌌 Redis Cluster (集群)</h3>
<p>假如你有一个 Redis Cluster 集群,其中有三个主节点(7001-7003)、三个从节点(7004-7006),则连接此集群的代码:</p>
<pre><code class="language-csharp">public static RedisClient cli = new RedisClient(
    new ConnectionStringBuilder[] { "192.168.0.2:7001", "192.168.0.2:7002", "192.168.0.2:7003" }
    );
</code></pre>
<hr>
<h3 id="-client-side-cahing-本地缓存">⚡ Client-side-cahing (本地缓存)</h3>
<blockquote>
<p>服务端要求 6.0 及以上版本</p>
</blockquote>
<pre><code class="language-csharp">cli.UseClientSideCaching(new ClientSideCachingOptions
{
    //本地缓存的容量
    Capacity = 3,
    //过滤哪些键能被本地缓存
    KeyFilter = key =&gt; key.StartsWith("Interceptor"),
    //检查长期未使用的缓存
    CheckExpired = (key, dt) =&gt; DateTime.Now.Subtract(dt) &gt; TimeSpan.FromSeconds(2)
});
</code></pre>
<p>重要功能了解详细:https://www.cnblogs.com/kellynic/p/14009158.html</p>
<hr>
<h3 id="-subscribe-订阅">📡 Subscribe (订阅)</h3>
<pre><code class="language-csharp">using (cli.Subscribe("abc", ondata)) //wait .Dispose()
{
    Console.ReadKey();
}

void ondata(string channel, string data) =&gt;
    Console.WriteLine($"{channel} -&gt; {data}");
</code></pre>
<p>lpush + blpop:</p>
<pre><code class="language-csharp">using (cli.SubscribeList("list_key", ondata)) //wait .Dispose()
{
    Console.ReadKey();
}

void ondata(string listValue) =&gt;
    Console.WriteLine(listValue);
</code></pre>
<hr>
<h3 id="-scripting-脚本">📃 Scripting (脚本)</h3>
<pre><code class="language-csharp">var r1 = cli.Eval("return {KEYS,KEYS,ARGV,ARGV}",
    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,'bar')",
    new[] { Guid.NewGuid().ToString() })
</code></pre>
<hr>
<h3 id="-pipeline-管道">💻 Pipeline (管道)</h3>
<pre><code class="language-csharp">using (var pipe = cli.StartPipe())
{
    pipe.IncrBy("key1", 10);
    pipe.Set("key2", Null);
    pipe.Get("key1");

    object[] ret = pipe.EndPipe();
    Console.WriteLine(ret + ", " + ret);
}
</code></pre>
<hr>
<h3 id="-transaction-事务">📰 Transaction (事务)</h3>
<pre><code class="language-csharp">using (var tran = cli.Multi())
{
    tran.IncrBy("key1", 10);
    tran.Set("key2", Null);
    tran.Get("key1");

    object[] ret = tran.Exec();
    Console.WriteLine(ret + ", " + ret);
}
</code></pre>
<hr>
<h3 id="-getdatabase-切库">📯 GetDatabase (切库)</h3>
<pre><code class="language-csharp">using (var db = cli.GetDatabase(10))
{
    db.Set("key1", 10);
    var val1 = db.Get("key1");
}
</code></pre>
<hr>
<h3 id="-scan-扫描">🔍 Scan (扫描)</h3>
<blockquote>
<p>支持集群模式</p>
</blockquote>
<pre><code class="language-csharp">foreach (var keys in cli.Scan("*", 10, null))
{
    Console.WriteLine(string.Join(", ", keys));
}
</code></pre>
<hr>
<h2 id="-license-许可证">🗄 License (许可证)</h2>
<p>MIT</p>
<hr>
<h2 id="-结束语">⛳ 结束语</h2>
<p>如果你遇到了 StackExchange.Redis Timeout 问题,不妨试试 FreeRedis,它轻巧、强大、听话。</p>
<p>如果你还在使用 ServiceStack.Redis 破解版,不妨试试免费的 FreeRedis,它免费、开源、乖巧。</p>
<p>开源地址:https://github.com/2881099/FreeRedis</p>
<hr>
<p>作者是什么人?</p>
<p>作者是一个入行 18年的老批,他目前写的.net 开源项目有:</p>
<table>
<thead>
<tr>
<th>开源项目</th>
<th>描述</th>
<th>开源地址</th>
<th>开源协议</th>
</tr>
</thead>
<tbody>
<tr>
<td>FreeIM</td>
<td>聊天系统架构</td>
<td>https://github.com/2881099/FreeIM</td>
<td>MIT</td>
</tr>
<tr>
<td>FreeRedis</td>
<td>Redis SDK</td>
<td>https://github.com/2881099/FreeRedis</td>
<td>MIT</td>
</tr>
<tr>
<td>csredis</td>
<td></td>
<td>https://github.com/2881099/csredis</td>
<td>MIT</td>
</tr>
<tr>
<td>FightLandlord</td>
<td>斗DI主网络版</td>
<td>https://github.com/2881099/FightLandlord</td>
<td>学习用途</td>
</tr>
<tr>
<td>FreeScheduler</td>
<td>定时任务</td>
<td>https://github.com/2881099/FreeScheduler</td>
<td>MIT</td>
</tr>
<tr>
<td>IdleBus</td>
<td>空闲容器</td>
<td>https://github.com/2881099/IdleBus</td>
<td>MIT</td>
</tr>
<tr>
<td>FreeSql</td>
<td>ORM</td>
<td>https://github.com/dotnetcore/FreeSql</td>
<td>MIT</td>
</tr>
<tr>
<td>FreeSql.Cloud</td>
<td>分布式tcc/saga</td>
<td>https://github.com/2881099/FreeSql.Cloud</td>
<td>MIT</td>
</tr>
<tr>
<td>FreeSql.AdminLTE</td>
<td>低代码后台生成</td>
<td>https://github.com/2881099/FreeSql.AdminLTE</td>
<td>MIT</td>
</tr>
<tr>
<td>FreeSql.DynamicProxy</td>
<td>动态代理</td>
<td>https://github.com/2881099/FreeSql.DynamicProxy</td>
<td>学习用途</td>
</tr>
</tbody>
</table>
<p>需要的请拿走,这些都是最近几年的开源作品,以前更早写的就不发了。</p><br><br>
来源:https://www.cnblogs.com/FreeSql/p/16667741.html
頁: [1]
查看完整版本: [开源福利] FreeRedis 历时两年正式发布 v1.0 [C#.NET Redis Client]