golang连接和初始化redis
package main
import (
"context"
"fmt"
"time"
"github.com/go-redis/redis/v8"
)
var redisdb *redis.Client
func initRedis() (err error) {
redisdb = redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "",
DB: 0,
})
ctx, calfunc := context.WithTimeout(context.Background(), 10*time.Second)
_, err = redisdb.Ping(ctx).Result()
calfunc()
return
}
func main() {
err := initRedis()
if err != nil {
fmt.Println("connect redis failed,err:", err)
}
}
redis.Option
type Options struct {
// 网络类型 tcp 或者 unix.
// 默认是 tcp.
Network string
// redis地址,格式 host:port
Addr string
// 新建一个redis连接的时候,会回调这个函数
OnConnect func(*Conn) error
// redis密码,redis server没有设置可以为空。
Password string
// redis数据库,序号从0开始,默认是0,可以不用设置
DB int
// redis操作失败最大重试次数,默认不重试。
MaxRetries int
// 最小重试时间间隔.
// 默认是 8ms ; -1 表示关闭.
MinRetryBackoff time.Duration
// 最大重试时间间隔
// 默认是 512ms; -1 表示关闭.
MaxRetryBackoff time.Duration
// redis连接超时时间.
// 默认是 5 秒.
DialTimeout time.Duration
// socket读取超时时间
// 默认 3 秒.
ReadTimeout time.Duration
// socket写超时时间
WriteTimeout time.Duration
// redis连接池的最大连接数.
// 默认连接池大小等于 cpu个数 * 10
PoolSize int
// redis连接池最小空闲连接数.
MinIdleConns int
// redis连接最大的存活时间,默认不会关闭过时的连接.
MaxConnAge time.Duration
// 当你从redis连接池获取一个连接之后,连接池最多等待这个拿出去的连接多长时间。
// 默认是等待 ReadTimeout + 1 秒.
PoolTimeout time.Duration
// redis连接池多久会关闭一个空闲连接.
// 默认是 5 分钟. -1 则表示关闭这个配置项
IdleTimeout time.Duration
// 多长时间检测一下,空闲连接
// 默认是 1 分钟. -1 表示关闭空闲连接检测
IdleCheckFrequency time.Duration
// 只读设置,如果设置为true, redis只能查询缓存不能更新。
readOnly bool
}
执行redis 的set和get
func main() {
err := initRedis()
if err != nil {
fmt.Println("connect redis failed,err:", err)
}
ctx, canl := context.WithTimeout(context.Background(), 10*time.Second)
err = redisdb.Set(ctx, "score", 100, 10*time.Second).Err() //将score设置为100,超时时间为10秒
defer canl()
cmder := redisdb.Get(ctx, "score") //得到score的值
fmt.Println(cmder.Val()) //获取值
fmt.Println(cmder.Err()) //获取错误
cmder2, err := redisdb.Get(ctx, "score").Result()//获取值
if err != nil {
// 如果返回的错误是key不存在
if errors.Is(err, redis.Nil) {//redis自带nil来表示key不存在的错误
return defaultValue, nil
}
// 出其他错了
return "", err
}
fmt.Println(cmder2)
}
redis的Do方法
// doDemo rdb.Do 方法使用示例
func doDemo() {
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel()
// 直接执行命令获取错误
err := rdb.Do(ctx, "set", "key", 10, "EX", 3600).Err()
fmt.Println(err)
// 执行命令获取结果
val, err := rdb.Do(ctx, "get", "key").Result()
fmt.Println(val, err)
}
//zest
func main() {
err := initRedis()
if err != nil {
fmt.Println("connect redis failed,err:", err)
}
//zest
key := "rank"
items := []*redis.Z{ //redis.Z为众多redis数据结构中的一种
&redis.Z{Score: 99, Member: "PHP"},
&redis.Z{Score: 96, Member: "Golang"},
&redis.Z{Score: 97, Member: "Python"},
&redis.Z{Score: 99, Member: "Java"},
}
ctx, canl := context.WithTimeout(context.Background(), 10*time.Hour)
defer canl()
//把这些元素都追加到key
redisdb.ZAdd(ctx, key, items...)
newScore, err := redisdb.ZIncrBy(ctx, key, 10, "Golang").Result() //给golang加10分
if err != nil {
fmt.Println("zincrby failed,err:", err)
return
}
fmt.Println("Golang's score is ", newScore)
// 取分数最高的3个
ret := redisdb.ZRevRangeWithScores(ctx, key, 0, 2).Val()
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
// 取95~100分的
op := &redis.ZRangeBy{
Min: "95",
Max: "100",
}
ret, err = redisdb.ZRangeByScoreWithScores(ctx, key, op).Result()
if err != nil {
fmt.Printf("zrangebyscore failed, err:%v\n", err)
return
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
}
zrange rank 0 4//score从小到大输出[0:4]
zrange rank 0 4 withscore//连分数也输出
zrevrange rank 0 4 //score从小到大输出[0:4]