快速入门
# Redis
# 一、redis 是什么、能干什么、主要功能和工作原理的详细讲解
KV 数据库
一个开源的内存数据库
Redis 的好处:
- 缓存系统,减轻主数据库的压力
- 计数场景,比如微博,抖音中的关注数和粉丝数
- 热门排行榜,需要排序的场景特别适合使用 ZSET
- 利用 LIST 可以实现队列的功能
- 利用 HyperLogLog 统计 UV、PV 等数据
- 使用 geospatial index 进行地理位置相关查询
Redis:Redis 详解博客 (opens new window)
# 二、go-redis 操作实例
网址:Go 语言操作 Redis | 李文周的博客 (liwenzhou.com) (opens new window)
package main
import (
"context"
"fmt"
"time"
"github.com/redis/go-redis/v9"
)
var rdb *redis.Client
func init() {
// 连接到 Redis 服务器
rdb = redis.NewClient(&redis.Options{
Addr: "8.130.30.140:6379",
Password: "", // 如果有密码,请提供密码
DB: 0,
})
}
func main() {
fmt.Println("zsetDemo.")
zsetDemo()
}
// zsetDemo 操作zset示例
func zsetDemo() {
// key
zsetKey := "rank"
// value
// 注意:v8版本使用[]*redis.Z;此处为v9版本使用[]redis.Z
languages := []redis.Z{
{Score: 90.0, Member: "Golang"},
{Score: 98.0, Member: "Java"},
{Score: 95.0, Member: "Python"},
{Score: 97.0, Member: "JavaScript"},
{Score: 99.0, Member: "C/C++"},
}
ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
defer cancel()
// ZADD
err := rdb.ZAdd(ctx, zsetKey, languages...).Err()
if err != nil {
fmt.Printf("zadd failed, err:%v\n", err)
return
}
fmt.Println("zadd success")
// 把Golang的分数加10
newScore, err := rdb.ZIncrBy(ctx, zsetKey, 10.0, "Golang").Result()
if err != nil {
fmt.Printf("zincrby failed, err:%v\n", err)
return
}
fmt.Printf("Golang's score is %f now.\n", newScore)
// 取分数最高的3个
ret := rdb.ZRevRangeWithScores(ctx, zsetKey, 0, 2).Val()
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
// 取95~100分的
op := &redis.ZRangeBy{
Min: "95",
Max: "100",
}
ret, err = rdb.ZRangeByScoreWithScores(ctx, zsetKey, op).Result()
if err != nil {
fmt.Printf("zrangebyscore failed, err:%v\n", err)
return
}
for _, z := range ret {
fmt.Println(z.Member, z.Score)
}
}