基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)
2017-08-16 14:13
1921 查看
点击查看全文
1.计算出key的哈希值。
2. 根据hash值和固定段大小取模计算出偏移位offset。
3. 根据固定前置+hash值/固定段大小计算出所处段的bitKey。
4. 根据bitKey和offset判断是否存在。
5. 如果存在然后调用containsFromDb判断是否存在。
6. 将redis setbit进行分段可以避免单个key数据量过大。
7. 如果redis是集群也可以将分出来的段根据jedis crc16算法有概率的被打算
在各个节点上,避免单个节点过热。
代码示例:
package six.com.crawler.work.space;
import java.util.Objects;
import redis.clients.jedis.Jedis;
public class RedisAndDbBloomFilter {
}
点击查看全文
1.计算出key的哈希值。
2. 根据hash值和固定段大小取模计算出偏移位offset。
3. 根据固定前置+hash值/固定段大小计算出所处段的bitKey。
4. 根据bitKey和offset判断是否存在。
5. 如果存在然后调用containsFromDb判断是否存在。
6. 将redis setbit进行分段可以避免单个key数据量过大。
7. 如果redis是集群也可以将分出来的段根据jedis crc16算法有概率的被打算
在各个节点上,避免单个节点过热。
代码示例:
package six.com.crawler.work.space;
import java.util.Objects;
import redis.clients.jedis.Jedis;
public class RedisAndDbBloomFilter {
private String nameSpace; private Jedis jedis; private int fixSize; public RedisAndDbBloomFilter(String nameSpace,Jedis jedis,int fixSize){ this.nameSpace=nameSpace; this.jedis=jedis; this.fixSize=fixSize; } private int getHash(String key){ return key.hashCode(); } private void addToDb(int hash,String key){ //TODO 将记录保存至db } private boolean containsFromDb(int hash,String key){ //TODO 根据 hash key 查询数据库是否存在 return false; } /** * 根据hash和fixSize 算出bitKey * @param hash * @return */ private String getBitKey(int hash){ int bitKeyIndex=hash/fixSize; String bitKey=nameSpace+bitKeyIndex; return bitKey; } /** * 判断给定的key是否存在 * @param key * @return */ public boolean contains(String key){ //TODO 如果是集群模式这里需要分布式锁,如果是单机这里需要线程锁 Objects.requireNonNull(key, "the key must not be null"); int hash=getHash(key); int offset=hash%fixSize; String bitKey=getBitKey(hash); Boolean result=jedis.getbit(bitKey,offset); if(result.booleanValue()&&containsFromDb(hash, key)){ return true; } return false; } /** * 根据给定的key添加一个过滤记录 * @param key */ public void addRecord(String key){ //TODO 如果是集群模式这里需要分布式锁,如果是单机这里需要线程锁 int hash=getHash(key); int offset=hash%fixSize; String bitKey=getBitKey(hash); jedis.setbit(bitKey,offset, true); addToDb(hash, key); }
}
点击查看全文
相关文章推荐
- 基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)
- 基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)
- 一个JS图片放大镜,实现动态记录的图片放大,避免内存泄露,解决IE6下无法遮盖select控件问题
- 一个JS图片放大镜,实现动态记录的图片放大,避免内存泄露,解决IE6下无法遮盖select控件问题
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题
- 分布式环境下基于redis解决在线客服坐席动态分配的问题
- 用win32实现的一个拷贝--主要是解决宽字节问题
- 基于avd7181c解决视频输入效果差的问题<四>---android显示相关实现调试手记
- 从零开始实现一个电子商务网站----解决碰到的问题(六)
- 迷宫问题解决方法:分别基于深度搜索和广度搜索的思想来实现
- 基于pcDuino的WiFi视频监控小车实现过程中遇到的问题及解决方法
- 实现ipad上的内嵌webview手势缩放图片(修改版,解决在第一张图片放大的情况下翻到下一张图片无法放大的问题) 基于Quo(js库)
- 实现datagrid的foot中增加一个新增数据行,以解决datagrid不能新增数据的问题
- 学习 "使用cocos2d-x3.0和物理引擎实现碰撞检测" 中出现的一个问题
- redis 批量删除key,与出现的问题解决(MISCONF Redis is configured to save RDB snapshots)
- 解决问题--VS2012中一个Panel覆盖另一个Panel时拖动时容易造成两个控件成父子关系的避免
- 合并Dev控件包为一个独立的包,解决带皮肤后编译文件过大问题
- 分布式环境下基于redis解决在线客服坐席动态分配的问题
- GDB多线程调试基本命令和实现简介以及一个常见问题的解决
- CSDN博客:对于一个程序员,写程序就是实现功能,遇到具体问题,解决这个问题,并记录问题到CSDN上,从而有所提高和互相帮助。