Go操作redis

574 次浏览次阅读
没有评论

在实际开发中,经常用到 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)

}

Go 操作 redis

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 设置初始化连接池数量
    })
正文完
 0
评论(没有评论)