不说其他了,最近为了实现这么一个场景了而提取的一种结构。我们把一种数据缓存,比如开辟的存储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. DW网页制作,数学,数据库管理

    数学(函数关系的建立) 函数关系:确定性现象之间的关系常常表现为函数关系,即一种现象的数量确定以后,另一种现象的数量也随之完全确定,表现为一种严格的函数关系. 如:记为y=f(x),其中x称为自变量, ...

  2. [MySQL] - MySQL连接字符串总结

    来源:http://blog.sina.com.cn/s/blog_5f0dab1e0100e4pv.html?retcode=0 一.MySQL Connector/ODBC 2.50 (MyODB ...

  3. MarkDown 语言简单使用

    # Markdown file ![alt img is error](http://cdn2.jianshu.io/assets/web/logo-58fd04f6f0de908401aa561cd ...

  4. vue授权页面登陆之后返回之前的页面

    import Vue from 'vue'import Router from 'vue-router'Vue.use(Router)import home from "@/pages/ho ...

  5. 移动Web布局

    移动Web开发之移动页面布局 前言 本文针对手机设备设计的页面,并非兼容全设备的响应式布局,常见的MobileWeb页面如H5页面.手机页面.WAP页.webview页面等等.在不同尺寸的手机设备上, ...

  6. angularjs如何默认选中radio

    (1). 使用 ng-checked 即可.   <label class="radio-inline"> <input name="display&q ...

  7. .NET开源工作流RoadFlow-表单设计-HTML编辑器

    roadflow目前采用的html编辑器为ueditor编辑器(和表单设计器的编辑器相同). 绑定字段:与数据表的某个字段对应. 宽度:编辑器的宽度. 高度:编辑器的高度. 运行效果如下:

  8. Format - DateTime

    1. Long Date/Short Date/Long Time/Short Time,可以在系统的“Region and Language”中找到相应设置: 2. ISO Format/Local ...

  9. Matlab函数——awgn(高斯噪声)

    Matlab函数--awgn awgn 将白色高斯噪声添加到信号中 语法  y = awgn(x,snr)  y = awgn(x,snr,sigpower)  y = awgn(x,snr,'mea ...

  10. SpringMvc-自定义视图

    1.创建视图: 注意:创建视图的时候需要实现View接口的俩个方法 package com.atguigu.springmvc.views; import java.util.Date; import ...