golang中的goredis

连接

func RedisConPoint(db int) *redis.Client {
   addr := beego.AppConfig.String("redis_host")
   password := beego.AppConfig.String("redis_password")

   client := redis.NewClient(&redis.Options{
      Addr:         addr,
      Password:     password,
      DB:           db,
      ReadTimeout:  time.Duration(10) * time.Second,
      WriteTimeout: time.Duration(10) * time.Second,
      PoolSize: 5,
   })

   _, err := client.Ping().Result()
   if err != nil {
      fmt.Println(err)
   }
   return client

}

//退出redis
func RedisQuit(client redis.Client) {
   err := client.Close()

   if err != nil {
      fmt.Println(err)
   }

}

string操作

set(key, value):给数据库中名称为key的string赋予值value
get(key):返回数据库中名称为key的string的value
getset(key, value):给名称为key的string赋予上一次的value
mget(key1, key2,…, key N):返回库中多个string的value
setnx(key, value):添加string,名称为key,值为value
setex(key, time, value):向库中添加string,设定过期时间time
mset(key N, value N):批量设置多个string的值
msetnx(key N, value N):如果所有名称为key i的string都不存在
incr(key):名称为key的string增1操作
incrby(key, integer):名称为key的string增加integer
decr(key):名称为key的string减1操作
decrby(key, integer):名称为key的string减少integer
append(key, value):名称为key的string的值附加value
substr(key, start, end):返回名称为key的string的value的子串

在 go-redis 中, 我们可以直接找到对应的操作方法, 直接上代码:

// String 操作
func stringOperation(client *redis.Client) {
    // 第三个参数是过期时间, 如果是0, 则表示没有过期时间.
    err := client.Set("name", "xys", 0).Err()
    if err != nil {
        panic(err)
    }

    val, err := client.Get("name").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("name", val)


    // 这里设置过期时间.
    err = client.Set("age", "20", 1 * time.Second).Err()
    if err != nil {
        panic(err)
    }

    client.Incr("age") // 自增
    client.Incr("age") // 自增
    client.Decr("age") // 自减

    val, err = client.Get("age").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("age", val) // age 的值为21

    // 因为 key "age" 的过期时间是一秒钟, 因此当一秒后, 此 key 会自动被删除了.
    time.Sleep(1 * time.Second)
    val, err = client.Get("age").Result()
    if err != nil {
        // 因为 key "age" 已经过期了, 因此会有一个 redis: nil 的错误.
        fmt.Printf("error: %v\n", err)
    }
    fmt.Println("age", val)
}

list操作

rpush(key, value):在名称为key的list尾添加一个值为value的元素
lpush(key, value):在名称为key的list头添加一个值为value的 元素
llen(key):返回名称为key的list的长度
lrange(key, start, end):返回名称为key的list中start至end之间的元素
ltrim(key, start, end):截取名称为key的list
lindex(key, index):返回名称为key的list中index位置的元素
lset(key, index, value):给名称为key的list中index位置的元素赋值
lrem(key, count, value):删除count个key的list中值为value的元素
lpop(key):返回并删除名称为key的list中的首元素
rpop(key):返回并删除名称为key的list中的尾元素
blpop(key1, key2,… key N, timeout):lpop命令的block版本。
brpop(key1, key2,… key N, timeout):rpop的block版本。
rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部

同样地, 在 go-redis 中也可以找到对应的方法, 下面是一个简单的示例:

// list 操作
func listOperation(client *redis.Client) {
    client.RPush("fruit", "apple") //在名称为 fruit 的list尾添加一个值为value的元素
    client.LPush("fruit", "banana") //在名称为 fruit 的list头添加一个值为value的 元素
    length, err := client.LLen("fruit").Result() //返回名称为 fruit 的list的长度
    if err != nil {
        panic(err)
    }
    fmt.Println("length: ", length) // 长度为2

    value, err := client.LPop("fruit").Result() //返回并删除名称为 fruit 的list中的首元素
    if err != nil {
        panic(err)
    }
    fmt.Println("fruit: ", value)

    value, err = client.RPop("fruit").Result() // 返回并删除名称为 fruit 的list中的尾元素
    if err != nil {
        panic(err)
    }
    fmt.Println("fruit: ", value)
}

set 操作

sadd(key, member):向名称为key的set中添加元素member
srem(key, member) :删除名称为key的set中的元素member
spop(key) :随机返回并删除名称为key的set中一个元素
smove(srckey, dstkey, member) :移到集合元素
scard(key) :返回名称为key的set的基数
sismember(key, member) :member是否是名称为key的set的元素
sinter(key1, key2,…key N) :求交集
sinterstore(dstkey, (keys)) :求交集并将交集保存到dstkey的集合
sunion(key1, (keys)) :求并集
sunionstore(dstkey, (keys)) :求并集并将并集保存到dstkey的集合
sdiff(key1, (keys)) :求差集
sdiffstore(dstkey, (keys)) :求差集并将差集保存到dstkey的集合
smembers(key) :返回名称为key的set的所有元素
srandmember(key) :随机返回名称为key的set的一个元素

接下来是 go-redis 的 set 操作:

// set 操作
func setOperation(client *redis.Client) {
    client.SAdd("blacklist", "Obama") // 向 blacklist 中添加元素
    client.SAdd("blacklist", "Hillary") // 再次添加
    client.SAdd("blacklist", "the Elder") // 添加新元素

    client.SAdd("whitelist", "the Elder") // 向 whitelist 添加元素

    // 判断元素是否在集合中
    isMember, err := client.SIsMember("blacklist", "Bush").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("Is Bush in blacklist: ", isMember)


    // 求交集, 即既在黑名单中, 又在白名单中的元素
    names, err := client.SInter("blacklist", "whitelist").Result()
    if err != nil {
        panic(err)
    }
    // 获取到的元素是 "the Elder"
    fmt.Println("Inter result: ", names)


    // 获取指定集合的所有元素
    all, err := client.SMembers("blacklist").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("All member: ", all)
}

hash 操作

redis 的 hash 操作:

hset(key, field, value):向名称为key的hash中添加元素field
hget(key, field):返回名称为key的hash中field对应的value
hmget(key, (fields)):返回名称为key的hash中field i对应的value
hmset(key, (fields)):向名称为key的hash中添加元素field 
hincrby(key, field, integer):将名称为key的hash中field的value增加integer
hexists(key, field):名称为key的hash中是否存在键为field的域
hdel(key, field):删除名称为key的hash中键为field的域
hlen(key):返回名称为key的hash中元素个数
hkeys(key):返回名称为key的hash中所有键
hvals(key):返回名称为key的hash中所有键对应的value
hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value

go-redis 中的 hash 操作:

// hash 操作
func hashOperation(client *redis.Client) {
    client.HSet("user_xys", "name", "xys"); // 向名称为 user_xys 的 hash 中添加元素 name
    client.HSet("user_xys", "age", "18"); // 向名称为 user_xys 的 hash 中添加元素 age

    // 批量地向名称为 user_test 的 hash 中添加元素 name 和 age
    client.HMSet("user_test", map[string]string{"name": "test", "age":"20"})
    // 批量获取名为 user_test 的 hash 中的指定字段的值.
    fields, err := client.HMGet("user_test", "name", "age").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("fields in user_test: ", fields)


    // 获取名为 user_xys 的 hash 中的字段个数
    length, err := client.HLen("user_xys").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("field count in user_xys: ", length) // 字段个数为2

    // 删除名为 user_test 的 age 字段
    client.HDel("user_test", "age")
    age, err := client.HGet("user_test", "age").Result()
    if err != nil {
        fmt.Printf("Get user_test age error: %v\n", err)
    } else {
        fmt.Println("user_test age is: ", age) // 字段个数为2
    }
}

发布

//参数1 频道名 字符串类型 
//参数2 发送的内容 他是个 interface{} 类型 因为我要和前端对接 所以data是我转的json字符

err := RedisClient.Publish("message", data).Err()
    if err != nil {
        return errors.New("发布失败")
    }

订阅

func Subscribe(){
    //参数1 频道名 字符串类型
    pubsub := redis.Redis.Subscribe("homework")
        _, err := pubsub.Receive()
        if err != nil {
            
            return
        }
        ch := pubsub.Channel()
        for msg := range ch {
            fmt.Println( msg.Channel, msg.Payload, "\r\n")
        }
}
//这里的订阅了频道,阻塞了代码继续执行,所以我们 需要 go Subscribe() 来让我们的程序 继续执行 并且go Subscribe() 写在init方
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盼盼编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值