• Stars
    star
    107
  • Rank 323,587 (Top 7 %)
  • Language
    C#
  • Created almost 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

IdleBus 空闲对象管理容器,有效组织对象重复利用,自动创建、销毁,解决【实例】过多且长时间占用的问题。

IdleBus 空闲对象管理容器,有效组织对象重复利用,自动创建、销毁,解决【实例】过多且长时间占用的问题。有时候想做一个单例对象重复使用提升性能,但是定义多了,有的又可能一直空闲着占用资源。

专门解决:又想重复利用,又想少占资源的场景。

快速开始

dotnet add package IdleBus

class Program
{
    static void Main(string[] args)
    {
        //超过20秒没有使用,就销毁【实例】
        var ib = new IdleBus(TimeSpan.FromSeconds(20));
        ib.Notice += (_, e) =>
        {
            Console.WriteLine("    " + e.Log);

            if (e.NoticeType == IdleBus<IDisposable>.NoticeType.AutoRelease)
                Console.WriteLine($"    [{DateTime.Now.ToString("g")}] {e.Key} 空闲被回收");
        };

        while (true)
        {
            Console.WriteLine("输入 > ");
            var line = Console.ReadLine().Trim();
            if (string.IsNullOrEmpty(line)) break;

            // 注册
            ib.TryRegister(line, () => new TestInfo());

            // 第一次:创建
            TestInfo item = ib.Get(line) as TestInfo;

            // 第二次:直接获取,长驻内存直到空闲销毁
            item = ib.Get(line) as TestInfo;
        }

        ib.Dispose();
    }

    class TestInfo : IDisposable
    {
        public void Dispose() { }
    }
}

输出:

输入 >
aa1
    aa1 注册成功,0/1
    aa1 实例+++创建成功,耗时 0.1658ms,1/1
    aa1 实例获取成功 1次
    aa1 实例获取成功 2次
输入 >
aa2
    aa2 注册成功,1/2
    aa2 实例+++创建成功,耗时 0.0065ms,2/2
    aa2 实例获取成功 1次
    aa2 实例获取成功 2次
输入 >
aa3
    aa3 注册成功,2/3
    aa3 实例+++创建成功,耗时 0.0073ms,3/3
    aa3 实例获取成功 1次
    aa3 实例获取成功 2次
输入 >
    aa1 ---自动释放成功,耗时 0.7607ms,2/3
    [2020/1/7 14:22] aa1 空闲被回收
    aa2 ---自动释放成功,耗时 0.0289ms,1/3
    [2020/1/7 14:22] aa2 空闲被回收
    aa3 ---自动释放成功,耗时 0.0046ms,0/3
    [2020/1/7 14:22] aa3 空闲被回收

API

new IdleBus 可使用任何 IDisposable 实现类【混合注入】

new IdleBus<T> 可【自定义类型】注入,如: new IdleBus<IFreeSql>()

Method 说明
void Ctor() 创建空闲容器
void Ctor(TimeSpan idle) 指定空闲时间,创建空闲容器
IdleBus Register(string key, Func<T> create) 注册(其类型必须实现 IDisposable)
IdleBus Register(string key, Func<T> create, TimeSpan idle) 注册,单独设置空间时间
T Get(string key) 获取【实例】(线程安全),key 未注册时,抛出异常
List<T> GetAll() 获得所有【实例】(线程安全)
bool Exists(string key) 判断 key 是否已注册
void Remove(string key) 删除已注册的
int Quantity 注册数量
int UsageQuantity 已创建【实例】数量
event Notice 容器内部的变化通知,如:自动释放、自动创建

注意:Register 参数 create 属于对象创建器,切莫直接返回外部创建好的对象

var obj = new Xxx();
ib.Register("key01", () => obj); //错了,错了,错了

ib.Register("key01", () => new Xxx()); //正确

设计思路

IdleBus 和对象池不同,对象池是队列设计,我们是 KV 设计。

IdleBus 又像缓存,又像池,又像容器,无法具体描述。

1、注册:向容器中注册对象,指定 key + 创建器 + 空闲时间,可以注册和管理任何实现 IDisposable 接口对象

2、获取对象:开发人员使用 key 作为参数调用方法获得对象

  • 存在时,直接返回
  • 不存在时,创建对象(保证线程安全)

3、过期销毁:当容器中有实例运行,会启用后台线程定时检查,超过空闲时间设置的将被释放(Dispose)

使用场景

  • 多租户按数据库区分的场景,假设有1000个租户;
  • Redis 客户端需要操作 N 个 服务器;
  • Socket 长连接闲置后自动释放;
  • 管理 1000个 rabbitmq 服务器的客户端;
  • IdleScheduler 利用 IdleBus 实现的轻量定时任务调度;
  • 等等等。。。

举例:向 1000个 (不同的、不同的、不同的) rabbitmq 服务器发送消息,正常有两种做法:

1、定义 1000 个静态 client 一直 open 着,重复利用

缺点:1000个里面不是每个都活跃,然后也一直占用着资源

2、每次发送消息的时候 open,使用完再 close

new client("mq_0001server").pub(...).close();
new client("mq_0002server").pub(...).close();
new client("mq_0003server").pub(...).close();
new client("mq_0004server").pub(...).close();

缺点:性能损耗会比较大,socket 没有有效的重复利用

More Repositories

1

csredis

.NET Core or .NET Framework 4.0+ client for Redis and Redis Sentinel (2.8) and Cluster. Includes both synchronous and asynchronous clients.
C#
1,907
star
2

FreeIM

.NETCore websocket 实现简易、高性能、集群即时通讯组件,支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能.
C#
1,223
star
3

FreeRedis

🦄 FreeRedis is .NET40+ redis client. supports cluster, sentinel, master-slave, pub-sub, lua, pipeline, transaction, streams, client-side-caching, and pooling.
C#
920
star
4

dotnetGen_mysql

.NETCore + Mysql 生成器
C#
242
star
5

FreeSql.Tools

FreeSql 工具包,包括生成器等
C#
212
star
6

FreeSql.AdminLTE

这是一个 .NETCore MVC 中间件,基于 AdminLTE 前端框架动态产生 FreeSql 实体的增删查改界面。
C#
166
star
7

FreeScheduler

轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化),可按秒,每天/每周/每月固定时间,自定义间隔执行,支持 .NET Core 2.1+、.NET Framework 4.0+ 运行环境。
C#
164
star
8

dotnetGen_sqlserver

.NETCore + SqlServer 生成器
C#
149
star
9

SafeObjectPool

应用场景:连接池,资源池等等
C#
112
star
10

dotnetGen_postgresql

.NETCore + PostgreSQL 生成器
C#
94
star
11

NPinyin

拼音汉字转换 .NETCore 版本
C#
80
star
12

FreeSql.Cloud

提供跨数据库访问,分布式事务TCC、SAGA解决方案。
C#
65
star
13

Microsoft.Extensions.Caching.CSRedis

分布式缓存,替代 Microsoft.Extensions.Caching.Redis
C#
44
star
14

FreeSql.DbContext

FreeSql 扩展包,实现真正的 ORM,Repository DbContext UnitOfWork 实现。
C#
41
star
15

FreeSql.DynamicProxy

The dynamic proxy on The .NetCore or .NetFramework4.0+. Support asynchronous method interception, Method parameter interception, Property interception, multiple intercepts, dependency injection and inversion of control
C#
38
star
16

TcpClientHttpRequest

基于 TcpClient 现实的 http请求库,编写于2007年做了几年数据采集工作。
C#
34
star
17

NJob

超级轻便的调度器
C#
30
star
18

FreeSql.Wiki.VuePress

FreeSql wiki 文档采用 vuepress
Dockerfile
30
star
19

MySocket

Socket服务端与客户端的封装(IOCP、EPOLL),支持.NETCore
C#
28
star
20

WorkQueue

超级轻便的线程队列工作器
C#
25
star
21

ojbk

模块化的单体应用项目
JavaScript
21
star
22

dotnetGen

.NET Framework 3.0 + SqlServer 生成器(停止更新)
C#
17
star
23

genms_shop

.NETCore 快速开发做一个简易商城
JavaScript
13
star
24

FreeSql.Connection.Extensions

Mysql, postgresql, sqlserver, Oracle and SQLite connection object extension methods.
C#
10
star
25

dng.Mysql

dotnetgen_mysql生成器所需MySql.Data的基础封装
C#
6
star
26

bmw.js

JavaScript
6
star
27

robot_test

简易任务调度
C#
6
star
28

dotnetGen_demo

dotnetGen 生成后的项目示例
C#
5
star
29

dng.Mssql

dotnetgen_sqlserver生成器所需System.Data.SqlClient的基础封装
C#
4
star
30

oss_signature

阿里云OSS服务端签名后直传,模仿官方get.php代码实现
C#
4
star
31

Spider

爬虫工具,.NET2.0实现
C#
4
star
32

AdminBlazor

AdminBlazor 是一款 Blazor SSR 后台管理项目,支持 RABC 权限菜单/按钮,支持一对一、一对多、多对多代码生成 .razor 界面。
HTML
4
star
33

dng.Pgsql

dotnetgen_postgresql生成器所需npgsql的基础封装
C#
3
star
34

dng.Template

模板引擎,不再使用(作纪念)
C#
3
star
35

cnodejs_netcore

.NETCore + MySql 实现的 cnodejs.org
JavaScript
2
star