純go語言寫的, 用於資料庫單表多欄位的快取.在高併發讀取下效能是不錯的,是併發安全的.
阿新 • • 發佈:2020-02-07
資料庫中表資料快取在記憶體中,加快讀取速度,並減少資料庫操作.
用的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)