Guava BloomFilter 实现

Guava BloomFilter 实现

Guava BloomFilter 改进点

  1. 重写了 bitset,可以参见 LockFreeBitArray类的实现 ,突破了int.maxsize 大约21亿的限制
  2. 采用MurmurHash3 非加密型哈希函数,对大块的数据,具有较高的平衡性与低碰撞率。en.wikipedia.org100w字符串hash,1s+
  3. 论文Less Hashing, Same Performance!Building a Better Bloom Filter,提到只需要两个;论文用google翻译了一部分,见
  4. 32位散列函数这个技巧并不会显着降低Bloom过滤器的性能;guava 具体做法见 BloomFilterStrategies 类的MURMUR128_MITZ_32MURMUR128_MITZ_64两种策略的实现
  5. 添加元素过程中,并非执行了 optimalNumOfHashFunctions 次hash 操作,改为一次MurmurHash3,和optimalNumOfHashFunctions次基础运算,大大减少了计算次数,提高了性能
  6. BloomFilter 一直被标记为@Beta,但已经在google很多产品中得到运用

Bloom Filter 概念和原理

  Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。

  Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。

适用场景

  • 黑名单
  • 爬虫重复URL检测
  • 字典纠缠
  • 磁盘文件检测
  • CDN(squid)代理缓存技术

以爬虫重复URL举例:

  假设要你写一个网络蜘蛛(web crawler)。由于网络间的链接错综复杂,蜘蛛在网络间爬行很可能会形成“环”。为了避免形成“环”,就需要知道蜘蛛已经访问过那些URL。给一个URL,怎样知道蜘蛛是否已经访问过呢?稍微想想,就会有如下几种方案:

  1. 将访问过的URL保存到数据库。

  2. 用HashSet将访问过的URL保存起来。那只需接近O(1)的代价就可以查到一个URL是否被访问过了。

  3. URL经过MD5或SHA-1等单向哈希后再保存到HashSet或数据库。

  4. Bit-Map方法。建立一个BitSet,将每个URL经过一个哈希函数映射到某一位。

  方法1~3都是将访问过的URL完整保存,方法4则只标记URL的一个映射位。
  
以上方法在数据量较小的情况下都能完美解决问题,但是当数据量变得非常庞大时问题就来了。


团队代码协作规范 及 产品发布流程 v2

基于Gitflow 工作流 + 测试/预演/生产 环境 产品发布上线流程

团队代码协作规范 及 产品上线发布流程

团队代码协作规范 - 基于git flow工作流

git-flow


banner字符图案生成

linux 下3个有趣的小工具,用来生成 banner字符图案:

banner: 使用#来组成
figlet: 使用-,等普通字符生成
toilet:使用一些复杂的彩色特殊字符生成


团队Scrum实践规则

团队组建

并不需要个个都是技术超一流的,相反,下面几个特性在组建团队时更应该得到重视:

  1. 社交敏感度
  2. 同理心

重新定义领导力
领导力就是有能力去创造一种环境,让其中的每个人都能集思广益
创造一种环境:
在技术上
在研发过程上,能够自驱动自组织

不需要过多干涉运行,只需要保证团队的正常运作,倾听团队的意见并确保他们遵守原则。

Scrum 规则:

  • 规则迭代:在每个sprint结束后,在retrospective会议上进行调整,统一后在下个sprint 内严格遵守
  • 惩罚规则:Daily Scrum Meeting,定好时间后,未按规定时间到会,每迟到一分钟10元红包…不超过50元。或者选择唱歌、真心话大冒险
  • 需求变更控制:所有有关需求的事项(如需求不明确/需求变更),均需要在worktile 的话题模块进行讨论,并让所有人进行关注,避免结论被忽视,禁止进行单独对接和群内讨论;有了结论后,需要Scrum master 根据结论调整“todo” 栏目,并且邮件通知
    调整说明:项目组成员内部能解决的由测试进行记录到worktile;需要与外部沟通的由Scrum master记录;所有重大需求变更由Scrum master发邮件通知。
  • DoD 完成标准(Definition of Done):在每个sprint 启动时,由团队一起制定,sprint内的任务完成 评判以此为标准

Java Thread Life Cycle and Thread States

Java Thread Life Cycle and Thread States

一个java 线程 在它的生命周期来,可以处于下图的任何一个状态,可以是 New,Runnable,Blocked,Waiting,Timed Waiting 或 Terminated。同业也称为生命周期内的事件。

Java Thread Life Cycle Status

Java-Thraed-Life-Cycle-States


Key Elements of the Sprint Retrospective

Key Elements of the Sprint Retrospective

Sprint Retrospective 是一个由ScrumMaster在sprint刚结尾时推进的一个总结会议,为了让团队探讨和弄清楚有哪些可以改变可以促使团队在下一个sprint周期内更高效;Sprint Review 是看团队的工作成果,而retrospective 会议看的是如何来实现

retrospective 包含如下三个主要问题的讨论:

  1. 在sprint 周期内时,有哪些我们做得不错
  2. 在sprint 周期内时,有哪些我们做得不好
  3. 我们可以做些什么来改进

Sprint Retrospective 是一个非常重要的途径来帮助团队持续进化和提高


JumperServer如何能够免密登录

JumperServer 免密登录

用了JumperServer后,每次要连远程服务器,需要选一次私钥文件,输入两次密码,输入一次ip,非常麻烦,能不能一个简短的指令就搞定呢?答案是可以的

简化步骤:

  1. 将jumperServer 私钥转换为 无密码私钥
  2. ssh-add 将私钥添加到 Keychain
  3. 设置命令 alias,简化命令

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×