您好,欢迎访问一九零五行业门户网

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]
万能操作连接redisconn,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的方法的详细内容。
其它类似信息

推荐信息