# griddle
**Repository Path**: jxqlovejava/griddle
## Basic Information
- **Project Name**: griddle
- **Description**: 基于CountingBloomFilter实现的一个通用过滤组件,可用于限制用户投票数等场景,是沟通CountingBloomFilter算法与具体业务的一座“桥梁”,使用简单。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 2
- **Created**: 2014-05-09
- **Last Updated**: 2021-12-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
##注意:
* CountingBloomFilter最大可重复插入次数必须小于等于15(即maxRepeatInsertCount参数)
##griddle包含项目
griddle是一个简单的轻量级通用组件。它包含以下两个项目:
* bloomfilter-ext:提取自Hadoop源码,自己扩展了一个ThreadSafeCBloomFilter类,利用AtomicLongArray修改它的方法为线程安全方法
* griddle:依赖bloomfilter-ext项目,包含该通用组件的具体实现
##适合场景和特性
比如现在很多网站会发起一些投票活动,但需要限制每个用户投票总数,如果网站用户数量级比较大并且投票活动比较频繁时,我们该如何存储用户剩余可投票次数呢?
* 直接存储在MySQL这种关系型数据库中?不靠谱,查询和更新太耗时
* 存放在Redis这种KV数据库中?大部分情况可以,但比较耗内存,并且Redis基于TCP/IP网络协议,有网络连接开销
大数据算法中有一个叫Bloom Filter(中文名叫布隆过滤器)的算法,它能通过牺牲一定准确性来换取大量内存空间节省,并且由于操作是在内存中,性能也非常不错。非常适用于某些业务场景,比如爬虫的URL去重等。Bloom Filter的一个扩展算法是Counting Bloom Filter,它相比Bloom Filter支持删除,而且可以统计某个Key已重复插入的次数。更多关于Bloom Filter和Count Bloom Filter算法原理和实现细节,可以参考网络上的其他资料和查看bloomfilter-ext项目源码。
griddle正是基于Counting Bloom Filter实现的。此外,它还包含以下扩展特性:
* 程序运行过程会定时Dump内存中的Counting Bloom Filter数据结构到磁盘,这样在应用意外崩溃后再次启动时,会从Dump文件恢复Counting Bloom Filter为崩溃前状态
* 会定时回收满足回收条件的Griddle对象(它内部封装了一个Counting Bloom Filter和Dump文件相关信息)
##使用方法
###添加Maven依赖
首先通过在你项目的Maven的pom.xml中添加以下依赖关系:
```xml
属性 | 描述 |
dumpFileDir | Dump文件存放目录 |
dumpFileIntervalMillis | Dump文件时间间隔,单位毫秒 |
recycleGriddleCheckMillis | 定时回收Griddle时间间隔,单位毫秒 |
vectorSize | ((vectorSize - 1) >>> 4) + 1计算得到bucketSize,bucketSize是预估插入的独立key数,一般可以估大一些以降低误判率 |
hashType | Counting Bloom Filter使用的哈希函数,1为MurMurHash,0为JekinHash,建议维持为1 |
hashNum | 每个key映射到Counting Bloom Filter数据结构的多少位,建议值设置为12 |