准备redis
环境
docker
安装5.0.7
docker search redis //查找redis
docker pull redis:5.0.7
启动redis
docker run --name redis507 -p 6379:6379 -d redis:5.0.7
启动一个redis-cli
docker run -it --network host --rm redis:5.0.7 redis-cli
连接
func initClient() (err error) {
rdb = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
_,err=rdb.Ping().Result()
if err != nil {
fmt.Println("连接失败",err)
return err
}
fmt.Println("连接成功")
return nil
}
基本使用
func redisExample() {
err:=rdb.Set("name","zhangsan",0).Err()
if err != nil {
fmt.Println("设置失败",err)
return
}
val,err:=rdb.Get("name").Result()
if err != nil {
fmt.Println("获取失败",err)
return
}
fmt.Println("获取成功",val)
val2,err:=rdb.Get("name2").Result()
if err == redis.Nil {
fmt.Println("该记录不存在",err)
return
}else if err!=nil{
fmt.Println("获取失败",err)
return
}else{
fmt.Println("获取成功",val2)
}
}
- 结果
获取成功 zhangsan
该记录不存在 redis: nil
zset
示例
func redisExample2() {
fmt.Println("--------zset示例---------")
zsetKey := "language_rank"
languages := []redis.Z{
redis.Z{Score: 90.0, Member: "golang"},
redis.Z{Score: 80.0, Member: "python"},
redis.Z{Score: 70.0, Member: "java"},
redis.Z{Score: 60.0, Member: "c"},
}
num, err := rdb.ZAdd(zsetKey, languages...).Result()
if err != nil {
fmt.Println("添加失败", err)
return
}
fmt.Println("添加成功", num)
// 把golang分数加10
newScore, err := rdb.ZIncrBy(zsetKey, 10.0, "golang").Result()
if err != nil {
fmt.Println("更新失败", err)
return
}
fmt.Println("更新成功,golang新的分数:", newScore)
// 取分数最高的3个
res, err := rdb.ZRevRangeWithScores(zsetKey, 0, 2).Result()
if err != nil {
fmt.Println("取值失败", err)
return
}
fmt.Println("取前3名成功", res)
for _, z := range res {
fmt.Println("每一项---", z.Member, z.Score)
}
// 取95-100
op := redis.ZRangeBy{
Min: "95",
Max: "100",
}
res, err = rdb.ZRangeByScoreWithScores(zsetKey, op).Result()
if err != nil {
fmt.Println("取95-100值失败", err)
return
}
fmt.Println("取95-100值成功", res)
for _, z := range res {
fmt.Println("每一项---", z.Member, z.Score)
}
}
- 结果
--------zset示例---------
添加成功 0
更新成功,golang新的分数: 100
取前3名成功 [{100 golang} {80 python} {70 java}]
每一项--- golang 100
每一项--- python 80
每一项--- java 70
取95-100值成功 [{100 golang}]
每一项--- golang 100
v8
版本相关
最新版本的go-redis
库的相关命令都需要传递context.Context
参数,例如:
package main
import (
"context"
"fmt"
"time"
"github.com/go-redis/redis/v8" // 注意导入的是新版本
)
var (
rdb *redis.Client
)
// 初始化连接
func initClient() (err error) {
rdb = redis.NewClient(&redis.Options{
Addr: "localhost:16379",
Password: "", // no password set
DB: 0, // use default DB
PoolSize: 100, // 连接池大小
})
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
_, err = rdb.Ping(ctx).Result()
return err
}
func V8Example() {
ctx := context.Background()
if err := initClient(); err != nil {
return
}
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
panic(err)
}
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println("key", val)
val2, err := rdb.Get(ctx, "key2").Result()
if err == redis.Nil {
fmt.Println("key2 does not exist")
} else if err != nil {
panic(err)
} else {
fmt.Println("key2", val2)
}
// Output: key value
// key2 does not exist
}
go
连接哨兵
func initClient()(err error){
rdb := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "master",
SentinelAddrs: []string{"x.x.x.x:26379", "xx.xx.xx.xx:26379", "xxx.xxx.xxx.xxx:26379"},
})
_, err = rdb.Ping().Result()
if err != nil {
return err
}
return nil
}
go
连接Redis
集群
func initClient()(err error){
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
})
_, err = rdb.Ping().Result()
if err != nil {
return err
}
return nil
}
评论区