Go操作redis

作者: 太阳上的雨天 分类: Go 发布时间: 2022-02-21 17:14

在实际开发中,经常用到redis来做缓存。

在项目中安装redis的包

go get github.com/go-redis/redis/v8

redis的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的子串
package main

import (
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
    "log"
    "net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {

    rdb := redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "123456",
        DB:       0,
    })

    //设置key-value expiration:0 永不过期
    err := rdb.Set(ctx, "score", 80, 0).Err()
    if err != nil {
        log.Fatal(err)
    }

    //获取key-value
    val, err := rdb.Get(ctx, "score").Result()
    if err != nil {
        log.Fatal(err)
    }
    w.Write([]byte(fmt.Sprintf("score的值: %v", val)))

    //score的值加2
    rdb.IncrBy(ctx, "score", 2)
    //score的值自增1
    rdb.Incr(ctx, "score")
    val2, err := rdb.Get(ctx, "score").Result()
    if err != nil {
        log.Fatal(err)
    }

    w.Write([]byte(fmt.Sprintf("score的值: %v", val2)))

    //score的值减-2
    rdb.DecrBy(ctx, "score", 2)
    //score的值递减1
    rdb.Decr(ctx, "score")
    val3, err := rdb.Get(ctx, "score").Result()
    if err != nil {
        log.Fatal(err)
    }
    w.Write([]byte(fmt.Sprintf("score的值: %v", val3)))
}

func main()  {

    http.HandleFunc("/set", SetValue)

    http.ListenAndServe(":8081", nil)
}

redis的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的头部
package main

import (
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
    "log"
    "net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {

    rdb := redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "123456",
        DB:       0,
    })

    //往ball头部追加一个元素basketball
    rdb.LPush(ctx, "balls", "basketball")
    //往ball尾部追加一个元素football
    rdb.RPush(ctx, "balls", "football")
    //ball的长度
    len, err := rdb.LLen(ctx, "balls").Result()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(len)

    //删除并返回balls中右侧第一个元素
    result, err := rdb.RPop(ctx, "balls").Result()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("val: ", result)

    //删除并返回balls只左侧的第一个元素
    result2, err := rdb.LPop(ctx, "balls").Result()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("vals: ", result2)

    //返回balls队列0-4区间的元素
    strings, err := rdb.LRange(ctx, "balls", 0, 4).Result()
    for k, v := range strings {
        fmt.Printf("k: %V, v: %v", k, v)
    }
}

func main() {

    http.HandleFunc("/set", SetValue)

    http.ListenAndServe(":8081", nil)

}

redis的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的一个元素
package main

import (
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
    "log"
    "net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "123456",
        DB:       0,
    })

    fmt.Println("====================================================")

    //向AFriends中添加三个好友
    rdb.SAdd(ctx,"AFriends", "mary")
    rdb.SAdd(ctx, "AFriends", "job")
    rdb.SAdd(ctx, "AFriends", "bitch")

    //向BFriends中添加三个好友
    rdb.SAdd(ctx, "BFriends", "job")
    rdb.SAdd(ctx, "BFriends", "dem")

    //判断bitch是否在AFriends集合中
    _, err := rdb.SIsMember(ctx, "AFriends", "bitch").Result()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("bitch is in AFriends")

    fmt.Println("====================================================")

    //取交集
    r2, err := rdb.SInter(ctx, "AFriends", "BFriends").Result()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("交集的好友是: ", r2)

    fmt.Println("====================================================")

    //取差集
    r3, _ := rdb.SDiff(ctx, "AFriends", "BFriends").Result()
    fmt.Println("交集的好友是: ", r3)

    fmt.Println("====================================================")

    //返回BFriends中的所有元素
    r4, _ := rdb.SMembers(ctx, "BFriends").Result()
    fmt.Println("BFriends的全部好友:", r4)

    fmt.Println("====================================================")
}

func main() {

    http.HandleFunc("/set", SetValue)

    http.ListenAndServe(":8081", nil)

}

image-20220221163431865

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
package main

import (
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
    "net/http"
)

var ctx = context.Background()

func SetValue(w http.ResponseWriter, r *http.Request) {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "123456",
        DB:       0,
    })

    //向名c_user_info的hash中添加name和age
    rdb.HSet(ctx, "c_user_info", "name", "大卫")
    rdb.HSet(ctx, "c_user_info", "age", 20)

    //返回名c_user_info的hash中添加name和age的值
    r1, _ := rdb.HGet(ctx, "c_user_info", "name").Result()
    fmt.Println("name的值为:", r1)

    r2, _ := rdb.HGet(ctx, "c_user_info", "age").Result()
    fmt.Println("age的值为:", r2)

    //批量向名为c_user_info的hash中添加元素
    rdb.HMSet(ctx, "c_user_info", map[string]string{"name": "贝多芬", "age": "500"})

    //批量获取名为c_user_info的hash中指定字段的值
    r3, _ := rdb.HMGet(ctx, "c_user_info", "name", "age").Result()
    fmt.Println("name age", r3)

    // 获取名为c_user_info的hash中字段的数量
    r4, _ := rdb.HLen(ctx, "c_user_info").Result()
    fmt.Println("c_user_info中字段的数量是:", r4)

    // 删除hash中指定的字段
    r5, _ := rdb.HDel(ctx, "c_user_info", "age").Result()
    fmt.Println("删除的字段数量:", r5)

}

func main() {

    http.HandleFunc("/set", SetValue)

    http.ListenAndServe(":8081", nil)

}

redis的连接池

go-redis通过PoolSize设置连接池数量,默认初始化的数量为10个

优点:提前存放一定数量已经建立好连接的链接,节省了每次操作redis都要进行连接的时间。

    Addr:     "127.0.0.1:6379",
        Password: "123456",
        DB:       0,
        PoolSize: 20, // 通过PoolSize设置初始化连接池数量
    })

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注