【布隆過濾器的使用】

Bloomfilter

布隆過濾器是一種快速檢索當前詞彙是不是在字典中的一種數據結構。其實就是一個很長的的二進制向量,而且這個檢索具有很大的侷限性,但是對於減緩緩存擊穿有很大的作用
在這裏插入圖片描述
圖片來源:https://juejin.im/post/5cfd060ee51d4556f76e8067。

用處

一般是Redis的緩衝層,數據查詢到來時,首先通過該過濾器過濾,用來最大程度的減輕Redis緩存穿透。

使用Go語言實現

先隨便找個位置,建一個文件夾。進入該文件夾
(1)把源碼包下載下來:

git clone https://github.com/RedisBloom/RedisBloom.git

下載完成以後,會有一個RedisBloom的文件夾,進入該文件夾:

make

編譯源碼之後,就會生成一個.so文件,這個東西,可以理解爲win下的動態鏈接庫,linux是沒有dll文件的,但是有.so
(2)修改配置文件:進入redis所在的文件夾,把redis.conf拷貝一份:

cp redis.conf ./redis2.conf

(3)把剛纔編譯好的東西mv到redis的文件夾內(也可以不mv)
(4)打開剛copy好的redis2.conf,在第44行修改:
在這裏插入圖片描述
把loadmodule這個參數指定爲剛纔生成的.so文件,所以這裏可以省略掉第三步,只要路徑填對就行
(5)啓動Redis(這裏需要指定配置文件 redis-server redis2.conf),如果不寫配置文件,默認讀取的是redis.conf

代碼示例

一個簡單的邏輯,把數據庫中所有的數據拿出來初始化過濾器。

package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)
type people struct {
	ID string `gorm:"type:varchar(20);primary_key"`
	Name string `gorm:"type:varchar(20);"`
}
func main(){
	db, err:=redis.Dial("tcp","127.0.0.1:6379")
	if err!=nil{
		fmt.Println(err)
	}
	dbMySQL, err:= gorm.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/test?charset=utf8")
	defer dbMySQL.Close()
	if err!=nil{
		fmt.Print(err)
		panic("open MySQL error")
	}
	users:=getALL(dbMySQL)
	fmt.Println("當前的人數:",len(users))
	for i:=0;i<len(users);i++{
		e1,e2:=db.Do("bf.add","filter",users[i].ID)
		fmt.Println(e1,e2)
	}
	fmt.Println("bloomMap初始化成功")
	for i:=0;i<100;i++{
		var id string
		fmt.Scan(&id)
		res, _ :=db.Do("bf.exists","filter",id)
		fmt.Println(res)
	}

}
func getALL(db *gorm.DB)([]people){
	users:=[]people{}
	err:=db.Model(&people{}).Find(&users).Error
	if err!=nil{
		fmt.Print("獲取失敗")
		return  nil
	}
	return  users
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章