工做中有用到Redis滤重队列。redis
原来的方法以下:算法
方法一数组
优势:
简单,直观。性能
缺陷:编码
方法二
为了解决以上痛点,新玩法为:code
getbit key offset
。若是存在说明队列中存在一个这个offset的值,就不须要进行入队操做,直接中断执行就好。优势:队列
缺点:ip
int
,好比,long范围的offset是不存在的,这是一个很重要
的点,必定要注意(都是血泪史)。总结
从上面的分析来看,感受方法二完胜方法一。其实不尽然,只能说各有不一样的场景。
方法一比较通用,不论入队的内容是什么,均可能滤重,方法二依赖与Bitmap算法,意味key只能是数值型的元素。
在实际应用中,以上两种滤重方式通常是能够联合使用的。若是key是数值类型,没有超出int的取值范围,那么就直接使用方法二,若是超出了int的取值范围的数值就使用方法一。rem
扩展
还有一种滤重的算法叫:布隆过滤器,感兴趣的同窗能够了解下:Bloom filter。若是不须要删除,不在意误判率的话那应该是很合适的一个算法,空间和时间都很高效。get
另外若是有人遇到过其余的一些坑或者有更好的建议,欢迎指点。