菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

Golang 操作 Redis 的基本方法

原创
05/13 14:22
阅读数 605

摘要

  • 看到有位老哥写了 PHP 操作 Redis 的基本方法,于是就有了这篇博客
  • 超喜欢 Redis 的,感觉使用起来很方便,但是社区不温不火哈?
  • 就当是为 Redis 社区做贡献吧,如果大家喜欢记得点个赞哦
  • 话不多说,直接上代码

Redis 链接池

  • Redis 有集群版和单机版,当配置中的 Addrs 写成 ip:port 的数组形式即可链接集群版 Redis

    package redis

    import (

    "errors"
    
    "github.com/go-redis/redis"
    

    )

    type Cfg struct {

    Addrs    []string `json:"redis_addrs" env:"REDIS_ADDRS" envDefault:"127.0.0.1:6379"`
    Pwd      string   `json:"redis_pwd" env:"REDIS_PWD"`
    PoolSize int      `json:"redis_pool_size" env:"REDIS_POOL_SIZE" envDefault:"1000"`
    DB       int      `json:"redis_db" env:"REDIS_DB"` // 单机模式下选择使用哪个DB,集群模式下无效
    

    }

    func (c Cfg) Connect() (redis.Cmdable, error) {

    addrNum := len(c.Addrs)
    if addrNum == 0 {
        return nil, errors.New("redis addr is absent")
    }
    
    if addrNum > 1 {
        return redis.NewClusterClient(&redis.ClusterOptions{
            Addrs:    c.Addrs,
            Password: c.Pwd,
            PoolSize: c.PoolSize,
        }), nil
    }
    return redis.NewClient(&redis.Options{
        Addr:     c.Addrs[0],
        Password: c.Pwd,
        PoolSize: c.PoolSize,
        DB:       c.DB,
    }), nil
    

    }

  • 接下来是一份测试,所有配置通过环境变量的形式来读取

    package redis

    import (

    "os"
    "testing"
    "time"
    
    "github.com/caarlos0/env"
    

    )

    func TestConnect(t *testing.T) {

    os.Setenv("REDIS_ADDRS", "127.0.0.1:6379")
    os.Setenv("REDIS_PWD", "")
    os.Setenv("REDIS_POOL_SIZE", "100")
    os.Setenv("REDIS_DB", "1")
    
    c := Cfg{}
    if err := env.Parse(&c); err != nil {
        t.Error(err)
        return
    }
    
    redisPool, err := c.Connect()
    if err != nil {
        t.Error(err)
        return
    }
    
    res, err := redisPool.Set("test_key1", "test_value", time.Minute*10).Result()
    if err != nil {
        t.Error(err)
        return
    }
    
    t.Log(res)
    

    }

Redis 的数据操作

  • 说完了如何链接到 Redis,接下来就说一说对 Redis 进行数据操作吧
  • Redis 中的数据结构可以参考官网(https://redis.io/commands
  • 这儿只举例常用的一些数据结构,其他的读者可以自行研究,上文中使用的 Redis 库(github.com/go-redis/redis)的 redis.Cmdable 已经实现了所有的数据结构,有兴趣可以自己去看
  • 最常用的 Get & Set 在上一个测试中已经有了,就不多做叙述

Hashs

  • Hashs 就类似于一个 map

    package redis

    import (

    "os"
    "testing"
    "time"
    
    "github.com/caarlos0/env"
    

    )

    func TestRedis_Hash(t *testing.T) {

    os.Setenv("REDIS_ADDRS", "127.0.0.1:6379")
    os.Setenv("REDIS_PWD", "")
    os.Setenv("REDIS_POOL_SIZE", "100")
    os.Setenv("REDIS_DB", "1")
    
    c := Cfg{}
    if err := env.Parse(&c); err != nil {
        t.Error(err)
        return
    }
    
    redisPool, err := c.Connect()
    if err != nil {
        t.Error(err)
        return
    }
    
    hashKey := "HashKey"
    data := map[string]interface{}{
        "field1": "value1",
        "field2": 2,
        "field3": true,
    }
    for k, v := range data {
        _, err := redisPool.HSet(hashKey, k, v).Result()
        if err != nil {
            t.Error(err)
            return
        }
    }
    
    // get all
    results, err := redisPool.HGetAll(hashKey).Result()
    if err != nil {
        t.Error(err)
        return
    }
    
    t.Log("HGetAll Results : ", results)
    
    // get certain field
    value, err := redisPool.HGet(hashKey, "field1").Result()
    if err != nil {
        t.Error(err)
        return
    }
    
    t.Log("HGet field1 : ", value)
    

    }

  • 测试运行结果如下

file

sorted sets

  • 排序的集合
  • 集合里面是一对对的 k-v,并且 v 为 float64,根据 v 进行排序
  • 这个数据结构可以用来做排行榜

    package redis

    import (

    "os"
    "testing"
    "time"
    
    "github.com/caarlos0/env"
    "github.com/go-redis/redis"
    

    )

    func TestRedis_Sorted_Sets(t *testing.T) {

    os.Setenv("REDIS_ADDRS", "127.0.0.1:6379")
    os.Setenv("REDIS_PWD", "")
    os.Setenv("REDIS_POOL_SIZE", "100")
    os.Setenv("REDIS_DB", "1")
    
    c := Cfg{}
    if err := env.Parse(&c); err != nil {
        t.Error(err)
        return
    }
    
    redisPool, err := c.Connect()
    if err != nil {
        t.Error(err)
        return
    }
    
    sortedSetKey := "SortedSets"
    data := map[interface{}]float64{
        "player1": 12,
        "player2": 2,
        "player3": 3,
    }
    
    // 设置两遍
    for i := 0; i < 2; i++ {
        for k, v := range data {
            _, err := redisPool.ZIncr(sortedSetKey, redis.Z{
                Member: k,
                Score:  v,
            }).Result()
            if err != nil {
                t.Error(err)
                return
            }
        }
    }
    
    // 根据排名获取数据
    // 有多种获取数据的方法
    results, err := redisPool.ZRevRangeWithScores(sortedSetKey, 0, 10).Result()
    if err != nil {
        t.Error(err)
        return
    }
    
    for _, v := range results {
        t.Log(v)
    }
    

    }

  • 测试运行结果如下
    [

file

Lists

  • 列表

    package redis

    import (

    "os"
    "testing"
    "time"
    
    "github.com/caarlos0/env"
    

    )

    func TestRedis_Lists(t *testing.T) {

    os.Setenv("REDIS_ADDRS", "127.0.0.1:6379")
    os.Setenv("REDIS_PWD", "")
    os.Setenv("REDIS_POOL_SIZE", "100")
    os.Setenv("REDIS_DB", "1")
    
    c := Cfg{}
    if err := env.Parse(&c); err != nil {
        t.Error(err)
        return
    }
    
    redisPool, err := c.Connect()
    if err != nil {
        t.Error(err)
        return
    }
    
    // 向list中插入数据
    listKey := "List"
    data := []interface{}{
        true,
        12,
        "test",
        22,
        "player3",
        3.9,
    }
    
    _, err = redisPool.LPush(listKey, data...).Result()
    if err != nil {
        t.Error(err)
        return
    }
    
    // 获取长度
    len, err := redisPool.LLen(listKey).Result()
    if err != nil {
        t.Error(err)
        return
    }
    t.Log("LLen = ", len)
    
    // pop
    popData, err := redisPool.LPop(listKey).Result()
    if err != nil {
        t.Error(err)
        return
    }
    t.Log("LPop = ", popData)
    

    }

  • 测试运行结果如下

file

发表评论

0/200
0 点赞
0 评论
收藏
为你推荐 换一批