Appearance
数据结构
5种基础类型
String 字符串
- 应用场景
- 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
- 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
- session:redis实现session共享。
Hash 散列
- 应用场景
- 缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
List 列表
- 应用场景
- 微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
- 消息队列
Set 无序集合
- 应用场景
- 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
- 点赞,或点踩,收藏等,可以放到set中实现
Zset 有序集合
- 应用场景
- 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
go
package main
import (
"fmt"
"github.com/zeromicro/go-zero/core/stores/redis"
)
func main() {
rds := GetRedis()
//1.sting字符串
rds.Set("string", "world")
str, _ := rds.Get("string")
fmt.Println("string:" + str)
//2.hash哈希
rds.Hset("hash", "name", "zhangsan")
rds.Hset("hash", "age", "18")
//取出单个字段
hashName, _ := rds.Hget("hash", "name")
//取出所有字段
hash, _ := rds.Hgetall("hash")
fmt.Printf("hash-field: %+v \r\n", hashName)
fmt.Printf("hash-all %+v \r\n", hash)
//3.list列表
//在头部插入一个数据
rds.Lpush("list", 1, 2, 3)
//在尾部插入一个数据
rds.Rpush("list", 4, 5, 6)
//取出头部的第一个元素
list1, _ := rds.Lpop("list")
//取出尾部部的第一个元素
list2, _ := rds.Rpop("list")
fmt.Println("list-left:"+list1, "list-right:"+list2)
//4.Set无序集合
rds.Sadd("set1", 1, 2, 3, 4)
rds.Sadd("set2", 3, 4, 5, 6)
//获取成员数
set1, _ := rds.Smembers("set1")
//取set1,set2交集
jiaoji, _ := rds.Sinter("set1", "set2")
//取set1,set2并集
bingji, _ := rds.Sunion("set1", "set2")
//取set1,set2差集
chaji, _ := rds.Sdiff("set1", "set2")
fmt.Printf("set-all: %+v \r\n", set1)
fmt.Printf("set-jiaoji: %+v \r\n", jiaoji)
fmt.Printf("set-bingji: %+v \r\n", bingji)
fmt.Printf("set-chaji: %+v \r\n", chaji)
//5.Zset有序集合
rds.Zadd("zset", 40, "user1")
rds.Zadd("zset", 30, "user2")
rds.Zadd("zset", 50, "user3")
rds.Zadd("zset", 70, "user4")
//可以覆盖
rds.Zadd("zset", 60, "user2")
//通过索引区间返回有序集合成指定区间内的成员 分数 低->高 前3名
zset1, _ := rds.Zrange("zset", 0, 2)
//返回有序集中指定区间内的成员,通过索引,分数从高到底
zset2, _ := rds.Zrevrange("zset", 0, 2)
//返回有序集中指定分数区间内的成员,分数从高到低排序 更具分数排序 低->高
zset3, _ := rds.ZrangebyscoreWithScores("zset", 50, 100)
fmt.Printf("zset-range: %+v \r\n", zset1)
fmt.Printf("zset-revrange: %+v \r\n", zset2)
fmt.Printf("zset-range-by: %+v \r\n", zset3)
}
func GetRedis() *redis.Redis {
rds := redis.MustNewRedis(redis.RedisConf{
Host: "127.0.0.1:6379",
Type: "node",
Pass: "123456",
})
return rds
}
3中特殊类型
HyperLogLog基数统计
- 应用场景
- 这个结构可以非常省内存的去统计各种计数,比如注册 IP 数、每日访问 IP 数、页面实时UV、在线用户数,共同好友数等。
Bitmap 位图
- 应用场景
- 只有2中状态 1和0 例如已签到/未签到 登录/未登录
Geospatial 地理位置
- 应用场景
- 附近的人
- 城市距离计算
stream数据
- Redis5.0 中还增加了一个数据结构Stream,从字面上看是流类型,但其实从功能上看,应该是Redis对消息队列(MQ,Message Queue)的完善实现。
- 应用场景
- 消息队列以及广发