娱乐
当前位置:首页 >> 娱乐 >> 文章正文

Go理应若何完成二级缓存

发布时间:2026-07-20 19:24:52点击:8581

1 、若何需求

  • 完成二级缓存
  • 法度圭表类型运转起来后提示 :“请输进呼唤:”,完成假定输进getall,若何查询并展示全数人员的完成信息
  • 第一次时查询mysql并将下场缓存在redis ,设置60秒的若何过不时分
  • 往后的每次查询,假定redis罕有据就从redis加载 ,完成没有则几回上一步的若何独霸

2、完成邻接Mysql并奉行查询语句

先完成需求二,完成当输进呼唤getall时,若何查询并展示全数人员的完成信息 。

package main​import (    "fmt"    _"github.com/go-sql-driver/mysql"    "github.com/jmoiron/sqlx")​type Human struct {     Name string `db:"name"`    Age int `db:"age"`}func main() {     var cmd string    for{         fmt.Println("请输进呼唤:")        fmt.Scan(&cmd)​        switch cmd{         case "getall":            //展示全数人的若何信息            GetAllPeople()        case "exit":            //介入法度圭表类型            goto GAMEOVER        default:            fmt.Println("输进的呼唤有误,请从头输进!完成")        }    }    GAMEOVER:    fmt.Println("GAME OVER")​}​func GetAllPeople()  {     fmt.Println("allPeople")    //先考验考验拿缓存    GetPeopleFromRedis()    db,若何 _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")    defer db.Close()​    var people []Human    err := db.Select(&people, "select name,age from person")    if err!=nil{         fmt.Println("查询损掉落踪落败!err=",err)    }    fmt.Println(people)        CachePeople2Redis(people)}

第一步仍是导包 ,需求在mysql驱动包后面加凹凸划线_ ,完成因为它只是若何一个驱动文件,真实不须要在代码中调用它的有关API接口.
接上往的这个筹划体中后背的db:"name" db:"age"必定要加反单引号 ,不然运转时会报错 。(傻傻的编者刚最早这里就展示问题啦~)

type Human struct {     Name string `db:"name"`    Age int `db:"age"`}

然后main函数里面都是一些根本语法常识,用了switch和goto这两个内容  。
接上往就是邻接数据库了 ,这里要用到数据库扩大年夜大年夜大年夜大年夜包Sqlx,Sqlx包真实最除夜最除夜的益处是在查询方面,也就是独霸select时优化得斗劲好。比本来的独霸查询利便了不止一点 。

db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")

driverName:mysql,展示驱动器的称号是mysql也就上面"github.com/go-sql-driver/mysql"导进的驱动器  。
dataSourceName是root:123456@tcp(localhost:3306)/mydb 它的含义是 账户名:暗码@tcp(ip:端口)/数据库称号。
将缓存查询下场到Redis,就是经由过程这个函数CachePeople2Redis(people)  。

3 、写一个偏向措置函数

func HandleError(err error,why string)  {     if err != nil{         fmt.Println(err,why)        os.Exit(1)    }}

因为后背需求措置良多偏向 ,而偏向措置也是GO的一个特点,所以我们这先写一个偏向措置函数 。

4 、设置二级缓存

func CachePeople2Redis(people []Human)  {     conn, _ := redis.Dial("tcp", "localhost:6379")    defer conn.Close()    for _,human := range people{         humanStr := fmt.Sprint(human)        _, err := conn.Do("rpush", "people", humanStr)        if err != nil{             fmt.Println("缓存损掉落踪落败(rpush people),err=",err)            return        }    }    _, err := conn.Do("expire", "people", 66)    if err!=nil{         HandleError(err,"@expire people 60")    }    fmt.Println("缓存成功
!")}

redis.Dial()这个函数是用来邻接redis的,需求给定群集和谈和IP地址及端标语 ,redis的端标语默许为6379.
defer conn.Close()展示延时停止与redis的邻接 ,为了俭仆琐细的io成本 ,需务及时封锁邻接 !刚进门时我们很随便遗忘这个 ,需求我们养成习惯!
conn.Do()是用来奉行数据库呼唤的,第一个参数是呼唤名 ,后背的参数是数据库呼唤的参数。它前去的下场中reply是字节数组[]byte圭表类型,需求屈就具体的营业圭表类型举办数据圭表类型转换  。
这段代码先将people数组中的每个human放进到redis的people列表中。然后再奉行expire呼唤 ,将列表设置过不时分。
奉行成功!上面是运转下场 :

请输进呼唤:
getall
allPeople
[{ 除夜扬 21} { 小飞 21} { 除夜红袍 1} { 小芳 18}]
缓存成功 !
请输进呼唤:

然后往看看数据库里面存进往没有。

127.0.0.1:6379> lrange people 0 -11) "{ \xe5\xa4\xa7\xe6\x89\xac 21}"2) "{ \xe5\xb0\x8f\xe9\xa3\x9e 21}"3) "{ \xe5\xa4\xa7\xe7\xba\xa2\xe8\xa2\x8d 1}"4) "{ \xe5\xb0\x8f\xe8\x8a\xb3 18}"

过了一分钟此后 ,再搜检redis数据库内的数据。

127.0.0.1:6379> lrange people 0 -1(empty list or set)

已磨灭踪踪踪了。

再写一个函数:

func GetPeopleFromRedis() (peopleStrs []string) {     //连数据库     conn, _ := redis.Dial("tcp", "localhost:6379")    //迟误封锁    defer conn.Close()    //奉行呼唤    reply, err := conn.Do("lrange", "people", 0, -1)    //措置偏向    HandleError(err,"@lrange people 0 -1")    //圭表类型转换    peopleStrs, err = redis.Strings(reply, err)    //打印下场    fmt.Println("缓存拿取下场
:",peopleStrs,err)    return}

假定redis里面有就不须要从mysql里面取数据了  。直接从redis里面独霸lrange呼唤来掉落踪掉落踪people的全数值 。

到此这篇

1  、需求

  • 完成二级缓存
  • 法度圭表类型运转起来后提示  :“请输进呼唤 :” ,假定输进getall,查询并展示全数人员的信息
  • 第一次时查询mysql并将下场缓存在redis ,设置60秒的过不时分
  • 往后的每次查询 ,假定redis罕有据就从redis加载 ,没有则几回上一步的独霸

2  、完成邻接Mysql并奉行查询语句

先完成需求二,当输进呼唤getall时,查询并展示全数人员的信息 。

package main​import (    "fmt"    _"github.com/go-sql-driver/mysql"    "github.com/jmoiron/sqlx")​type Human struct {     Name string `db:"name"`    Age int `db:"age"`}func main() {     var cmd string    for{         fmt.Println("请输进呼唤:")        fmt.Scan(&cmd)​        switch cmd{         case "getall":            //展示全数人的信息            GetAllPeople()        case "exit":            //介入法度圭表类型            goto GAMEOVER        default:            fmt.Println("输进的呼唤有误,请从头输进!")        }    }    GAMEOVER:    fmt.Println("GAME OVER")​}​func GetAllPeople()  {     fmt.Println("allPeople")    //先考验考验拿缓存    GetPeopleFromRedis()    db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")    defer db.Close()​    var people []Human    err := db.Select(&people, "select name,age from person")    if err!=nil{         fmt.Println("查询损掉落踪落败!err=",err)    }    fmt.Println(people)        CachePeople2Redis(people)}

第一步仍是导包,需求在mysql驱动包后面加凹凸划线_ ,因为它只是一个驱动文件,真实不须要在代码中调用它的有关API接口.
接上往的这个筹划体中后背的db:"name" db:"age"必定要加反单引号,不然运转时会报错 。(傻傻的编者刚最早这里就展示问题啦~)

type Human struct {     Name string `db:"name"`    Age int `db:"age"`}

然后main函数里面都是一些根本语法常识  ,用了switch和goto这两个内容 。
接上往就是邻接数据库了,这里要用到数据库扩大年夜大年夜大年夜大年夜包Sqlx,Sqlx包真实最除夜最除夜的益处是在查询方面 ,也就是独霸select时优化得斗劲好 。比本来的独霸查询利便了不止一点。

db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")

driverName:mysql,展示驱动器的称号是mysql也就上面"github.com/go-sql-driver/mysql"导进的驱动器。
dataSourceName是root:123456@tcp(localhost:3306)/mydb 它的含义是 账户名:暗码@tcp(ip:端口)/数据库称号 。
将缓存查询下场到Redis,就是经由过程这个函数CachePeople2Redis(people) 。

3、写一个偏向措置函数

func HandleError(err error,why string)  {     if err != nil{         fmt.Println(err,why)        os.Exit(1)    }}

因为后背需求措置良多偏向,而偏向措置也是GO的一个特点,所以我们这先写一个偏向措置函数 。

4、设置二级缓存

func CachePeople2Redis(people []Human)  {     conn, _ := redis.Dial("tcp", "localhost:6379")    defer conn.Close()    for _,human := range people{         humanStr := fmt.Sprint(human)        _, err := conn.Do("rpush", "people", humanStr)        if err != nil{             fmt.Println("缓存损掉落踪落败(rpush people),err=",err)            return        }    }    _, err := conn.Do("expire", "people", 66)    if err!=nil{         HandleError(err,"@expire people 60")    }    fmt.Println("缓存成功
!")}

redis.Dial()这个函数是用来邻接redis的 ,需求给定群集和谈和IP地址及端标语 ,redis的端标语默许为6379.
defer conn.Close()展示延时停止与redis的邻接  ,为了俭仆琐细的io成本,需务及时封锁邻接!刚进门时我们很随便遗忘这个,需求我们养成习惯!
conn.Do()是用来奉行数据库呼唤的 ,第一个参数是呼唤名,后背的参数是数据库呼唤的参数。它前去的下场中reply是字节数组[]byte圭表类型 ,需求屈就具体的营业圭表类型举办数据圭表类型转换。
这段代码先将people数组中的每个human放进到redis的people列表中。然后再奉行expire呼唤 ,将列表设置过不时分 。
奉行成功 !上面是运转下场 :

请输进呼唤 :
getall
allPeople
[{ 除夜扬 21} { 小飞 21} { 除夜红袍 1} { 小芳 18}]
缓存成功!
请输进呼唤 :

然后往看看数据库里面存进往没有。

127.0.0.1:6379> lrange people 0 -11) "{ \xe5\xa4\xa7\xe6\x89\xac 21}"2) "{ \xe5\xb0\x8f\xe9\xa3\x9e 21}"3) "{ \xe5\xa4\xa7\xe7\xba\xa2\xe8\xa2\x8d 1}"4) "{ \xe5\xb0\x8f\xe8\x8a\xb3 18}"

过了一分钟此后  ,再搜检redis数据库内的数据 。

127.0.0.1:6379> lrange people 0 -1(empty list or set)

已磨灭踪踪踪了。

再写一个函数:

func GetPeopleFromRedis() (peopleStrs []string) {     //连数据库     conn, _ := redis.Dial("tcp", "localhost:6379")    //迟误封锁    defer conn.Close()    //奉行呼唤    reply, err := conn.Do("lrange", "people", 0, -1)    //措置偏向    HandleError(err,"@lrange people 0 -1")    //圭表类型转换    peopleStrs, err = redis.Strings(reply, err)    //打印下场    fmt.Println("缓存拿取下场:",peopleStrs,err)    return}

假定redis里面有就不须要从mysql里面取数据了。直接从redis里面独霸lrange呼唤来掉落踪掉落踪people的全数值 。

到此这篇Go言语

相关装修文章Related Articles

热门阅读文章

最新装修文章