在实际开发中,经常用到 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)
}
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 设置初始化连接池数量
})
正文完