Redis 过滤器

1、使用数据结构:set
2、使用操作命令:Redis 集合(Set)


// 向集合添加一个或多个成员
SADD key member1 [member2] 

// 移除集合中一个或多个成员
SREM key member1 [member2] 

// 判断 member 元素是否是集合 key 的成员
SISMEMBER key member 

3、实现原理:把用户ID存入set 中,判断是否存在

  1. 使用 SADD key member 保存用户ID,使用 SREM key member 移除用户ID
  1. 使用 SISMEMBER key member 判断是否存在

4*、 如果用户数量大的话可以使用布隆过滤器

原理和set 一样,只是存放的用户ID的指纹(使用 多个 hash 函数对 key 进行运算,算得一个证书索引值,然后对位数组长度进行取模运算得到一个位置,每个 hash 函数都会算得一个不同的位置,再把位数组的这几个位置都置为 1,就得到了一个指纹)

判断是否存在时,在使用相同的方法判断每个位置上是否都为1

如果判断不存在,那必然是不存在;但是如果判断是存在时,布隆过滤器会有0.1%的误差,因为有可能某个位置上的1是其他key产生的

### 使用方法 在 Golang 中使用 go-redis 操作布隆过滤器,需要先确保 Redis 服务器安装了 RedisBloom 模块,因为 Redis 本身并不直接支持布隆过滤器。安装并配置好 RedisBloom 后,就可以在 Go 代码中通过 go-redis/redis 库来调用相关的 RedisBloom 命令 [^3]。 以下是一个简单的示例代码: ```go package main import ( "fmt" "github.com/go-redis/redis/v8" "context" ) func main() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, }) // 创建一个布隆过滤器 err := rdb.Do(ctx, "BF.RESERVE", "mybloomfilter", 0.01, 1000).Err() if err != nil { fmt.Println("Error creating bloom filter:", err) return } // 添加元素到布隆过滤器 err = rdb.Do(ctx, "BF.ADD", "mybloomfilter", "element1").Err() if err != nil { fmt.Println("Error adding element:", err) return } // 检查元素是否存在于布隆过滤器中 exists, err := rdb.Do(ctx, "BF.EXISTS", "mybloomfilter", "element1").Bool() if err != nil { fmt.Println("Error checking existence:", err) return } fmt.Println("Element exists:", exists) } ``` ### 原理 布隆过滤器是一种空间效率极高的概率型数据结构。它本质上是一个位数组和一系列哈希函数。当一个元素加入布隆过滤器时,通过多个哈希函数将该元素映射到位数组的多个位置,并将这些位置的值置为 1。当查询一个元素是否存在时,同样使用这些哈希函数计算出对应的位置,检查这些位置的值是否都为 1。如果有任何一个位置的值为 0,则该元素一定不存在;如果所有位置的值都为 1,则该元素可能存在,存在一定的误判率 [^2]。 ### 应用场景 在大数据场景下,高效去重是数据处理的核心需求之一。传统的哈希表(HashSet)因内存占用过高,难以应对亿级甚至十亿级数据量。布隆过滤器可以完美解决这一问题,常见的应用场景包括大数据去重,如网页爬虫判断网页是否已经爬取过、垃圾邮件过滤判断邮件是否为垃圾邮件等 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值