GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结


Posted in Golang onJune 14, 2022

上一篇文章为大家介绍了 GoFrame gcache使用实践 | 缓存控制 淘汰策略 ,得到了大家积极的反馈。

后续几篇文章再接再厉,仍然为大家介绍GoFrame框架缓存相关的知识点,以及自己项目使用中的一些总结思考,GoFrame框架下文简称gf。

这篇文章比较硬核,爆肝2千字,阅读大约需要5~8分钟。

详细的介绍了gredis的使用,包括:Do/DoVar方法的使用及区别、复杂场景下使用Conn方法从连接池中获取一个redis连接对象、当给定的参数为mapslicestruct时,gredis内部支持自动对其使用json序列化,并且读取数据时可使用gvar.Var的转换功能实现反序列化。

GoFrame gredis

整体介绍

Redis客户端由gredis模块实现,底层采用了链接池设计。

gredis使用了连接池来进行Redis连接管理,通过Config配置对象或者Set*方法可以对连接池的属性进行管理,通过Stats方法可以获取连接池的统计信息。

我们最常用的是Do/DoVar方法,执行同步指令,通过向Redis Server发送对应的Redis API命令,来使用Redis Server的服务。Do/Var方法最大的特点是内部自行从连接池中获取连接对象,使用完毕后自动丢回连接池中,开发者无需手动调用Close方法,方便使用。

Do/DoVar方法

我们最常用的是Do/DoVar方法,执行同步指令,通过向Redis Server发送对应的Redis API命令,来使用Redis Server的服务。

Do/Var方法最大的特点是内部自行从连接池中获取连接对象,使用完毕后自动丢回连接池中,开发者无需手动调用Close方法,方便使用。

小技巧

DoDoVar的区别在于返回的结果类型不一样,DoVar返回的是gvar.Var类型,该类型对象可以执行非常方便的类型转换。

gvar.Var类型 就像go原生提供的interface一样

基本使用

package main

import (
	"fmt"
	"github.com/gogf/gf/frame/g"
)

func main() {
	g.Redis().Do("SET", "k", "v")
	v, _ := g.Redis().DoVar("GET", "k")
	fmt.Println(v.String())
}
复制代码

HSET/HGETALL操作

Hset 命令用于为哈希表中的字段赋值 。

如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

如果字段已经存在于哈希表中,旧值将被覆盖。

package main

import (
	"fmt"
	"github.com/gogf/gf/container/gvar"
	"github.com/gogf/gf/frame/g"
)

func main() {
	var (
		err    error
		result *gvar.Var
		key    = "user"
	)
	_, err = g.Redis().Do("HSET", key, "id", 10000)
	if err != nil {
		panic(err)
	}
	_, err = g.Redis().Do("HSET", key, "name", "王中阳")
	if err != nil {
		panic(err)
	}
	result, err = g.Redis().DoVar("HGETALL", key)
	if err != nil {
		panic(err)
	}
	fmt.Println(result.Map()) //打印结果: map[id:10000 name:王中阳]
}
复制代码

HMSET/HMGET操作

强烈推荐,非常好用:我们可以通过map参数执行HMSET操作。

package main

import (
	"fmt"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gutil"
)

func main() {
	var (
		key  = "user_100"
		data = g.Map{
			"name":  "王中阳",
			"sex":   0,
			"score": 100,
		}
	)
	_, err := g.Redis().Do("HMSET", append(g.Slice{key}, gutil.MapToSlice(data)...)...)
	if err != nil {
		g.Log().Fatal(err)
	}
	v, err := g.Redis().DoVar("HMGET", key, "name")
	if err != nil {
		g.Log().Fatal(err)
	}
	fmt.Println(v.Slice())  //打印结果 [王中阳]
}
复制代码

我们也可以通过struct参数执行HMSET操作。

package main

import (
	"fmt"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/util/gutil"
)

func main() {
	type User struct {
		Name  string `json:"name"`
		Sex   int    `json:"sex"`
		Score int    `json:"score"`
	}
	var (
		key  = "user_100"
		data = &User{
			Name:  "王中阳",
			Sex:   0,
			Score: 100,
		}
	)
	_, err := g.Redis().Do("HMSET", append(g.Slice{key}, gutil.StructToSlice(data)...)...)
	if err != nil {
		g.Log().Fatal(err)
	}
	v, err := g.Redis().DoVar("HMGET", key, "name")
	if err != nil {
		g.Log().Fatal(err)
	}
	fmt.Println(v.Slice()) //打印结果: [王中阳]
}
复制代码

Conn连接对象

使用Do/DoVar方法已经能够满足绝大部分的场景需要,如果需要更复杂的Redis操作,我们可以使用Conn方法从连接池中获取一个连接对象,随后使用该连接对象进行操作。

需要注意的是,该连接对象不再使用时,应当显式调用Close方法进行关闭(丢回连接池)。

由于该Conn是个连接对象,注意该对象存在连接超时的限制,超时和服务端配置有关。

基本使用

package main

import (
    "fmt"
    "github.com/gogf/gf/frame/g"
    "github.com/gogf/gf/util/gconv"
)

func main() {
    conn := g.Redis().Conn()
    defer conn.Close()
    conn.Do("SET", "k", "v")
    v, _ := conn.Do("GET", "k")
    fmt.Println(gconv.String(v)) //打印结果:v
}
复制代码

Send批量指令

Send可以执行批量指令,并通过Receive方法一一获取返回结果。

package main

import (
    "fmt"
    "github.com/gogf/gf/frame/g"
    "github.com/gogf/gf/util/gconv"
)

func main() {
    conn := g.Redis().Conn()
    defer conn.Close()
    conn.Send("SET", "foo", "bar")
    conn.Send("GET", "foo")
    conn.Flush()
    // reply from SET
    conn.Receive()
    // reply from GET
    v, _ := conn.Receive()
    fmt.Println(gconv.String(v))  //打印结果:bar
}
复制代码

订阅/发布

我们可以通过RedisSUBSCRIBE/PUBLISH命令实现订阅/发布模式。

package main

import (
    "fmt"
    "github.com/gogf/gf/frame/g"
    "github.com/gogf/gf/util/gconv"
)

func main() {
    conn := g.Redis().Conn()
    defer conn.Close()
    _, err := conn.Do("SUBSCRIBE", "channel")
    if err != nil {
        panic(err)
    }
    for {
        reply, err := conn.Receive()
        if err != nil {
            panic(err)
        }
        fmt.Println(gconv.Strings(reply))
    }
}
复制代码

执行后,程序将阻塞等待获取数据。

另外打开一个终端通过redis-cli命令进入Redis Server,发布一条消息:

$ redis-cli
127.0.0.1:6379> publish channel test
(integer) 1
127.0.0.1:6379>
复制代码

随后程序终端立即打印出从Redis Server获取的数据:

[message channel test]
复制代码

自动序列化/反序列化

当给定的参数为mapslicestruct时,gredis内部支持自动对其使用json序列化,并且读取数据时可使用gvar.Var的转换功能实现反序列化。

map存取

package test

import (
   "fmt"
   "github.com/gogf/gf/container/gvar"
   "github.com/gogf/gf/frame/g"
)

func Run1() {
   var (
      err    error
      result *gvar.Var
      key    = "test_user"
      data   = g.Map{
         "id":   7,
         "name": "王中阳",
      }
   )
   _, err = g.Redis().Do("SET", key, data)
   if err != nil {
      panic(err)
   }
   result, err = g.Redis().DoVar("GET", key)
   if err != nil {
      panic(err)
   }
   fmt.Println("result:", result) //result: {"id":7,"name":"王中阳"}
   fmt.Println("result.Map():", result.Map()) //result.Map(): map[id:7 name:王中阳]
}
复制代码

打印结果

GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结

struct存取

package test

import (
   "fmt"
   "github.com/gogf/gf/container/gvar"
   "github.com/gogf/gf/frame/g"
)

func Run1() {
   type User struct {
      Id   int
      Name string
   }
   var (
      err    error
      result *gvar.Var
      key    = "test_user"
      user   = &User{
         Id:   007,
         Name: "王中阳",
      }
   )

   _, err = g.Redis().Do("SET", key, user)
   if err != nil {
      panic(err)
   }
   result, err = g.Redis().DoVar("GET", key)
   if err != nil {
      panic(err)
   }

   var user2 *User
   if err = result.Struct(&user2); err != nil {
      panic(err)
   }
   fmt.Println("user2:", user2) //user2: &{7 王中阳}
   fmt.Printf("id:%v, name:%v \n", user2.Id, user2.Name) //id:7, name:王中阳
}
复制代码

打印结果

GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结

总结

这篇文章比较硬核,爆肝2千字。

详细的介绍了gredis的使用,包括:Do/DoVar方法的使用及区别、复杂场景下使用Conn方法从连接池中获取一个redis连接对象、当给定的参数为mapslicestruct时,gredis内部支持自动对其使用json序列化,并且读取数据时可使用gvar.Var的转换功能实现反序列化。

以上就是GoFrame gredis缓存DoVar Conn连接对象 自动序列化的详细内容,更多关于GoFrame gredis DoVar Conn连接对象 自动序列化的资料请关注三水点靠木其它相关文章!


Tags in this post...

Golang 相关文章推荐
golang 实现两个结构体复制字段
Apr 28 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 Golang
Go调用Rust方法及外部函数接口前置
详解Go语言中配置文件使用与日志配置
Jun 01 #Golang
详解Go语言中Get/Post请求测试
Golang实现可重入锁的示例代码
May 25 #Golang
Go web入门Go pongo2模板引擎
May 20 #Golang
Go语言入门exec的基本使用
May 20 #Golang
Golang并发工具Singleflight
May 06 #Golang
You might like
自己做矿石收音机
2021/03/02 无线电
SONY ICF-SW55的电路分析
2021/03/02 无线电
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
2017/06/07 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
JS实现的DOM插入节点操作示例
2018/04/04 Javascript
js实现点击按钮复制文本功能
2020/07/20 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
[04:03]2014DOTA2西雅图国际邀请赛 LGD战队巡礼
2014/07/07 DOTA
Python修改MP3文件的方法
2015/06/15 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
Pytorch实现神经网络的分类方式
2020/01/08 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
司机岗位职责
2013/11/15 职场文书
公司道歉信范文
2014/01/09 职场文书
上课打牌的检讨书
2014/02/15 职场文书
保护动物倡议书
2014/04/15 职场文书
环卫个人总结
2015/03/03 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
会议主持词结束语
2015/07/03 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS
python基础之函数的定义和调用
2021/10/24 Python