一,基本的原理

  偶遇storm中的rotatecache算法,特地研究一下。

  核心:

  1,是采用了链表来组织多个桶来存储数据;

   2,插入数据时直接插入到第一个桶中,清除到其它桶中的同key值的数据;

  3,删除数据移除所有桶中的数据(此处需要遍历)

  4,回收数据的时候,采用了非常巧妙的方式,在链表头新加一个桶,删除尾部的桶删除掉,如果带回调,调用一下回调函数。

二,代码

  1,涉及到三个文件,rotatingmap本身代码

/*************************************************************************
> File Name: rotatingmap.java
> Author:zhangtx
> Mail: 18510665908@163.com
> Created Time: 2016年4月12日 星期四 13时12分14秒
************************************************************************/
package org.jinher.research.RotatingMap;import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;public class RotatingMap<K,V> {private static final int DEFAULT_NUM_BUCKETS=3;/** rotate的回调接口口* */public static interface ExpiredCallback<K,V>{public void expire(K key,V val);}private LinkedList<HashMap<K,V>> _buckets;private ExpiredCallback _callback;public RotatingMap(int numBuckets,ExpiredCallback<K,V> callback){if (numBuckets<2){throw new IllegalArgumentException("numBuckets must be >=2");}_buckets=new LinkedList<HashMap<K,V>>();for(int i=0;i<numBuckets;i++){_buckets.add(new HashMap<K,V>());}_callback=callback;}public RotatingMap(ExpiredCallback<K,V> callback){this(DEFAULT_NUM_BUCKETS,callback);}public RotatingMap(int numBuckets){this(numBuckets,null);}public Map<K,V> rotate(){Map<K,V> dead=_buckets.removeLast();_buckets.addFirst(new HashMap<K,V>());if(_callback!=null){for(Entry<K,V> entry:dead.entrySet()){_callback.expire(entry.getKey(),entry.getValue());}}return dead;}public boolean containsKey(K key){for(HashMap<K,V> bucket:_buckets){if (bucket.containsKey(key)){return true;}}return false;}public V get(K key){for(HashMap<K,V> bucket:_buckets){if(bucket.containsKey(key)){return bucket.get(key);}}return null;}/*存储数据*/public void put(K key,V value){Iterator<HashMap<K,V>> it=_buckets.iterator();/*put to the first bucket*/HashMap<K,V> bucket=it.next();bucket.put(key, value);/*remove key from others bucket*/while(it.hasNext()){bucket=it.next();bucket.remove(key);}}public Object remove(K key){/*移除数据*/for(HashMap<K,V> bucket:_buckets){if(bucket.containsKey(key)){return bucket.remove(key);}}return null;}public int size(){int size=0;/*计算各个桶中数据的个数之和*/for(HashMap<K,V> bucket:_buckets){size+=bucket.size();}return size;}}

2,回调接口实现代码

/*************************************************************************
> File Name: rotatingmap.java
> Author:zhangtx
> Mail: 18510665908@163.com
> Created Time: 2016年4月12日 星期四 13时12分14秒
************************************************************************/
package org.jinher.research.RotatingMap;public class EventHandler<K,V> implements RotatingMap.ExpiredCallback<K, V> {public void expire(K key, V val) {// TODO Auto-generated method stubSystem.out.println("key="+key+",val="+val);}
}

3,测试代码

  

/*************************************************************************
> File Name: rotatingmap.java
> Author:zhangtx
> Mail: 18510665908@163.com
> Created Time: 2016年4月12日 星期四 13时12分14秒
************************************************************************/
package org.jinher.research.RotatingMap;import java.text.SimpleDateFormat;
import java.util.Date;public class RotatingMapStarter
{RotatingMap<String,String> m_rotatingMap=null;RotatingMap.ExpiredCallback<String, String> m_eventHandler=null;long m_lastRotate=System.currentTimeMillis();long m_rotateTime;public RotatingMapStarter(int n,int rotateTime){m_eventHandler=new EventHandler<String,String>();m_rotatingMap=new RotatingMap<String,String>(4,m_eventHandler);m_lastRotate=System.currentTimeMillis();m_rotateTime=1000L*rotateTime;}public RotatingMap<String,String> getRotatingMap(){return m_rotatingMap;}public void setRotatingMap(RotatingMap<String,String> rotatingMap){this.m_rotatingMap=rotatingMap;}public void startConnMonitor(){Thread thread=new Thread("Server Monitor"){public void run(){while(true){runcore();}}public void runcore(){      try{Thread.currentThread().sleep(1000);}catch(InterruptedException e){e.printStackTrace();}long now=System.currentTimeMillis();if(now-m_lastRotate>m_rotateTime){m_rotatingMap.rotate();m_lastRotate=now;}else {SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(df.format(new Date(now)));}}};thread.start();}public static void main(String[] args)  {  RotatingMapStarter rotatingMapStarter = new RotatingMapStarter(4, 10);  rotatingMapStarter.startConnMonitor();  String value = "zhang";  String key = "1";  rotatingMapStarter.getRotatingMap().put(key, value);System.out.println("key="+key+",value="+rotatingMapStarter.getRotatingMap().get(key));String value1 = "tianxiang";  String key1 = "2";  rotatingMapStarter.getRotatingMap().put(key1, value1);System.out.println("key="+key1+",value="+rotatingMapStarter.getRotatingMap().get(key1));try {Thread.currentThread().sleep(100000000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}} }

三,结果

key=1,value=zhang
key=2,value=tianxiang
2016-04-12 14:48:48
2016-04-12 14:48:50
2016-04-12 14:48:51
2016-04-12 14:48:52
2016-04-12 14:48:54
2016-04-12 14:48:57
2016-04-12 14:48:58
2016-04-12 14:48:59
2016-04-12 14:49:00
2016-04-12 14:49:02
2016-04-12 14:49:03
2016-04-12 14:49:04
2016-04-12 14:49:07
2016-04-12 14:49:08
2016-04-12 14:49:10
2016-04-12 14:49:11
2016-04-12 14:49:12
2016-04-12 14:49:22
2016-04-12 14:49:23
2016-04-12 14:49:24
2016-04-12 14:49:25
2016-04-12 14:49:26
key=2,val=tianxiang
key=1,val=zhang
2016-04-12 14:49:33
2016-04-12 14:49:34
2016-04-12 14:49:35

   

storm中的RotatingCache技术相关推荐

  1. Storm精华问答 | Kafka在Storm中的角色是什么?

    戳蓝字"CSDN云计算"关注我们哦! Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop.随着越来越多的场景对Hadoop的MapReduce高 ...

  2. 互联网反欺诈体系中的常用技术和数据类型

    互联网反欺诈常用的技术主要包括数据采集.特征工程.决策引擎.数据分析等几个类别: 数据采集: 主要应用于从客户端或网络获取客户相关数据的技术方法.值得强调的是,数据采集技术的使用,应当严格遵循法律法规 ...

  3. 先进机器人系统中的关键技术

    先进机器人系统中的关键技术 Key technologies coalesce in advanced robotic systems 就在机器人设计进入商业领域,服务于制造业.物流业和服务业之际,概 ...

  4. 目标检测中特征融合技术(YOLO v4)(下)

    目标检测中特征融合技术(YOLO v4)(下) ASFF:自适应特征融合方式 ASFF来自论文:<Learning Spatial Fusion for Single-Shot Object D ...

  5. 目标检测中特征融合技术(YOLO v4)(上)

    目标检测中特征融合技术(YOLO v4)(上) 论文链接:https://arxiv.org/abs/1612.03144 Feature Pyramid Networks for Object De ...

  6. 深度学习中的正则化技术(附Python代码)

    作者:SHUBHAM JAIN 翻译:和中华 校对:丁楠雅 本文约3500字,建议阅读20分钟. 本文简单介绍了什么是正则化以及在深度学习任务中可以采用哪些正则化技术,并以keras代码具体讲解了一个 ...

  7. SAP SD 基础知识之定价中的条件技术(Condition Technique in Pricing)

    SAP SD 基础知识之定价中的条件技术(Condition Technique in Pricing) 一,定价程序Pricing Procedure 所有定价中允许的条件类型都包含在定价程序中: ...

  8. 最近实际项目中遇到的技术问题与解决思路

    最近实际项目中遇到的技术问题与解决思路 参考文章: (1)最近实际项目中遇到的技术问题与解决思路 (2)https://www.cnblogs.com/lunlunshiwo/p/9222456.ht ...

  9. 中软国际入职java考核_中软国际技术人员入职试题2(Java)

    中软国际技术人员入职试题2(Java) Java 笔试试题 一.介绍JSP中常用的内部对象.(时间4分钟) 1 request 2 response 3 out 4 application 5 ses ...

  10. 浅析图片XSS中的哪些技术问题

    本文讲的是浅析图片XSS中的哪些技术问题,跨站请求漏洞是web漏洞中最普遍的漏洞,在特定的场景下可以造成很严重的破坏.可以让攻击者在受害者浏览器上执行一个恶意脚本,网络上关于这方面的文章已经很多了. ...

最新文章

  1. 将Java程序打jar包并运行
  2. 关于oracle中table函数的使用
  3. 浙商银行携手神策数据,数字化转型提升客户体验
  4. HDU4307(最小割)
  5. PMP之项目整合管理---各种工具与技术
  6. Centos开机自己主动挂载windows中的ntfs磁盘
  7. java selenium (十二) 操作弹出窗口
  8. flex builder的安装
  9. 使用Keepalived实现负载均衡
  10. 网络层 详解,网络层功能,网络层协议,网络层设备。
  11. 13.PIO源码详解3-PIO模块(PIO.v)剖析
  12. 每天接触互联网 了解互联网是什么
  13. java 情感分析_Alink中文情感分析示例(Java版本)
  14. R语言和RStudio开发环境的下载与安装
  15. T51 运行文本指令
  16. 台式电脑脑计算机没法启动怎么办,台式机主机电源灯不亮,开不了机怎么办? 台式电脑无法开机什么原因...
  17. 工资3000,靠国际版抖音TikTok月入2W+:这个风口真的很赚钱!
  18. VCC、 VDD、VEE、VSS 电压理解
  19. android手机文件误删除恢复软件,被误删除的文件用安卓手机数据恢复软件怎么找回...
  20. 进化算法——多目标优化

热门文章

  1. 单机搭建Android开发环境(二)
  2. SSL证书配置注意事项
  3. HNUCM 1325:fps游戏
  4. C++ 语法概括总结
  5. Mysql之1050错误解决办法
  6. 小米 samba linux,U-BOOT移植准备之(一)Samba服务器
  7. NumPy学习笔记之argsort()函数
  8. android 底部停靠 底部吸附_充压、泄压对吸附式干燥机的重要性
  9. 飞思卡尔c语言,飞思卡尔MCU的C语言编程框架
  10. websocket 连接本地端口_Spring Boot 结合 WebSocket 实现在线聊天