1. 程式人生 > 資料庫 >純go語言寫的, 用於資料庫單表多欄位的快取.在高併發讀取下效能是不錯的,是併發安全的.

純go語言寫的, 用於資料庫單表多欄位的快取.在高併發讀取下效能是不錯的,是併發安全的.

資料庫中表資料快取在記憶體中,加快讀取速度,並減少資料庫操作.

用的go語言自帶的(sync.Map)執行緒安全的.(sync.Map)的讀效能相當不錯.可以和redis相當.只是寫場景比redis慢一點.但對大量讀,少量寫場景還是非常適合.

如果用於工程,還需要增加和修改部份,可以把快取與資料庫同步改為管道,非同步處理.減少突發併發量大的情況,減少對資料庫的影響.增加日誌處理.

目前只實現支援主鍵為一個,主鍵和各列為字串的快取.
目前在程式中: 更新,刪除和插入是先更新快取,再更新資料庫.

具體程式碼在github上.

連結:https://github.com/jiang-ting-hua/dbcache

.

//以下是使用方法.

//一. 要先配置 config.conf (配置連線資料庫)和 tables.conf (配置需要快取的表)和這二個檔案.
//二. 測試資料: users.sql這個有建表結構和資料.目前只在mysql上測試了的.其它資料庫可以修改.

//連線資料庫
db,err := dbcache.ConnectDB()
if err != nil {
	fmt.Println(err)
	return
}
defer db.Close()

//初始化資料
rowNum,err := dbcache.InitCache(db)
if err != nil {
	fmt.Println(err)
	return
}
fmt.Println("快取總行數:",rowNum)

//GetRow:根據主鍵,取得該行資料
result,err := dbcache.GetRow("2A7420SW66C5TJC02A77")
if err != nil {
	fmt.Println(err)
}
for k,v := range result{
	fmt.Println("根據主鍵,取得該行資料:",k,v)
}

//GetColumn:根據主鍵,取得某列的資料
v,err := dbcache.GetColumn("2A7420SW66C5TJC02A77","name")
if err != nil {
	fmt.Println(err)
}
fmt.Println("根據主鍵,取得某列的資料:",v)

//DelRow:根據主鍵,刪除該行資料
n,err := dbcache.DelRow("294SKHRA7548PXFFTTLJ")
if err != nil {
	fmt.Println(err)
}
fmt.Println("刪除資料:",n)

//GetWhere:根據where條件,查詢快取中所有符合條件的行.
var value []map[string]string
//value,_ = dbcache.GetWhere("name=AFA5Y9FB and password=Q80BJT")
value,_ = dbcache.GetWhere("name=李明 or name=AFA5Y9FB")
fmt.Println("根據where條件,查詢快取中所有符合條件的行.")
for _,c := range value {
	for k,v := range c {
		fmt.Println(k,v)
	}
}

//UpdateColumn:根據主鍵,更新一列
i,err := dbcache.UpdateColumn("2A7420SW66C5TJC02A77","name","李明")
if err != nil {
	fmt.Println(err)
}
println("根據主鍵,更新一列",i)

//UpdateColumns:根據主鍵,更新多列
n,err = dbcache.UpdateColumns("2A7420SW66C5TJC02A77","name=李平,address= 重慶")
	if err != nil {
	fmt.Println(err)
}
fmt.Println("UpdateColumns 更新列資料",n)

//InsertRow:插入一行資料
n,err = dbcache.InsertRow("uid=21111111,name=jth,address=重慶,password=888888")
	if err != nil {
	fmt.Println(err)
}
fmt.Println("InsertRow 更新列資料",n)