久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

怎么在MySQL和Redis中實現二級緩存

140次閱讀
沒有評論

共計 3313 個字符,預計需要花費 9 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這期內容當中丸趣 TV 小編將會給大家帶來有關怎么在 MySQL 和 Redis 中實現二級緩存,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

redis 簡介

Redis 是完全開源免費的,遵守 BSD 協議,是一個高性能的 key-value 數據庫

Redis 與其他 key – value 緩存產品有以下三個特點:

Redis 支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用

Redis 不僅僅支持簡單的 key-value 類型的數據,同時還提供 list,set,zset,hash 等數據結構的存儲

Redis 支持數據的備份,即 master-slave 模式的數據備份

優勢

性能極高 – Redis 能讀的速度是 110000 次 /s, 寫的速度是 81000 次 /s

豐富的數據類型 – Redis 支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作

原子 – Redis 的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過 MULTI 和 EXEC 指令包起來

下載與安裝

下載并解壓縮

wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz

將文件夾移動到 /usr/local/ 中

mv redis-5.0.3 /usr/local/

進入到文件夾中并編譯測試

cd /usr/local/redis-5.0.3
sudo make test

編譯安裝

sudo make install

啟動 redis

redis-server

mysql 與 redis 做二級緩存

對于訪問量比較大的數據我們為了能夠更快的獲取到數據需要對數據庫中獲取的數據進行數據緩存。

在項目當中使用 Redis 緩存流程

查詢時先從緩存當中查詢

緩存當中如果沒有數據再從數據庫查詢,并將數據保存進緩存當中

如果緩存中查詢到了數據直接返回,不再需要查詢數據庫

數據緩存應該考慮同步問題:如果對數據進行了緩存,當查詢數據時,如果緩存中有數據則直接返回緩存數據不會查詢數據庫,當數據庫數據改變的時候就有可能出現數據庫不一致的問題。可以考慮在每次修改數據庫的時候同時將對應的緩存數據刪除,這樣重新查詢的時候就會查詢數據庫并緩存

步驟實現

創建 redisPool.go 文件用于連接池的初始化

package redigo_pool
import (
  flag 
  github.com/garyburd/redigo/redis 
  time 
var (
 Pool *redis.Pool
 RedisServer = flag.String(redisServer ,  :6379 , )
 
func init() {
 Pool =  redis.Pool{
 MaxIdle: 3, // 最大空閑鏈接數,表示即使沒有 redis 鏈接事依然可以保持 N 個空閑鏈接,而不被清除
 MaxActive: 3, // 最大激活連接數,表示同時最多有多少個鏈接
 IdleTimeout: 240 * time.Second,// 最大空閑鏈接等待時間,超過此時間,空閑將被關閉
 Dial: func() (redis.Conn, error) { c, err := redis.Dial( tcp , *RedisServer)
 if err != nil {
 return nil, err
 }
 return c, err
 },
 TestOnBorrow: func(c redis.Conn, t time.Time) error { if time.Since(t)   time.Minute {
 return nil
 }
 _, err := c.Do(PING)
 return err
 },
 }
}

創建 main.go 文件實現二級緩存

package main
import (
  database/sql 
  encoding/json 
  fmt 
  github.com/garyburd/redigo/redis 
 _  github.com/go-sql-driver/mysql 
  strconv 
  web/redis/redigo_pool 
 _  web/redis/redigo_pool 
type Person struct {
 Id int `db: id `
 Name string `db: name `
 Age int `db: age `
 Rmb int `db: rmb `
func main() {
 var cmd string
 for{ fmt.Println( 輸入命令)
 fmt.Scan(cmd)
 switch cmd {
 case  getall :
 getAll()
 default:
 fmt.Println(不能識別其他命令)
 }
 fmt.Println()
 }
func getAll() {
 // 從連接池當中獲取鏈接
 conn := redigo_pool.Pool.Get()
 // 先查看 redis 中是否有數據
 //conn,_ :=redis.Dial(tcp , localhost:6379)
 defer conn.Close()
 values, _ := redis.Values(conn.Do( lrange ,  mlist ,0,-1))
 if len(values)   0 {
 // 如果有數據
 fmt.Println(從 redis 獲取數據)
 // 從 redis 中直接獲取
 for _,key := range values{ pid :=string(key.([]byte))
 id ,_:= strconv.Atoi(pid)
 results,_ := redis.Bytes(conn.Do( GET ,id))
 var p Person
 err := json.Unmarshal(results, p)
 if err != nil { fmt.Println( json  反序列化出錯)
 }else { fmt.Printf( name = %s\n ,p.Name)
 }
 }
 }else { fmt.Println( 從 mysql 中獲取)
 // 查詢數據庫
 db,_ := sql.Open(mysql , root:Szt930708@tcp(localhost:3306)/mydb )
 defer db.Close()
 var persons []Person
 rows,_ := db.Query(select id,name,age,rmb from person)
 for rows.Next() {
 var id int
 var name string
 var age int
 var rmb int
 rows.Scan(id, name, age, rmb)
 per := Person{id,name,age,rmb}
 persons = append(persons,per)
 }
 // 寫入到 redis 中: 將 person 以 hash 的方式寫入到 redis 中
 for _,p := range persons{ p_byte,_ := json.Marshal(p)
 _,err1 := conn.Do(SETNX ,p.Id,p_byte)
 _,err2 := conn.Do(lpush , mlist ,p.Id)
 //  設置過期時間
 conn.Do(EXPIRE ,p.Id,60*5)
 if err1 != nil || err2 != nil { fmt.Println( 寫入失敗)
 }else { fmt.Println( 寫入成功)
 }
 }
 conn.Do(EXPIRE , mlist ,60*5)
 }
}

上述就是丸趣 TV 小編為大家分享的怎么在 MySQL 和 Redis 中實現二級緩存了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注丸趣 TV 行業資訊頻道。

向 AI 問一下細節

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-12-04發表,共計3313字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 威远县| 克什克腾旗| 台南县| 潼南县| 陇南市| 丹阳市| 望城县| 钟祥市| 融水| 时尚| 揭东县| 新河县| 锦屏县| 翁源县| 融水| 忻州市| 开远市| 丰镇市| 蓬溪县| 英吉沙县| 高唐县| 施甸县| 海口市| 拉孜县| 清涧县| 华安县| 江永县| 成安县| 武山县| 太谷县| 唐山市| 浦城县| 多伦县| 克拉玛依市| 柏乡县| 麻江县| 泗阳县| 施秉县| 多伦县| 青川县| 玉田县|