Skip to content

数据结构

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)的完善实现。
  • 应用场景
    • 消息队列以及广发