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 相关文章推荐
Go各时间字符串使用解析
Apr 02 Golang
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
为什么不建议在go项目中使用init()
Apr 12 Golang
golang slice元素去重操作
Apr 30 Golang
golang 实现Location跳转方式
May 02 Golang
Golang实现AES对称加密的过程详解
May 20 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Go归并排序算法的实现方法
Apr 06 Golang
golang的文件创建及读写操作
Apr 14 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Go语言测试库testify使用学习
Jul 23 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
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
基于jquery实现发送文章到手机的代码
2014/12/26 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
2015/04/12 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
原生JavaScript实现的无缝滚动功能详解
2020/01/17 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
Django框架中方法的访问和查找
2015/07/15 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python使用turtle绘制分形树
2018/06/22 Python
python队列Queue的详解
2019/05/10 Python
Python3 批量扫描端口的例子
2019/07/25 Python
Keras搭建自编码器操作
2020/07/03 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
美国牛仔品牌:True Religion
2018/11/16 全球购物
电子商务个人自荐信
2013/12/12 职场文书
简历上的自我评价怎么写
2014/01/28 职场文书
中医学专业自荐信范文
2014/04/01 职场文书
租房协议书范文
2014/08/20 职场文书
社区活动总结
2015/02/04 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB