Go操作redis与redigo的方法
发表于:2024-10-16 作者:千家信息网编辑
千家信息网最后更新 2024年10月16日,这篇文章主要介绍了Go操作redis与redigo的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go操作redis与redigo的方法文章都会有所收获,下面我们一起
千家信息网最后更新 2024年10月16日Go操作redis与redigo的方法
这篇文章主要介绍了Go操作redis与redigo的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go操作redis与redigo的方法文章都会有所收获,下面我们一起来看看吧。
Go-操作redis
安装
golang操作redis的客户端包有多个比如redigo、go-redis,github上Star最多的莫属redigo。
go get github.com/garyburd/redigo/redisimport "github.com/garyburd/redigo/redis"
连接
Conn接口是与Redis协作的主要接口,可以使用Dial,DialWithTimeout或者NewConn函数来创建连接,当任务完成时,应用程序必须调用Close函数来完成操作。
package mainimport ("github.com/garyburd/redigo/redis""fmt")func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close()}
使用
package mainimport ("github.com/garyburd/redigo/redis""fmt")func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() _, err = conn.Do("SET", "name", "wd") if err != nil { fmt.Println("redis set error:", err) } name, err := redis.String(conn.Do("GET", "name")) if err != nil { fmt.Println("redis get error:", err) } else { fmt.Printf("Got name: %s \n", name) }}
设置key过期时间
_, err = conn.Do("expire", "name", 10) //10秒过期 if err != nil { fmt.Println("set expire error: ", err) return }
批量获取mget、批量设置mset
_, err = conn.Do("MSET", "name", "wd","age",22) if err != nil { fmt.Println("redis mset error:", err) } res, err := redis.Strings(conn.Do("MGET", "name","age")) if err != nil { fmt.Println("redis get error:", err) } else { res_type := reflect.TypeOf(res) fmt.Printf("res type : %s \n", res_type) fmt.Printf("MGET name: %s \n", res) fmt.Println(len(res)) }//结果://res type : []string //MGET name: [wd 22] //2
列表操作
package mainimport ("github.com/garyburd/redigo/redis""fmt" "reflect")func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() _, err = conn.Do("LPUSH", "list1", "ele1","ele2","ele3") if err != nil { fmt.Println("redis mset error:", err) } res, err := redis.String(conn.Do("LPOP", "list1")) if err != nil { fmt.Println("redis POP error:", err) } else { res_type := reflect.TypeOf(res) fmt.Printf("res type : %s \n", res_type) fmt.Printf("res : %s \n", res) }}//res type : string //res : ele3
hash操作
package mainimport ("github.com/garyburd/redigo/redis""fmt" "reflect")func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() _, err = conn.Do("HSET", "student","name", "wd","age",22) if err != nil { fmt.Println("redis mset error:", err) } res, err := redis.Int64(conn.Do("HGET", "student","age")) if err != nil { fmt.Println("redis HGET error:", err) } else { res_type := reflect.TypeOf(res) fmt.Printf("res type : %s \n", res_type) fmt.Printf("res : %d \n", res) }}//res type : int64 //res : 22
Pipelining(管道)
管道操作可以理解为并发操作,并通过Send(),Flush(),Receive()三个方法实现。客户端可以使用send()方法一次性向服务器发送一个或多个命令,命令发送完毕时,使用flush()方法将缓冲区的命令输入一次性发送到服务器,客户端再使用Receive()方法依次按照先进先出的顺序读取所有命令操作结果。
Send(commandName string, args ...interface{}) errorFlush() errorReceive() (reply interface{}, err error)
Send:发送命令至缓冲区
Flush:清空缓冲区,将命令一次性发送至服务器
Recevie:依次读取服务器响应结果,当读取的命令未响应时,该操作会阻塞。
package mainimport ("github.com/garyburd/redigo/redis""fmt")func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() conn.Send("HSET", "student","name", "wd","age","22") conn.Send("HSET", "student","Score","100") conn.Send("HGET", "student","age") conn.Flush() res1, err := conn.Receive() fmt.Printf("Receive res1:%v \n", res1) res2, err := conn.Receive() fmt.Printf("Receive res2:%v\n",res2) res3, err := conn.Receive() fmt.Printf("Receive res3:%s\n",res3)}//Receive res1:0 //Receive res2:0//Receive res3:22
redis发布会订阅模式
package mainimport ( "github.com/garyburd/redigo/redis" "fmt" "time")func Subs() { //订阅者 conn, err := redis.Dial("tcp", "10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :", err) return } defer conn.Close() psc := redis.PubSubConn{conn} psc.Subscribe("channel1") //订阅channel1频道 for { switch v := psc.Receive().(type) { case redis.Message: fmt.Printf("%s: message: %s\n", v.Channel, v.Data) case redis.Subscription: fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count) case error: fmt.Println(v) return } }}func Push(message string) { //发布者 conn, _ := redis.Dial("tcp", "10.1.210.69:6379") _,err1 := conn.Do("PUBLISH", "channel1", message) if err1 != nil { fmt.Println("pub err: ", err1) return }}func main() { go Subs() go Push("this is wd") time.Sleep(time.Second*3)}//channel1: subscribe 1//channel1: message: this is wd
事务操作
MULTI, EXEC,DISCARD和WATCH是构成Redis事务的基础,当然我们使用go语言对redis进行事务操作的时候本质也是使用这些命令。
MULTI:开启事务
EXEC:执行事务
DISCARD:取消事务
WATCH:监视事务中的键变化,一旦有改变则取消事务。
示例:
package mainimport ("github.com/garyburd/redigo/redis""fmt")func main() { conn,err := redis.Dial("tcp","10.1.210.69:6379") if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() conn.Send("MULTI") conn.Send("INCR", "foo") conn.Send("INCR", "bar") r, err := conn.Do("EXEC") fmt.Println(r)}//[1, 1]
万能操作
连接redis
conn,err := redis.Dial( "tcp", "10.0.3.100:6379", redis.DialPassword("EfcHGSzKqg6cfzWq"), redis.DialDatabase(8))if err != nil { fmt.Println("connect redis error :",err) return}defer conn.Close()
写入
//写入//_, err = conn.Do("LPUSH", "list1", "ele1","ele2","ele3")_, err = conn.Do("reids写入方法", "key名字", "内容1","内容2","内容3")if err != nil { fmt.Println("redis set error:", err)}
读取
//读取redis.Strings:返回多个redis.String:返回一个redis.int:返回统计的数字//获取集合所有成员//name, err := redis.Strings(conn.Do("smembers", "beautiful_user"))// 返回集合成员数//name, err := redis.Int(conn.Do("scard", "beautiful_user"))name, err := redis.方法名(conn.Do("redis读取方法", "key名字"))if err != nil { fmt.Println("redis get error:", err)} else { fmt.Printf("Got name: %s \n", name)}
全部代码
package mainimport ( "fmt" "github.com/garyburd/redigo/redis")func main() { conn,err := redis.Dial("tcp","10.0.3.100:6379",redis.DialPassword("EfcHGSzKqg6cfzWq"),redis.DialDatabase(8)) if err != nil { fmt.Println("connect redis error :",err) return } defer conn.Close() //写入 _, err = conn.Do("LPUSH", "list1", "ele1","ele2","ele3") if err != nil { fmt.Println("redis set error:", err) } //读取 name, err := redis.Strings(conn.Do("smembers", "beautiful_user")) if err != nil { fmt.Println("redis get error:", err) } else { fmt.Printf("Got name: %s \n", name) }}
关于"Go操作redis与redigo的方法"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Go操作redis与redigo的方法"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
方法
事务
命令
内容
服务器
服务
一次性
多个
客户
客户端
知识
结果
缓冲区
缓冲
订阅
函数
名字
成员
接口
管道
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
bp供应商数据库表
高级软件开发是做什么的
infor数据库
服务器搬家工具
数据库ebsco
软件开发与维护协议
华三模拟器无法连接服务器
深圳网孤软件开发
北斗软件开发教程
千时计算机软件开发工作室
网络安全问题防范措施
维护国家网络安全主题黑板报
软件开发技术部各岗位要求
软件开发部照片
希望之村服务器在什么地方
家庭教育与网络安全的作文
为什么mysql数据库使用
在数据库中已存在该时间记录
gtsport移动连不上服务器
中国苹果系统服务器在哪里
mvc上传文件到服务器
乌镇互联网大会网宿科技会场
赣州有电子软件开发公司
oracle数据库空格
新东方媒体数据库
舟山手机软件开发报价
软件开发毕业论文 设计
vfp建立数据库有什么好处
技术状态数据库
非编服务器是什么意思