请选择 进入手机版 | 继续访问电脑版

[Golang] Go应该怎样 实现二级缓存

[复制链接]
查看54 | 回复8 | 2021-9-15 00:57:41 | 显示全部楼层 |阅读模式
目次

一、需求

  • 实现二级缓存
  • 程序运行起来后提示:“请输入下令 :”,假如 输入getall,查询并表现 全部 职员 的信息
  • 第一次时查询mysql并将效果 缓存在redis,设置60秒的过期时间
  • 以后的每次查询,假如 redis有数据就从redis加载,没有则重复上一步的操作

二、实现毗连 Mysql并实验 查询语句

先实现需求二,当输入下令 getall时,查询并表现 全部 职员 的信息。

  1. package main
  2. import (
  3. "fmt"
  4. _"github.com/go-sql-driver/mysql"
  5. "github.com/jmoiron/sqlx"
  6. )
  7. ​type Human struct {
  8. Name string `db:"name"`
  9. Age int `db:"age"`
  10. }func main() {
  11. var cmd string
  12. for{
  13. fmt.Println("请输入命令:")
  14. fmt.Scan(&cmd)
  15. switch cmd{
  16. case "getall":
  17. //显示所有人的信息
  18. GetAllPeople()
  19. case "exit":
  20. //退出程序
  21. goto GAMEOVER
  22. default:
  23. fmt.Println("输入的命令有误,请重新输入!")
  24. }
  25. }
  26. GAMEOVER:
  27. fmt.Println("GAME OVER")
  28. }
  29. func GetAllPeople() {
  30. fmt.Println("allPeople")
  31. //先尝试拿缓存
  32. GetPeopleFromRedis()
  33. db, _ := sqlx.Connect("mysql", "root:123456@tcp(localhost:3306)/mydb")
  34. defer db.Close()
  35. var people []Human
  36. err := db.Select(&people, "select name,age from person")
  37. if err!=nil{
  38. fmt.Println("查询失败!err=",err)
  39. }
  40. fmt.Println(people)
  41. CachePeople2Redis(people)
  42. }
复制代码

第一步还是导包,必要 在mysql驱动包前面加上下划线_,由于 它只是一个驱动文件,并不必要 在代码中调用它的有关API接口.
接下来的这个布局 体中后面的db:"name" db:"age"肯定 要加反单引号,否则运行时会报错。(傻傻的编者刚开始这里就出现题目 啦~)

  1. type Human struct {
  2. Name string `db:"name"`
  3. Age int `db:"age"`
  4. }
复制代码

然后main函数内里 都是一些基本语法知识,用了switch和goto这两个内容。
接下来就是毗连 数据库了,这里要用到数据库扩展包Sqlx,Sqlx包实在 最大最大的长处 是在查询方面,也就是使用 select时优化得比较好。比原来的使用 查询方便了不止一点。

  1. 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)。

三、写一个错误处理函数

  1. func HandleError(err error,why string) {
  2. if err != nil{
  3. fmt.Println(err,why)
  4. os.Exit(1)
  5. }
  6. }
复制代码

由于 后面必要 处理很多错误,而错误处理也是GO的一个特性,以是 我们这先写一个错误处理函数。

四、设置二级缓存

  1. func CachePeople2Redis(people []Human) {
  2. conn, _ := redis.Dial("tcp", "localhost:6379")
  3. defer conn.Close()
  4. for _,human := range people{
  5. humanStr := fmt.Sprint(human)
  6. _, err := conn.Do("rpush", "people", humanStr)
  7. if err != nil{
  8. fmt.Println("缓存失败(rpush people),err=",err)
  9. return
  10. }
  11. }
  12. _, err := conn.Do("expire", "people", 66)
  13. if err!=nil{
  14. HandleError(err,"@expire people 60")
  15. }
  16. fmt.Println("缓存成功!")
  17. }
复制代码

redis.Dial()这个函数是用来毗连 redis的,必要 给定网络协媾和 IP地址及端标语 ,redis的端标语 默以为 6379.
defer conn.Close()表示延时竣事 与redis的毗连 ,为了节省 体系 的io资源,必要 及时关闭毗连 !刚入门时我们很轻易 忘记这个,必要 我们养成风俗 !
conn.Do()是用来实验 数据库下令 的,第一个参数是下令 名,后面的参数是数据库下令 的参数。它返回的效果 中reply是字节数组[]byte范例 ,必要 根据具体 的业务范例 举行 数据范例 转换。
这段代码先将people数组中的每一个human放入到redis的people列表中。然后再实验 expire下令 ,将列表设置过期时间。
实验 成功!下面是运行效果 :

  1. 请输入命令:
  2. getall
  3. allPeople
  4. [{大扬 21} {小飞 21} {大红袍 1} {小芳 18}]
  5. 缓存成功!
  6. 请输入命令:
复制代码

然后去看看数据库内里 存进去没有。

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

过了一分钟之后,再查看redis数据库内的数据。

  1. 127.0.0.1:6379> lrange people 0 -1
  2. (empty list or set)
复制代码

已经消散 了。

再写一个函数:

  1. func GetPeopleFromRedis() (peopleStrs []string) {
  2. //连数据库
  3. conn, _ := redis.Dial("tcp", "localhost:6379")
  4. //延迟关闭
  5. defer conn.Close()
  6. //执行命令
  7. reply, err := conn.Do("lrange", "people", 0, -1)
  8. //处理错误
  9. HandleError(err,"@lrange people 0 -1")
  10. //类型转换
  11. peopleStrs, err = redis.Strings(reply, err)
  12. //打印结果
  13. fmt.Println("缓存拿取结果:",peopleStrs,err)
  14. return
  15. }
复制代码

假如 redis内里 有就不必要 从mysql内里 取数据了。直接从redis内里 使用 lrange下令 来获取people的全部 值。

到此这篇关于Go应该怎样 实现二级缓存的文章就先容 到这了,更多相干 Go 二级缓存内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

avatar 孤客9116 | 2021-9-22 05:59:04 | 显示全部楼层
学习雷锋,好好回帖!
回复

使用道具 举报

avatar 宿命958 | 2021-10-6 05:16:15 | 显示全部楼层
信admin楼主,得永生!
回复

使用道具 举报

avatar 小珍248 | 2021-10-6 21:47:21 | 显示全部楼层
admin楼主又闹绯闻了!
回复

使用道具 举报

avatar 塔米酉 | 2021-10-13 12:32:23 | 显示全部楼层
admin楼主你想太多了!
回复

使用道具 举报

avatar 因醉鞭名马幌 | 2021-10-14 13:07:55 | 显示全部楼层
今天是个特别的日子,值得纪念!
回复

使用道具 举报

avatar 俺乃小潜mg | 2021-10-15 23:05:54 | 显示全部楼层
看帖不回帖都是耍流氓!
回复

使用道具 举报

知识就是力量啊!
回复

使用道具 举报

精神病院在通缉admin楼主!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则