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


    🌳 开源理念

    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,非常的轻量级,并且其功能非常强大:


    🦄 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群:561616019(在线)、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 以及布隆过滤器等。

    参数 默认值 说明
    protocol RESP2 若使用 RESP3 协议,你需要 Redis 6.0 环境
    user Redis 服务端用户名,要求 Redis 6.0 环境
    password 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 连接名,使用 CLIENT LIST 命令查看
    prefix 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}");
    

    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/FreeIM MIT
    FreeRedis Redis SDK https://github.com/2881099/FreeRedis MIT
    csredis https://github.com/2881099/csredis MIT
    FightLandlord 斗DI主网络版 https://github.com/2881099/FightLandlord 学习用途
    FreeScheduler 定时任务 https://github.com/2881099/FreeScheduler 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/FreeSql.DynamicProxy 学习用途

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

  • 相关阅读:
    Spring常见问题解决 - 自定义ApplicationEnvironmentPreparedEvent监听器失效了?
    JavaScript基础(14)_in、hasOwnProperty、instanceof的用法、垃圾回收
    DXF读写:标注样式组码中文说明
    机器视觉工程师注意高新待遇来了,非标设备厂家早就布局海外市场,国内大多数企业是谋生存情况下,而更具有大局观的企业走出去则是谋发展
    OpenGL(十七)——Qt OpenGL在三维空间移动位图(会动的星星)
    牛客多校2 - Link with Bracket Sequence I(括号序列,三维DP)
    Mock.js使用
    golang中的错误处理
    【2022年11月19日提高A组】消圈策略【DP】
    宜家IKEA EDI IFTMBF运输预定请求详解
  • 原文地址:https://www.cnblogs.com/FreeSql/p/16667741.html