c#一种存储结构解决动态平衡问题
不说其他了,最近为了实现这么一个场景了而提取的一种结构。我们把一种数据缓存,比如开辟的存储Buffer,或者连接池。放置在一个结构中。很多时候这有一个共同的特点,我们的业务在一段时间会急剧增长,我们开辟的缓存也需要增长,或者说有一个峰值,但是过了一段时间后就不需要了。我假设峰值100个buffer,但是大部分80.这样一直保持的没有任何意义,浪费资源,尤其是我们的buffer存储的类似数据库连接(数据库连接池),需要动态判断和移除释放。
这里首先考虑的是stack,为什么呢?我们把stack看做一个桶,总是在顶上操作。如果有多余没有使用的,你们它一直在桶底保留着,很久都不会使用,所以stack是很方便做这类事情的,一般情况可以直接使用stack来操作,然后每隔一段时间去检查stack内部数据(尤其是底部的数据),看看是否是很久都没有使用了,可以释放。但是stack没有提供直接对底部数据的操作访问,不是很方便,所以最好的办法是桶结构的顶部经常操作数据(先进后出),在必要的时候(很少很少)也可以操作底部数据,只是用于检测是否有多余的数据放置在桶底,很久没有使用,需要释放(很多时候我们实行的就是一个时间);
最后我根据自己的需要,采用linkedlist和monitor同步,来存储数据,将尾部看做桶顶。也提供对头的操作,这样来实现这个结构。基本符合我的需要。另外我把存储的使用也提取出来了。在里面存储的结构的必须是接口实现。每个元素只提供一个状态,删除数据时,只是修改这个元素的状态,并不是真正的移除,只有在取出数据时,才验证这个数据元素是否已经被移除,这样来提高效率,减少线程竞争,同时把移除的数据放在结构的一个集合中,成批量的由事件推送,这样提高移除数据的操作,而移除数据是否需要就看业务需要了,比如我存储的数据库连接池,那么就需要,移除的连接并没有真实释放,业务需要真实的释放就需要处理这些移除。
我把实现的结构,以及提取的存储带状态的模型都抽离出来,做了一个demo,供有相关需要的参考,项目已经上传GIT.
项目地址:
https://github.com/jinyuttt/ConcurrentBucket.git
c#一种存储结构解决动态平衡问题的更多相关文章
- Java数据结构——树的三种存储结构
(转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...
- 利用设置新数据存储结构解决vue中折叠面板双向绑定index引起的问题
问题背景是,在进行机器性能可视化的前端开发时,使用折叠面板将不同机器的性能图表画到不同的折叠面板上去.而机器的选择利用select下拉选项来筛选. 由于在折叠面板中,通过 如下v-model双向绑定了 ...
- C#创建安全的字典(Dictionary)存储结构
在上面介绍过栈(Stack)的存储结构,接下来介绍另一种存储结构字典(Dictionary). 字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而 ...
- ORACLE数据库存储结构简介(转)
首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内部的组织和管理数据的方式. 物理存储结构:o ...
- 树和二叉树->存储结构
文字描述 1 二叉树的顺序存储 用一组地址连续的存储单元自上而下,自左至右存储完全二叉树上的结点元素. 这种顺序存储只适用于完全二叉树.因为,在最坏情况下,一个深度为k且只有k个结点的单支树却需要长度 ...
- 图的存储结构与操作--C语言实现
图(graph)是一种比树结构还要复杂的数据结构,它的术语,存储方式,遍历方式,用途都比较广,所以如果想要一次性完成所有的代码,那代码会非常长.所以,我将分两次来完成图的代码.这一次,我会完成图的五种 ...
- Oracle 存储结构
数据库是存储数据的容器,它的主要功能是保存和共享数据. oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内 ...
- 【PHP数据结构】图的存储结构
图的概念介绍得差不多了,大家可以消化消化再继续学习后面的内容.如果没有什么问题的话,我们就继续学习接下来的内容.当然,这还不是最麻烦的地方,因为今天我们只是介绍图的存储结构而已. 图的顺序存储结构:邻 ...
- Redis(一):基本数据类型与底层存储结构
最近在整理有关redis的相关知识,对于redis的基本数据类型以及其底层的存储结构简要的进行汇总和备注(主要为面试用) Redis对外提供的基本数据类型主要为五类,分别是 STRING:可以存储字符 ...
随机推荐
- 【读书笔记】C#高级编程(一).NET体系结构
写在前面:从业两年来,一直停留在会用的阶段,而没有去仔细思考过为什么这么用,之前也大致扫过<c#高级编程>一书,这次想借一袭脑海中的冲动,再次好好仔细过过这本书,夯实基础,温故知新. 一. ...
- c# 判断是否是DICOM文件
public bool isDicom(string filename) { FileStream fs = File.OpenRead(filename); ]; fs.Read(data, , d ...
- Java进程内缓存
今天和同事聊到了缓存,在Java中实现进程缓存.这里主要思想是,用一个map做缓存.缓存有个生存时间,过期就删除缓存.这里可以考虑两种删除策略,一种是起一个线程,定期删除过期的key.第二个是,剔除模 ...
- SpringMvc Controller请求链接忽略大小写(包含拦截器)及@ResponseBody返回String中文乱码处理
SpringMvc Controller请求链接忽略大小写(包含拦截器)及@ResponseBody返回String中文乱码处理... @RequestMapping(value = "/t ...
- scss-字符串连接符
+ 运算可用于连接字符串: // SCSS p { cursor: e + -resize; } // 编译后的 CSS 样式 p { cursor: e-resize; } 请注意,如果带引号的字符 ...
- HTML表单(form)的“enctype”属性
Form元素的语法中,EncType表明提交数据的格式 属性值: application/x-www-form-urlencoded:在发送前编码所有字符(默认) multipart/form-dat ...
- Eclipse One Inspector
net.sf.yari.eclipse.EclipseInspectorViewPart Through the outline of EclipseInspectorViewPart, we can ...
- 16_AOP入门准备_Jdk动态代理模式
[工程截图] [PersonDao.java] package com.HigginCui.daoProxy; //目标类接口 public interface PersonDao { public ...
- (转)Android新的menu实现——ActionMode
Android的menu有多种实现方式,以前写过一篇Android中五种常用的menu(菜单),这里介绍一种新的menu实现方式:ActionMode.ActionMode是Android 3.0以后 ...
- 查看oracle固定目录下日志和trace文件大小脚本
python刚入门,在Oracle官网看到个小脚本,感觉挺有意思,经过测试切实可行. [oracle@ycr python]$ more 5.py import datetimeimport osim ...