91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解redis布隆算法實現+鎖

發布時間:2021-11-15 15:41:53 來源:億速云 閱讀:137 作者:柒染 欄目:大數據

今天就跟大家聊聊有關如何理解redis布隆算法實現+鎖,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

今天七夕節了,不知道大家過的是甜甜蜜蜜還是水深火熱呀,已婚老男人不配過七夕,只能默默的蹲在電腦前敲敲代碼,寫寫文檔,這不,趁著公司下午放假的功夫,我也整理了一下關于Redis的布隆過濾器和鎖的相關知識。

如何理解redis布隆算法實現+鎖

簡單一點,對于互聯網開發,我們從單機到多機一直到微服務,隨著數據量的增多,對于數據庫的壓力也隨之增大,這個時候,勤勞的程序員們,將數據分為冷數據和熱點數據,然后把熱點數據存儲在緩存中,提升查詢效率并且減輕數據庫的壓力,但是,這是理想環境,畢竟互聯網沒有想象中的那么平靜

比方說下面這種情況

如何理解redis布隆算法實現+鎖

黑客,一個讓程序員向往但是又讓安全部門感到頭疼的人群,當上面的場景:有大量不同的key獲取后臺數據的時候該怎么處理,

在這個時候,我就不得不吹捧一波老祖宗的智慧,寧可錯殺三千,絕不放過一個的純真理念,從而產生了神奇的布隆過濾器,那布隆過濾器是怎么一個執行流程呢?繼續往下看

布隆過濾器是─個使用錯誤率來換取空間和時間的算法錯誤率主要體現在:他說數據存在,那么不一定存在不存在,一定不存在

如何理解redis布隆算法實現+鎖

代碼只展示部分吧,因為完整展現太多了,沒得辦法

/**
     * 判斷keys是否存在于集合where中
     */
    public boolean isExist(String where, String key) {
        long[] indexs = getIndexs(key);
        boolean result;
        //這里使用了Redis管道來降低過濾器運行當中訪問Redis次數 降低Redis并發量
        Pipeline pipeline = jedis.pipelined();
        try {
            for (long index : indexs) {
                pipeline.getbit(where, index);
            }
            result = !pipeline.syncAndReturnAll().contains(false);
        } finally {
            pipeline.close();

        }
//        if (!result) {
//            put(where, key);
//        }
        return result;
    }


    /**
     * 將key存入redis bitmap
     */
    private void put(String where, String key) {
        long[] indexs = getIndexs(key);
        //這里使用了Redis管道來降低過濾器運行當中訪問Redis次數 降低Redis并發量
        Pipeline pipeline = jedis.pipelined();
        try {
            for (long index : indexs) {
                pipeline.setbit(where, index, true);
            }
            pipeline.sync();
            /**
             * 把數據存儲到mysql中
             */
        } finally {
            pipeline.close();
        }
    }




    /**
     *  根據key獲取bitmap下標方法來自guava
     */
    public long[] getIndexs(String key) {
        long hash2 = hash(key);
        long hash3 = hash2 >>> 16;
        long[] result = new long[numHashFunctions];
        for (int i = 0; i < numHashFunctions; i++) {
            long combinedHash = hash2 + i * hash3;
            if (combinedHash < 0) {
                combinedHash = ~combinedHash;
            }
            result[i] = combinedHash % numBits;
        }
        return result;
    }

    /**
     * 獲取一個hash值 方法來自guava
     */
    private long hash(String key) {
        Charset charset = Charset.forName("UTF-8");
        return Hashing.murmur3_128().hashObject(key, Funnels.stringFunnel(charset)).asLong();
    }


    private static int optimalNumOfHashFunctions(long n, long m) {
        return Math.max(1, (int) Math.round((double) m / n * Math.log(2)));
    }

當然了,出現這種情況也不是只有黑客攻擊,還有一種,我想很多人都參與過,它叫做限時秒殺,比如淘寶雙十一,這個時候會造成的一種情況是大量的客戶端拿著相同的Key去后臺獲取數據,但是,這種情況,你不能通過布隆過濾器然后去不放過一個吧,那該怎么辦呢?鎖住他唄!

如何理解redis布隆算法實現+鎖

可能這幾張圖這么看有那么一點點的模糊,個人還有日常工作,也就沒有完整的整理形成文檔,就以圖片和簡單的文字進行了簡述。

看完上述內容,你們對如何理解redis布隆算法實現+鎖有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌什县| 平度市| 连州市| 太谷县| 漳平市| 定州市| 吉木乃县| 庐江县| 泰州市| 榆社县| 永福县| 通化县| 湄潭县| 阳高县| 南华县| 清徐县| 嘉善县| 正阳县| 东兰县| 敦煌市| 桓仁| 涟水县| 湖州市| 如东县| 江都市| 原平市| 吉木乃县| 周至县| 东兴市| 遵义市| 鱼台县| 南丹县| 横峰县| 行唐县| 铜川市| 华安县| 新闻| 济源市| 奎屯市| 平南县| 凉城县|