今天七夕節了,不知道大家過的是甜甜蜜蜜還是水深火熱呀,已婚老男人不配過七夕,只能默默的蹲在電腦前敲敲代碼,寫寫檔案,這不,趁著公司下午放假的功夫,我也整理了一下關于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 hash1 = hash(key);
long hash2 = hash1 >>> 16;
long[] result = new long[numHashFunctions];
for (int i = 0; i < numHashFunctions; i++) {
long combinedHash = hash1 + i * hash2;
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去后臺獲取資料,但是,這種情況,你不能通過布隆過濾器然后去不放過一個吧,那該怎么辦呢?鎖住他唄!
可能這幾張圖這么看有那么一點點的模糊,個人還有日常作業,也就沒有完整的整理形成檔案,就以圖片和簡單的文字進行了簡述,
想要完整學習視頻的相應的原始碼還有視頻以及檔案資料,已經整理好了
相應的文章已經整理形成檔案,需要的朋友,git掃碼獲取資料看這里
https://gitee.com/biwangsheng/personal.git
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/51249.html
標籤:Java
下一篇:Java 拆分 PDF 檔案
