不说其他了,最近为了实现这么一个场景了而提取的一种结构。我们把一种数据缓存,比如开辟的存储Buffer,或者连接池。放置在一个结构中。很多时候这有一个共同的特点,我们的业务在一段时间会急剧增长,我们开辟的缓存也需要增长,或者说有一个峰值,但是过了一段时间后就不需要了。我假设峰值100个buffer,但是大部分80.这样一直保持的没有任何意义,浪费资源,尤其是我们的buffer存储的类似数据库连接(数据库连接池),需要动态判断和移除释放。

这里首先考虑的是stack,为什么呢?我们把stack看做一个桶,总是在顶上操作。如果有多余没有使用的,你们它一直在桶底保留着,很久都不会使用,所以stack是很方便做这类事情的,一般情况可以直接使用stack来操作,然后每隔一段时间去检查stack内部数据(尤其是底部的数据),看看是否是很久都没有使用了,可以释放。但是stack没有提供直接对底部数据的操作访问,不是很方便,所以最好的办法是桶结构的顶部经常操作数据(先进后出),在必要的时候(很少很少)也可以操作底部数据,只是用于检测是否有多余的数据放置在桶底,很久没有使用,需要释放(很多时候我们实行的就是一个时间);

最后我根据自己的需要,采用linkedlist和monitor同步,来存储数据,将尾部看做桶顶。也提供对头的操作,这样来实现这个结构。基本符合我的需要。另外我把存储的使用也提取出来了。在里面存储的结构的必须是接口实现。每个元素只提供一个状态,删除数据时,只是修改这个元素的状态,并不是真正的移除,只有在取出数据时,才验证这个数据元素是否已经被移除,这样来提高效率,减少线程竞争,同时把移除的数据放在结构的一个集合中,成批量的由事件推送,这样提高移除数据的操作,而移除数据是否需要就看业务需要了,比如我存储的数据库连接池,那么就需要,移除的连接并没有真实释放,业务需要真实的释放就需要处理这些移除。

我把实现的结构,以及提取的存储带状态的模型都抽离出来,做了一个demo,供有相关需要的参考,项目已经上传GIT.

项目地址:

https://github.com/jinyuttt/ConcurrentBucket.git

c#一种存储结构解决动态平衡问题的更多相关文章

  1. Java数据结构——树的三种存储结构

    (转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...

  2. 利用设置新数据存储结构解决vue中折叠面板双向绑定index引起的问题

    问题背景是,在进行机器性能可视化的前端开发时,使用折叠面板将不同机器的性能图表画到不同的折叠面板上去.而机器的选择利用select下拉选项来筛选. 由于在折叠面板中,通过 如下v-model双向绑定了 ...

  3. C#创建安全的字典(Dictionary)存储结构

    在上面介绍过栈(Stack)的存储结构,接下来介绍另一种存储结构字典(Dictionary). 字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而 ...

  4. ORACLE数据库存储结构简介(转)

    首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的.   逻辑存储结构:oracle内部的组织和管理数据的方式.  物理存储结构:o ...

  5. 树和二叉树->存储结构

    文字描述 1 二叉树的顺序存储 用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素. 这种顺序存储只适用于完全二叉树.因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度 ...

  6. 图的存储结构与操作--C语言实现

    图(graph)是一种比树结构还要复杂的数据结构,它的术语,存储方式,遍历方式,用途都比较广,所以如果想要一次性完成所有的代码,那代码会非常长.所以,我将分两次来完成图的代码.这一次,我会完成图的五种 ...

  7. Oracle 存储结构

    数据库是存储数据的容器,它的主要功能是保存和共享数据. oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内 ...

  8. 【PHP数据结构】图的存储结构

    图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...

  9. Redis(一):基本数据类型与底层存储结构

    最近在整理有关redis的相关知识,对于redis的基本数据类型以及其底层的存储结构简要的进行汇总和备注(主要为面试用) Redis对外提供的基本数据类型主要为五类,分别是 STRING:可以存储字符 ...

随机推荐

  1. 【实用类String】String类方法的应用案例:查找判断指定字符出现的次数和位置

    一.应用要求 输入一个字符串,再输入要查找的字符,判断该字符在该字符串中出现的次数. 二.实现思路 1.使用substring()方法将字符串的每个字符存入数组 2.比较数组每个字符是否与指定的字符相 ...

  2. log4.j

    导入第三方jar包 第一步:右击工程名,新建一个文件夹(Fold),名字为lib. 第二步:把第三方jar包复制到lib目录下. 第三步:右击工程名---->properties ----> ...

  3. 封装微信jssdk自定义分享代码

    var protocol = window.location.protocol; //获取协议 var host = window.location.host; //获取域名 var posuDoma ...

  4. Steps of source code change to executable application

    程序运行的整个过程,学习一下 源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (o ...

  5. Android ViewPager+TabHost实现首页导航

    今天发的是TabHost结合ViewPager实现首页底部导航的效果,虽然说网上有很多这样的Demo,不过呢,我还是要把自己练习写的发出来,没错!就是这么任性: 先上效果图,如下: 代码里面有注释,就 ...

  6. Android存储扩展学习-----应用的清除数据和清除缓存

    前几天和朋友聊到了APP清除数据这块,聊到了清除数据都会清掉哪些数据,我们每个人的手机在”设置–>应用管理”里面,选择任意一个App,都会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我 ...

  7. Jmeter(一)http接口添加header和cookie --转载

    Jmeter(一)http接口添加header和cookie   HTTP信息头管理器在Jmeter的使用过程中起着很重要的作用,通常我们在通过Jmeter向服务器发送http请求(get或者post ...

  8. 管理uWSGI服务器

    管理uWSGI服务器 官网参考 如果您正在管理多个应用程序或高容量站点,请查看 uwsgi皇帝-多应用程序部署 虫族模式 UWSGI订阅式服务器 启动uwsgi服务器 以系统管理员身份启动 uwsgi ...

  9. Tomcat中部署web应用的三种方式

    Tomcat中部署web应用的三种方式(静态部署)       第一种,针对war或解压后的war,最为常用的是直接操作webapp目录,将完整的war包或者web应用直接放到webapp目录下.使用 ...

  10. Struts的学习-例子

    一.新建空项目user和配置maven实现下面的页面 1.配置内容 2.编写struts.xml实现页面 <!--定义一个useraction--> <package name=&q ...