布隆过滤器如何防止Redis缓存穿透?
布隆过滤器如何防止Redis缓存穿透?
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,主要用于判断一个元素是否在一个集合中。在分布式系统和缓存设计中,布隆过滤器常被用来防止缓存穿透,提高系统的整体性能和稳定性。本文将详细介绍布隆过滤器如何实现这一功能。
1、什么是缓存穿透?
缓存穿透是指大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库,根本没有经过缓存。这种情况通常是由于黑客攻击,出现非正常 URL 访问。
2、什么是布隆过滤器?
布隆过滤器实际上是一个很长的二进制向量和一系列哈希函数组成的概率性数据结构。使用哈希函数有两个好处:
- 哈希函数无论输入值的长度是多少,得到的输出值长度固定
- 使元素分布均匀,常见的哈希函数有 MD5、SHA-1
布隆过滤器的主要作用是判断一个元素是否在一个集合中,0代表不存在,1代表存在。其特点如下:
- 高效插入和查询,但不易删除,同时返回结果可能存在误判
- 采用 bitmap 结构来存储数据,相比于传统的 list、map、set 效率更高,占用空间更少
假设一个元素占1个字节,使用传统数据结构存储10亿数据需要900G内存空间。引入 bitmap 结构,仅需要120M内存空间,占用空间极大减少。
3、布隆过滤器原理
3.1 存入过程
当一个元素需要存入布隆过滤器时,会依次通过 k 个哈希函数进行哈希运算,得到 k 个哈希值。然后将这 k 个哈希值对应的 bitmap 位置置为 1。
3.2 查询过程
当需要查询一个元素是否存在于布隆过滤器时,同样会依次通过 k 个哈希函数进行哈希运算,得到 k 个哈希值。然后检查这 k 个哈希值对应的 bitmap 位置是否都为 1。如果都为 1,则认为该元素可能存在;如果有一个为 0,则可以确定该元素不存在。
3.3 删除过程
布隆过滤器的一个缺点是不易删除元素。因为当一个元素需要从布隆过滤器中删除时,不能简单地将对应的 bitmap 位置置为 0,因为这可能会影响到其他元素的判断结果。因此,布隆过滤器通常不支持删除操作。
4、布隆过滤器如何防止Redis缓存穿透?
布隆过滤器可以有效地防止缓存穿透。当一个请求到达系统时,首先会检查布隆过滤器,如果布隆过滤器返回该元素不存在,则可以直接返回,而不需要继续查询数据库。这样可以避免大量无效请求直接打到数据库,从而保护数据库免受攻击。
布隆过滤器虽然存在一定的误判率,但这种误判只会导致将不存在的元素误判为存在,而不会导致将存在的元素误判为不存在。因此,在防止缓存穿透的场景中,布隆过滤器是一个非常有效的解决方案。