简介

redis是高并发场景下常用的缓存型数据库,支持持久化,常用来缓存访问频率较高的数据,本文通过几个例子列举go如何使用redis,go 操作redis的库很多,我们选择常用的go-redis来操作就可以了,当然官方也提供了redis操作的库。这几个例子出自个人博客系统的源码。源码地址https://github.com/secondtonone1/bstgo-blog

连接redis

我们创建一个redis连接池,设置最大空闲连接数,池内总共连接数,以及redis连接密码,地址,选择的分区等

func InitRedis() {
    rediscli = redis.NewClient(&redis.Options{
        Addr:         config.TotalCfgData.Redis.Host,
        Password:     config.TotalCfgData.Redis.Passwd,
        DB:           config.TotalCfgData.Redis.DB,
        PoolSize:     config.TotalCfgData.Redis.PoolSize,
        MinIdleConns: config.TotalCfgData.Redis.IdleCons,
    })
    _, err := rediscli.Ping().Result()
    if err != nil {
        log.Println("ping failed, error is ", err)
        return
    }
    log.Println("redis init success!!!")
}

根据key设置value

redis是基于key-value存储的,这个例子我们为STRING_ToTAL_VISIT_NUM_KEY设置值为num,过期时间为0表示永不过期

func SetVisitNum(num int64) (string, error) {
    val, err := rediscli.Set(STRING_ToTAL_VISIT_NUM_KEY, num, 0).Result()
    if err != nil {
        return "", err
    }

    return val, nil
}

根据key获取值

这个例子获取key为STRING_ToTAL_VISIT_NUM_KEY的value值

func GetVisitNum() (string, error) {
    val, err := rediscli.Get(STRING_ToTAL_VISIT_NUM_KEY).Result()

    if err == redis.Nil {
        return "key not exists in redis", err
    }

    if err != nil {
        return "", err
    }

    return val, nil
}

根据key删除值

rediscli.Del(STRING_ToTAL_VISIT_NUM_KEY).Result()

HGet获取hash表中指定字段

HGet操作可以获取hash表中指定字段的值,下个例子通过获取HOME_SESSION的key找到hash表,进而找到sessioId字段的值

func GetHomeSession(sessionId string) (string, error) {
    sessionData, err := rediscli.HGet(HOME_SESSION, sessionId).Result()
    if err != nil {
        return "", err
    }

    return sessionData, err
}

HSet添加值

HSet设置hash表中指定字段的值,下个例子设置了Key为HOME_SESSION的hash表,将sessionId字段的值设置为sessionData

func AddHomeSession(sessionId string, sessionData string) error {
    _, err := rediscli.HSet(HOME_SESSION, sessionId, sessionData).Result()

    rediscli.Expire(HOME_SESSION, time.Hour*24)
    return err
}

设置值的同时设置了key为HOME_SESSION的hash表中所有值的过期时间为24小时,如果要设置过期时间,每次设置值后都要重设过期时间,如不设置就会变成永久存在内存中

HDel删除值

HDel删除hash表中指定的字段,如下例子删除了key为HOME_SESSION的hash表中字段为sessionId的值

func DelHomeSession(sessionId string) error {
    _, err := rediscli.HDel(HOME_SESSION, sessionId).Result()
    return err
}

增加操作

可以通过Incr命令为某个key的value自增加一,如下这个例子为key为STRING_ToTAL_VISIT_NUM_KEY的value值加一

func AddVisitNum() (int64, error) {
    visit, err := rediscli.Incr(STRING_ToTAL_VISIT_NUM_KEY).Result()
    if err != nil {
        return 0, err
    }

    return visit, nil
}

类似的操作还有Decr,DecrBy等

获取hash表中所有key和value

HGetAll可以获取指定hash表中所有的key和value,如下例子获取了key为HSET_LV1_MENU_KEY的hash表中所有的key,value

func GetLv1Menus() ([]*model.CatMenu, error) {
    menulist := []*model.CatMenu{}
    menus, err := rediscli.HGetAll(HSET_LV1_MENU_KEY).Result()
    if err != nil {
        return menulist, err
    }

    for _, val := range menus {
        menu := &model.CatMenu{}
        err := json.Unmarshal([]byte(val), menu)
        if err != nil {
            log.Println("json unmarshal failed, err is ", err)
            continue
        }
        menulist = append(menulist, menu)
    }
    return menulist, nil
}

redis中key为HSET_LV1_MENU_KEY的hash表存储的是所有一级目录的key和value,通过HGetAll获取后进行遍历和反序列化获取具体的目录结构。 以上就是redis常用的操作,通过go操作redis达到缓存高并发访问数据的目的。

results matching ""

    No results matching ""