Skip to content

Latest commit

 

History

History
149 lines (113 loc) · 5.54 KB

09.goframeRedis操作.md

File metadata and controls

149 lines (113 loc) · 5.54 KB

GoFrame Redis操作

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

一、Redis介绍

Redis是当前比较热门的NOSQL系统之一,它是一个开源的使用ANSI c语言编写的key-value存储系统(区别于MySQL的二维表格的形式存储。)。性能出色:Redis读取的速度是110000次/s,写的速度是81000次/s。

支持类型

String: 字符串、Hash: 散列、List: 列表、Set: 集合、Sorted Set: 有序集合

PUB/SUB:发布订阅;

在5.0支持了全新数据类型:Streams

使用场景

缓存,登录验证码,消息队列,过滤器,分布式锁,限流等

二、Redis配置文件

绝大部分情况下推荐使用g.Redis单例方式来操作redis。因此同样推荐使用配置文件来管理Redis配置,在config.yaml中的配置示例如下:

# Redis数据库配置
redis:
  default:
    address: 127.0.0.1:6379
    db: 1
  cache:
    address: 127.0.0.1:6379
    db: 1
    pass: "123456"
    idleTimeout: 600

其中,Redis的配置格式为:host:port[,db,pass?maxIdle=x&maxActive=x&idleTimeout=x&maxConnLifetime=x]

各配置项说明如下:

配置项名称 是否必须 默认值 说明
address - 格式:地址:端口支持Redis单实例模式和集群模式配置,使用,分割多个地址。例如:192.168.1.1:6379, 192.168.1.2:6379
db 0 数据库索引
user - 访问授权用户
pass - 访问授权密码
minIdle 0 允许闲置的最小连接数
maxIdle 10 允许闲置的最大连接数(0表示不限制)
maxActive 100 最大连接数量限制(0表示不限制)
idleTimeout 10 连接最大空闲时间,使用时间字符串例如30s/1m/1d
maxConnLifetime 30 连接最长存活时间,使用时间字符串例如30s/1m/1d
waitTimeout 0 等待连接池连接的超时时间,使用时间字符串例如30s/1m/1d
dialTimeout 0 TCP连接的超时时间,使用时间字符串例如30s/1m/1d
readTimeout 0 TCPRead操作超时时间,使用时间字符串例如30s/1m/1d
writeTimeout 0 TCPWrite操作超时时间,使用时间字符串例如30s/1m/1d
masterName - 哨兵模式下使用, 设置MasterName
tls false 是否使用TLS认证
tlsSkipVerify false 通过TLS连接时,是否禁用服务器名称验证
cluster false 是否强制设置为集群工作模式。当address是单个endpoint的集群时,系统会自动判定为单实例模式,这时需要设置此项为true

其中的defaultcache分别表示配置分组名称,我们在程序中可以通过该名称获取对应配置的redis对象。不传递分组名称时,默认使用redis.default配置分组项)来获取对应配置的redis客户端单例对象。

三、结果处理

可以看到通过客户端gredis模块提供了Get/HGet等方法,用以获取可供方便转换的gvar.Var通用变量结果。

通过gvar.Var的强大转换功能可以转换为任意的数据类型,如基本数据类型Int,String,Strings,或者结构体Struct等等。

四、示例

目录结构

D:.
│  go.mod
│  go.sum
│  main.go
│
└─config
        config.yaml

main.go

package main

import (
	_ "github.com/gogf/gf/contrib/nosql/redis/v2"
	"github.com/gogf/gf/v2/database/gredis"
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
)

func main() {
	ctx := gctx.New()
	// redis字符串操作
	g.Redis().Set(ctx, "k", "v")
	v, _ := g.Redis().Get(ctx, "k")
	g.Log().Info(ctx, v.String())

	// 获取cache链接,DoVar转换
	v2, _ := g.Redis("cache").Get(ctx, "k")
	g.Log().Info(ctx, v2.String())

	// setex
	g.Redis().SetEX(ctx, "keyEx", "v4", 2000)
	v3, _ := g.Redis().Get(ctx, "keyEx")
	g.Log().Info(ctx, v3.String())

	// list
	g.Redis().RPush(ctx, "keyList", "v4")
	v4, _ := g.Redis().LPop(ctx, "keyList")
	g.Log().Info(ctx, v4.String())

	// hash
	g.Redis().HSet(ctx, "keyHash", g.Map{"v1": "v5"})
	v5, _ := g.Redis().HGet(ctx, "keyHash", "v1")
	g.Log().Info(ctx, v5.String())

	// set
	g.Redis().SAdd(ctx, "keySet", "v6")
	v6, _ := g.Redis().SPop(ctx, "keySet")
	g.Log().Info(ctx, v6.String())

	// sort set
	g.Redis().ZAdd(ctx, "keySortSet", &gredis.ZAddOption{}, gredis.ZAddMember{Score: 1, Member: "v7"})
	v7, _ := g.Redis().ZRem(ctx, "keySortSet", "v7")
	g.Log().Info(ctx, v7)

}

config.yaml

# Redis数据库配置
redis:
  default:
    address: 127.0.0.1:6379
    db: 1
  cache:
    address: 127.0.0.1:6379
    db: 1
    pass: "123456"
    idleTimeout: 600