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