【青训营学习笔记】go-redis各种数据结构的应用场景? | 青训营

76 阅读4分钟

Redis的数据结构?

String、List、Hashmap、set、Zset

String应用场景?

  1. 缓存: String 类型最常用于缓存数据,例如缓存页面内容、计算结果、数据库查询结果等。通过将数据存储在 String 类型中,可以减少后续重复查询和计算的开销,提高系统的性能和响应速度。
  2. 计数器: String 类型也可以用作计数器。例如,你可以将 String 类型的值初始化为 0,然后通过 INCR 命令递增该值来实现计数的功能,比如统计用户的访问次数、点赞数等。
  3. 限流: 在高并发场景下,可以使用 String 类型实现请求的限流。例如,可以设置每个 IP 地址的访问频率为一定的次数,将 IP 地址作为键,每次访问时使用 INCR 命令递增该键的值,当值达到阈值时,拒绝后续请求。
  4. 分布式锁: String 类型可以用于实现分布式锁。通过 SETNX 命令(设置不存在时才设置)或 SETEX 命令(设置并指定过期时间)来创建一个键作为锁,只有一个客户端能够成功设置该键,从而实现简单的分布式锁。
  5. 存储序列化对象: String 类型可以用于存储序列化的对象,比如 JSON、MessagePack 等格式的数据。这在一些应用中可以方便地将对象持久化到 Redis 中,以便快速读取和使用。
  6. 位图: Redis 中的位图是由 String 类型来表示的,可以将其用于标记某些状态。例如,可以将一个 String 类型的值作为位图,每一位代表一个状态,比如用户签到情况、用户在线状态等。
  7. URL 短链接: 将长 URL 映射到短字符串,然后存储到 String 类型中,当访问短链接时,根据短字符串获取长 URL。

List的底层原理以及应用场景?

当数据量较少的时候它的底层存储结构为一块连续内存,称之为ziplist(压缩列表),它将所有的元素紧挨着一起存储,分配的是一块连续的内存;当数据量较多的时候将会变成quicklist(快速链表) 结构。

  1. 消息队列(Message Queue) :List 可以用作简单的消息队列,生产者向列表的一端添加消息,消费者从另一端弹出消息,实现了基本的发布-订阅模型。lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能
  2. 最新消息:将最新的消息添加到列表的头部,这样可以轻松获取最新的消息,例如社交媒体的时间线。
  3. 任务队列:将待处理的任务添加到列表中,多个消费者可以并行地从列表中获取任务进行处理。
  4. 实时排行榜:使用 List 存储用户的得分信息,根据得分进行排序,可以实现实时的排行榜功能。
  5. 日志记录:可以将日志信息添加到列表中,从而实现简单的日志记录功能。
  6. 轮询系统:使用 List 存储多个备选项,然后从列表中弹出一个元素,实现循环的轮询选择。
  7. 异步任务处理:将需要异步处理的任务添加到列表中,后台的工作线程可以从列表中获取任务并进行处理。
  8. 分布式锁:通过在 List 中添加一个唯一标识来模拟分布式锁的获取和释放。
  9. 聊天应用:将用户发送的聊天消息存储在 List 中,可以实现基本的聊天应用功能。

Set的底层原理以及应用场景?

相当于没有VALUE的KV哈希表,内部的键值对是无序的、唯一 的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值 NULL。当集合中最后一个元素被移除之后,数据结构被自动删除,内存被回收。

  • 好友、关注、粉丝、感兴趣的人集合:
  1. sismember命令可以判断A是否是B的好友;(A是否是B的关注,B是否是A的粉丝)
  2. scard命令可以获取好友数量; (绕过数据库获得用户的关注、粉丝)
  • 首页展示随机:美团首页有很多推荐商家,但是并不能全部展示,set类型适合存放所有需要展示的内容,而srandmember命令则可以从中随机获取几个。(可以用于首页展示)

zset应用场景?

  • 根据关注时间对粉丝列表进行排序,但是和list不同的是zset它能够实现动态的排序,例如: 可以用来存储粉丝列表,value 值是粉丝的用户 ID,score 是关注时间,我们可以对粉丝列表按关注时间进行排序。

  • 根据视频点赞量排序, value 值是学生的 ID, score 是他的考试成绩。 我们对成绩按分数进行排序就可以得到他的名次。