您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何理解redis布隆算法實現+鎖,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
今天七夕節了,不知道大家過的是甜甜蜜蜜還是水深火熱呀,已婚老男人不配過七夕,只能默默的蹲在電腦前敲敲代碼,寫寫文檔,這不,趁著公司下午放假的功夫,我也整理了一下關于Redis的布隆過濾器和鎖的相關知識。
簡單一點,對于互聯網開發,我們從單機到多機一直到微服務,隨著數據量的增多,對于數據庫的壓力也隨之增大,這個時候,勤勞的程序員們,將數據分為冷數據和熱點數據,然后把熱點數據存儲在緩存中,提升查詢效率并且減輕數據庫的壓力,但是,這是理想環境,畢竟互聯網沒有想象中的那么平靜
比方說下面這種情況
黑客,一個讓程序員向往但是又讓安全部門感到頭疼的人群,當上面的場景:有大量不同的key獲取后臺數據的時候該怎么處理,
在這個時候,我就不得不吹捧一波老祖宗的智慧,寧可錯殺三千,絕不放過一個的純真理念,從而產生了神奇的布隆過濾器,那布隆過濾器是怎么一個執行流程呢?繼續往下看
布隆過濾器是─個使用錯誤率來換取空間和時間的算法錯誤率主要體現在:他說數據存在,那么不一定存在不存在,一定不存在
代碼只展示部分吧,因為完整展現太多了,沒得辦法 /** * 判斷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布隆算法實現+鎖有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。