Redis可以用于实现缓存、消息队列、分布式锁、实时分析和流处理。

Redis的场景

缓存

Redis最为经典的功能就是被用于实现缓存,存储热点数据,减少对于后端数据库的访问压力。不同的数据结构可以用于缓存不同类型的数据:

  • 字符串:适合缓存用户会话信息(sessionID)、简单的json数据。
SET user:1234:session "session_data"
GET user:1234:session
  • 哈希:支持字段级别操作,适合存储对象类型,例如缓存用户信息、购物车信息。
HSET user:1234 name "John" email "[email protected]"
HGET user:1234 name
  • 列表:缓存最新的消息和日志。
LPUSH recent:logs "log1"
LRANGE recent:logs 0 9
  • 集合:适合存储无序唯一数据集合,例如缓存热门搜索关键词。
SADD popular:searches "redis" "cache"
SMEMBERS popular:searches
  • 有序集合:适合存储有序且带权重的集合,例如缓存排行榜数据。
ZADD leaderboard 100 "user1" 200 "user2"
ZRANGE leaderboard 0 -1 WITHSCORES

消息队列

列表、发布/订阅、有序集合、流Stream

消息队列是一个比较复杂的场景。最基本的功能是生产和消费,Redis的SET和GET+DEL类的命令刚好能够实现这两个基本功能。如果需要实现一些附加的功能,需要使用不同的数据类型和模式:

  • 列表:Redis的列表是有序的且提供了内置的队列操作(LPUSH和RPOP)。并且通过BLPOP和BRPOP实现阻塞式消费,避免轮询开销。
  • 发布/订阅:通过PUBLISH和SUBSCRIBE实现生产和消费,适合实时通知场景,但是无持久化和确认机制,订阅者必须在线才能接收到消息。
  • 有序集合:可以用于实现带优先级的消息队列和延迟队列,例如滴滴打车正在排队的用户队列。
  • 流Stream:专为消息队列和实时数据流设计,支持消费组、消息持久化和消息确认。适用于实时日志处理、任务队列、事件流、数据管道(数据流处理系统)等。

下面详细介绍流Stream实现消息队列:

  • 添加消息到队列中。
XADD mystream * field1 value1 field2 value2
  • 读取消息,从指定流的0起始位置,读取两条消息。
XREAD COUNT 2 STREAMS mystream 0
  • 创建消费组,从0开始消费。
XGROUP CREATE mystream mygroup 0
  • 消费组模式消费消息,STREAMS mystream >表示从未消费的消息开始读取。
XREADGROUP GROUP mygroup consumer1 COUNT 2 STREAMS mystream >
  • 确认消息
XACK mystream mygroup 1683542400000-0
  • 查看未确认消息
XPENDING mystream mygroup

分布式锁

分布式锁是一种用于在分布式系统中控制对共享资源访问的机制。确保在多个节点/进程之间,某一个时刻只有一个节点能够访问某个资源,从而避免资源竞争和数据不一致的问题。Redis提供高性能和简单的API,适合实现分布式锁。

我们认为每一个节点都具有各自的唯一ID,接着我们在Redis中设置一个键值对,值为节点ID,键为分布式锁标识。NX参数表示,当该键值对不存在时才插入,实现对资源的互斥访问。PX表示设置过期时间,避免死锁,或资源被某一节点一直占用。实现分布式锁的Redis命令为:

SET lock_key unique_value NX PX 30000 

总结

Redis主要被用于实现缓存、消息队列和分布式锁。还有一些场景没写,之后有时间再来补充。