不说其他了,最近为了实现这么一个场景了而提取的一种结构。我们把一种数据缓存,比如开辟的存储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. DIV滚动样式

    .divScroll{     OVERFLOW:auto;        scrollbar-face-color: #FFFFFF;        scrollbar-shadow-color: ...

  2. Android活动的启动模式

    1. standard 标准模式,是活动默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这种模式. Android使用返回栈管理活动,在standard模式下,每当启动一个新的活动,它就 ...

  3. asp.net之cookie

    1.创建cookie HttpCookie userCookie = new HttpCookie("userInfo"); userCookie["name" ...

  4. java中如何遍历实体类的属性和数据类型以及属性值

      package com.walkerjava.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTa ...

  5. sass的安装

    sass的安装 1.当ruby安装完成后,在自己电脑开始菜单下面找到ruby的控制台"cmd"; 2.然后直接在命令行中输入 gem install sass 3.在安装过程中 可 ...

  6. rbac——界面、权限

    一.模板继承 知识点: users.html / roles.html 继承自 base.html 页面滚动时,固定 .menu { background-color: bisque; positio ...

  7. 浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用

    简介 日志的作用是保证持久性和数据一致性,通过日志可以实现数据的Undo与Redo,因此通过日志,SQL Server不仅仅可以实现灾难恢复,还可以通过日志的Redo来实现高可用性.本篇文章主要讲述日 ...

  8. DispatchAction和ForwardAction

    添加功能的步骤:做页面——编写DAO类中的方法——编写和配置action. 如果多个action 使用一个formbean,这种事儿多发生在统一模块中,就可以用一个Action集中处理多个操作,而不要 ...

  9. 管理uWSGI服务器

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

  10. percona MySQL 5.7yum安装

    检查是否安装有MySQL Server: rpm -qa | grep mysql rpm -qa | grep mariadb 删除方法: rpm -e mysql #普通删除模式 rpm -e - ...