Twitter Storm源代码分析之TimeCacheMap-过期清除
2014-03-05 23:08
120 查看
作者: xumingming |
可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://xumingming.sinaapp.com/395/twitter-storm-code-analysis-timecahcemap/TimeCacheMap是Twitter
Storm里面一个类, Storm使用它来保存那些最近活跃的对象,并且可以自动删除那些已经过期的对象。这个类设计的很巧妙, 我们来看一下。
TimeCacheMap里面的数据是保存在内部变量
_bucket里面的:
帮助
ConcurrentHashMap是利用多个bucket来缩小锁的粒度, 从而实现高并发的读写。而TimeCacheMap则是利用多个bucket来使得数据清理线程占用锁的时间最小。
首先来看看TimeCacheMap的构造函数, 它的构造函数首先是生成numBuckets个空的HashMap:
帮助
帮助
expirationSecs / (numBuckets - 1)秒钟的时间去把最后一个bucket里面的数据全部都删除掉
— 这些被删除掉的数据其实就是过期的数据。(为什么不是每隔expirationSecs就来删除一次呢?我们下面会说)。这里值得注意的是:正是因为这种分成多个桶的机制, 清理线程对于
_lock的占用时间极短。只要把最后一个bucket从_buckets解下,并且向头上面添加一个新的bucket就好了:
帮助
同时对于每条过期的数据TimeCacheMap会执行我们的callback函数:
帮助
expirationSecs / (numBuckets - 1)秒的时间来检查,这样对吗?TimeCacheMap的内部有多个桶, 当你向这个TimeCacheMap里面添加数据的时候,数据总是添加到第一个桶里面去的。
帮助
numBuckets = 3, expirationSecs = 2。
我们先往里面填一条数据
{1: 1}, 这条数据被加到第一个桶里面去, 现在TimeCacheMap的状态是:
帮助
expirationSecs / (numBuckets - 1)= 2 / (3)。清理线程干掉最后一个HashMap,并且在头上添加一个新的空HashMap, 现在TimeCacheMap的状态是:
- 1) = 1
帮助
帮助
所以从
{1:1}被加入到这个TimeCacheMap到被干掉一共用了3秒,其实这个3秒就等于
帮助
Expires keys that have not been updated in the configured number of seconds.
The algorithm used will take between expirationSecs and
expirationSecs * (1 + 1 / (numBuckets-1)) to actually expire the message.
那为什么说时间是
expirationSecs到
expirationSecs * (1 + 1 / (numBuckets-1))之间呢?因为线程调度的不确定性。
相关文章推荐
- Twitter Storm源代码分析之TimeCacheMap
- Twitter Storm源代码分析之TimeCacheMap
- iOS使用Instrument-Time Profiler工具分析和优化性能问题
- Session过期和清除缓存
- C Run Time--crt0.o 分析
- Linux time 命令在性能分析中的作用
- 通讯系统经验谈【一】TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT
- 第三只眼网络监控软件简单分析,试用及清除
- SET STATISTICS TIME 显示分析、编译和执行各语句所需的毫秒数
- TCP连接状态分析:SYNC_RECV,CLOSE_WAIT,TIME_WAIT
- (转)基于TimeQuest的reg2reg之Th分析
- 用Quartus II Timequest Timing Analyzer进行时序分析
- GetSystemTime,GetLocalTime,GetCurrentTime异同分析
- (算法分析Week15)Best Time to Buy and Sell Stock with Cooldown[Medium]
- Spring boot集成Redis实现sessions共享时,sessions过期时间问题分析
- 完整清除XP垃圾文件的秘密武器正文分析错误
- WCET(Worst Case Execution Time)及有关分析方法
- 全面深入分析TCP的TIME_WAIT和CLOSE_WAIT(上)
- OffsetIndex和TimeIndex分析
- TCP/IP TIME_WAIT状态原理和服务端过多原因分析