redis实战 | 青训营

43 阅读2分钟

1、redis简介

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

redis提供了多种数据格式,例如string,hash,list,足以满足日常使用需求

本文将对redis的string和有序队列进行实战演练

2、string类型存储

string是一个二进制安全的字符串,意味着它不仅能够存储字符串、还能存储图片、视频等多种类型, 最大长度支持512M。

对每种数据类型,Redis都提供了丰富的操作命令,如:

  • GET/MGET
  • SET/SETEX/MSET/MSETNX
  • INCR/DECR
  • GETSET
  • DEL

下面进行string的存取实战

client := redis.NewClient(&redis.Options{})
ctx := context.Background()

userInfo := user.User{
   ID:   1,
   Name: "user",
}
marshal, err := json.Marshal(userInfo)
if err != nil {
   fmt.Println(err)
}
val, err := client.Get(ctx, "user_2").Result()
if err != nil {
   fmt.Println(err)
}

userString := string(marshal)
err = client.Set(ctx, "user_2", userString, 30*time.Second).Err()
if err != nil {
   fmt.Println(err)
}

val, err = client.Get(ctx, "user_2").Result()
if err != nil {
   fmt.Println(err)
}
var userResult user.User
err = json.Unmarshal([]byte(val), &userResult)
fmt.Println(userResult)

第一次取,结果为空,第二次取,可以取到值

3、zSet类型存储

ZSet是一种有序集合类型,每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序。与Set类型一样,其底层也是通过哈希表实现的。

ZSet命令:

  • ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
  • ZINTER/ZDIFF/ZDIFFSTORE/ZUNION

下面进行zset的存取实战

client := redis.NewClient(&redis.Options{})
ctx := context.Background()

marshal, _ := json.Marshal(user.User{ID: 1, Name: "user1"})
userString1 := string(marshal)
marshal, _ = json.Marshal(user.User{ID: 2, Name: "user2"})
userString2 := string(marshal)
zAddResult := client.ZAdd(ctx, "users", redis.Z{Score: 1001, Member: userString1}, redis.Z{Score: 2011, Member: userString2})
if zAddResult.Err() != nil {
   fmt.Println(zAddResult.Err())
}

rangeWithScores := client.ZRangeWithScores(ctx, "users", 0, 1)
result, err := rangeWithScores.Result()
if err != nil {
   fmt.Println(err.Error())
}
fmt.Println(result)

第二种存取方式

marshal, _ = json.Marshal(user.User{ID: 3, Name: "user3"})
userString3 := string(marshal)
client.ZAdd(ctx, "users", redis.Z{Score: 2101, Member: userString3})

rank := client.ZRank(ctx, "users", "2000")
i, _ := rank.Result()

zRange := client.ZRange(ctx, "users", i, i+30)
result, err := zRange.Result()
if err != nil {
   fmt.Println(err)
}
fmt.Println(result)

4、总结

除了以上内容之外,redis还有一些必须知道的内容,比如击穿、雪崩,看官有兴趣可以进一步了解