成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis布隆過濾器的原理和應用場景,解決緩存穿透

數據庫 Redis
布隆過濾器BloomFilter是一種專門用來解決去重問題的高級數據結果。

今天分享一下Redis布隆過濾器的原理和應用場景,解決緩存穿透,實現快速入門,豐富個人簡歷,提高面試level,給自己增加一點談資,秒變面試小達人,BAT不是夢。

一、布隆過濾器BloomFilter是什么

布隆過濾器BloomFilter是一種專門用來解決去重問題的高級數據結果。

實質就是一個大型位數組和幾個不同的無偏hash函數,無偏表示分布均勻。由一個初值為零的bit數組和多個哈希函數組成,用來判斷某個數據是否存在,它和HyperLogLog一樣,不是那么的精準,存在一定的誤判概率。

二、布隆過濾器BloomFilter能干嘛?

圖片

高效地插入和查詢,占用空間少,返回的結果是不確定的,一個元素如果判斷結果為存在,它不一定存在;不存在時,一定不存在。

因為不同的字符串的hashcode可能相同,布隆過濾器BloomFilter是根據hashcode判斷的,如果某個hashcode存在,它對應的字符串不一定是你想要的那個字符串;但是,hashcode不存在時,你所要的字符串,肯定不存在,細品~

布隆過濾器BloomFilter只能添加元素,不能刪除元素。

這和上面提到的hashcode判定原理是一樣的,相同hashcode的字符串會存儲在一個index,刪除時,是將某個index移除,此時,就可能移除擁有相同hashcode的不同字符串,細品~

三、布隆過濾器使用場景

1、解決緩存穿透問題

一般情況下,先查詢Redis緩存,如果Redis中沒有,再查詢MySQL。當數據庫中也不存在這條數據時,每次查詢都要訪問數據庫,這就是緩存穿透。

在Redis前面添加一層布隆過濾器,請求先在布隆過濾器中判斷,如果布隆過濾器不存在時,直接返回,不再反問Redis和MySQL。

如果布隆過濾器中存在時,再訪問Redis,再訪問數據庫。

完美解決緩存穿透問題。

圖片

2、黑名單

如果黑名單非常大,上千萬了,存放起來很耗費空間,在布隆過濾器中實現黑名單功能,是一個很好的選擇。

3、網頁爬蟲對URL的去重,避免爬取相同的URL地址

四、操作布隆過濾器BloomFilter

1、使用布隆過濾器

(1)初始化bitmap

布隆過濾器 本質上 是由長度為 m 的位向量或位列表(僅包含 0 或 1 位值的列表)組成,最初所有的值均設置為 0。

圖片

(2)添加key

使用多個hash函數對key進行hash運算,得到一個整數索引值,對位數組長度進行取模運算得到一個位置,每個hash函數都會得到一個不同的位置,將這幾個位置的值置為1就表示添加成功。

例如,我們添加一個字符串“哪吒編程”,對字符串進行多次hash(key) → 取模運行→ 得到坑位。

圖片

2、刪除key

只要有其中一位是零就表示這個key不存在,但如果都是1,則不一定存在對應的key。

3、判斷是否存在

向布隆過濾器查詢某個key是否存在時,先把這個 key 通過相同的多個 hash 函數進行運算,查看對應的位置是否都為 1,

只要有一個位為零,那么說明布隆過濾器中這個 key 不存在;

如果這幾個位置全都是 1,那么說明極有可能存在;

因為這些位置的 1 可能是因為其他的 key 存在導致的,也就是前面說過的hash沖突

五、代碼實例

1、使用Redis做緩存

public class StudentSerivce {
    public static final String CACHE_KEY = "student:";

    @Resource
    private StudentMapper studentMapper;
    @Resource
    private RedisTemplate redisTemplate;

    public void addstudent(Student student){
        int i = studentMapper.insertStudent(student);

        if(i > 0)
        {
            //到數據庫里面,重新撈出新數據出來,做緩存
            student=studentMapper.selectByKey(student.getId());
            //緩存key
            String key=CACHE_KEY+student.getId();
            //往mysql里面插入成功隨后再從mysql查詢出來,再插入redis
            redisTemplate.opsForValue().set(key,student);
        }
    }

    public Student findstudentById(Integer studentId){
        Student student = null;
        String key=CACHE_KEY+studentId;
        // 查詢redis
        student = (Student) redisTemplate.opsForValue().get(key);
        // redis沒有,查詢mysql
        if(student==null){
            // 從mysql查出來student
            student=studentMapper.selectByPrimaryKey(studentId);
            // mysql有,redis沒有
            if (student != null) {
                // mysql的數據寫入redis
                redisTemplate.opsForValue().set(key,student);
            }
        }
        return student;
    }
}

2、布隆過濾器

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 布隆過濾器 -> redis -> mysql
 * @autor 哪吒編程
 * @date 2023-04-17
 */
@Service
public class StudentServiceImpl implements StudentService {
    public static final String CACHE_KEY = "student:";

    @Autowired
    private StudentMapper studentMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    public void addstudent(student student){
        int i = studentMapper.insertSelective(student);

        if(i > 0) {
            //到數據庫里面,重新撈出新數據出來,做緩存
            student=studentMapper.selectByPrimaryKey(student.getId());
            //緩存key
            String key=CACHE_KEY+student.getId();
            //往mysql里面插入成功隨后再從mysql查詢出來,再插入redis
            redisTemplate.opsForValue().set(key,student);
        }
    }

    public student findstudentById(Integer studentId){
        student student = null;

        //緩存key的名稱
        String key=CACHE_KEY+studentId;

        // 查詢redis
        student = (student) redisTemplate.opsForValue().get(key);

        //redis沒有,查詢mysql
        if(student==null) {
            student=studentMapper.selectByPrimaryKey(studentId);
            // mysql有,redis沒有
            if (student != null) {
                // 把mysql撈到的數據寫入redis
                redisTemplate.opsForValue().set(key,student);
            }
        }
        return student;
    }

    /**
     * BloomFilter -> redis -> mysql
     * 白名單:whites
     */
    public student findStudentByIdWithBloomFilter (Integer studentId) {
        student student = null;

        String key = CACHE_KEY + studentId;

        //布隆過濾器校驗,無是絕對無,有是可能有
        if(!checkWithBloomFilter("whites",key)) {
            log.info("白名單無此顧客信息:{}",key);
            return null;
        }

        //查詢redis
        student = (Student) redisTemplate.opsForValue().get(key);
        //redis沒有,查詢mysql
        if (student == null) {
            student = studentMapper.selectByPrimaryKey(studentId);
            // mysql有,redis沒有
            if (student != null) {
                // 把mysql撈到的數據寫入redis
                redisTemplate.opsForValue().set(key, student);
            }
        }
        return student;
    }

    /**
     * 查詢布隆過濾器中是否存在
     */
    public boolean checkWithBloomFilter(String checkItem,String key) {
        int hashValue = Math.abs(key.hashCode());
        long index = (long) (hashValue % Math.pow(2, 32));
        return redisTemplate.opsForValue().getBit(checkItem, index);
    }
}

六、總結

  1. 有,是可能有;無,是肯定無。
  2. 使用時z,初始化值盡可能滿足實際元素長度,避免擴容。
  3. 當實際元素數量超過初始長度時,應該對布隆過濾器進行重建,再將所有的歷史元素批量添加進去。

本文轉載自微信公眾號「哪吒編程」,可以通過以下二維碼關注。轉載本文請聯系哪吒編程公眾號。

責任編輯:姜華 來源: 哪吒編程
相關推薦

2025-04-30 08:47:41

2020-10-29 07:16:26

布隆過濾器場景

2024-01-05 09:04:35

隆過濾器數據結構哈希函數

2024-11-04 08:45:48

布隆過濾器元數據指紋值

2019-03-22 15:15:25

Redis緩存擊穿雪崩效應

2022-03-21 08:31:07

布隆過濾器Redis過濾器原理

2023-10-30 10:40:29

檢查用戶app注冊數據庫

2024-03-15 11:21:22

布隆過濾器數據庫數據

2024-03-04 10:24:34

布隆過濾器C#代碼

2024-09-18 10:08:37

2025-02-08 17:30:00

布隆過濾器數據結構

2021-03-06 14:41:07

布隆過濾器算法

2023-01-31 08:19:53

二進制元素數量

2025-01-23 00:00:00

Java布隆過濾器

2021-09-03 06:33:24

布隆過濾器高并發

2025-01-22 00:00:00

布隆過濾器二進制

2021-01-11 08:34:16

緩存穿透QPS

2024-09-25 17:44:08

2024-10-09 15:54:38

布隆過濾器函數

2025-02-25 00:11:40

Servlet服務器Web
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区免费在线观看 | 午夜免费福利电影 | 中国黄色在线视频 | 91精品国产乱码麻豆白嫩 | av在线免费看网址 | 日韩成人在线免费观看 | 中文字幕第十五页 | 国产精品视频二区三区 | 午夜激情影院 | 久久久精彩视频 | 天天看逼| 精品国产乱码一区二区三 | 91传媒在线观看 | 亚洲国产情侣 | 亚洲精品成人 | 色视频网站免费 | 久久久精品综合 | 伊人免费观看视频 | 亚洲成人久久久 | 天天插天天搞 | 91精品久久久久久久久久入口 | 国产福利在线视频 | 成人国产精品色哟哟 | 日韩一 | 久久国产精品视频 | 欧美精品一区二区在线观看 | www.99re| 欧美精品一区二区三区在线 | 日韩av在线免费 | 国产精品成人国产乱一区 | 欧美炮房 | 国产精品精品3d动漫 | 亚洲狠狠爱一区二区三区 | 日日操夜夜干 | 一区二区三区在线电影 | 国产一区二区三区在线看 | 国产成人99久久亚洲综合精品 | 一区二区三区日韩 | 永久看片 | 午夜免费福利影院 | 欧美午夜精品 |