基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)

1.计算出key的哈希值。

  1. 根据hash值和固定段大小取模计算出偏移位offset。
  2. 根据固定前置+hash值/固定段大小计算出所处段的bitKey。
  3. 根据bitKey和offset判断是否存在。
  4. 如果存在然后调用containsFromDb判断是否存在。
  5. 将redis setbit进行分段可以避免单个key数据量过大。
  6. 如果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);
}    

}

目录
相关文章
|
3月前
|
NoSQL 数据可视化 Redis
redis上db复制的方法
首先排除使用命令行实现,因为没有现成的命令可以完成db复制,跨redis实例的复制迁移就更加没有这种命令了。假如非要使用命令来实现,要写大量的脚本,但是这样可靠性和速度无法保证,因为你无法保证你写的程序是否会有bug。db的复制,可以使用yunedit-redis来实现,yunedit-redis有可视化界面,复制起来非常简单。
|
9月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
441 61
Redis应用—6.热key探测设计与实践
|
6月前
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
存储 NoSQL Java
Redis如何处理Hash冲突?
在 Redis 中,哈希表是一种常见的数据结构,通常用于存储对象的属性,对于哈希表,最常遇到的是哈希冲突,那么,当 Redis遇到Hash冲突会如何处理?这篇文章,我们将详细介绍Redis如何处理哈希冲突,并探讨其性能和实现细节。
332 1
|
11月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
173 7
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
526 0
Redis大Key问题如何排查?如何解决?
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
存储 NoSQL Redis
Redis 哈希(Hash)
10月更文挑战第16天
191 1