文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go操作redis与redigo的方法

2023-06-30 02:01

关注

这篇文章主要介绍了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)
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的方法”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯