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还有一些必须知道的内容,比如击穿、雪崩,看官有兴趣可以进一步了解