Redis 通常应用于哪些场景?

Sherwin.Wei Lv7

Redis 通常应用于哪些场景?

回答重点

1)缓存

  • Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。例如,常用的用户会话数据和页面渲染结果可以存储在 Redis 中。

2)实时系统

  • Redis 支持快速的数据写入和读取,非常适合用于实时分析,如网站点击统计、实时排行榜等。

3)消息队列

  • 利用 Redis 的 List 和 Pub/Sub 功能,可以实现轻量级的消息队列,适用于任务处理和异步消息传递。

4)分布式锁

  • Redis 可以用作分布式锁的实现,确保在分布式系统中资源的安全访问,避免竞态条件。

5)计数器

  • Redis 的原子性操作非常适合用作计数器。例如,可以使用 Redis 来统计页面访问量、点赞数、评论数等。通过 INCR 命令可以轻松实现高效的计数。

Snipaste_2024-05-03_21-52-19.jpg

扩展知识

Redis 的用途有很多,这里再介绍下回答重点提到的几个常见的场景,更多场景需要结合项目去进行拓展。

1. Redis 缓存

因为 Redis 是基于内存的,其读写速度比 MySQL 基于磁盘的方式要快很多,所以其作为热点数据的缓存是非常合适的。使用 Redis 缓存可以极大地提高应用的响应速度和吞吐量。

举一个例子,如下图所示,用户访问 Web 服务的时候,可以先查询缓存,如果缓存未命中的话,去查询数据库(这里建议去查询数据库的时候加锁,防止多个请求同时打到数据库,导致数据库查询效率不高),如果数据库中有对应的数据,则写入 Redis 缓存中,并返回给用户,如果数据库没有对应的数据的话,可以写入 null 值到缓存中,应对缓存穿透问题。

Snipaste_2024-05-03_20-35-00.jpg

2. 分布式锁

本地锁(synchronized、lock)在很多时候已经满足不了我们的需求,特别是现在大部分企业都使用了微服务框架,不同实例之间的锁需要依赖外部系统进行一致性锁定,因此就需要用上分布式锁。

Redis 就是很好的一个外部系统,它基于缓存使得加锁非常高效,天然的过期机制可以很好地避免死锁的发生,且配合 redission 这种封装好的类库,使用起来也非常简便:

Snipaste_2024-05-03_21-30-14.jpg

3. 计数器

Redis 由于其单线程执行命令的特性,实现计数器非常方便,不会有锁的竞争。像文章的点赞数量就可以使用 Redis 实现。

再如一些海量数据的统计,例如大网站的访问统计、日活月活等,适合使用 Redis 提供的高级数据结构 HyperLogLog。

它基于基数估算算法实现。优点就是所需的内存不会随着集合的大小而改变,因此很适合大规模数据集统计的场景,不过它的统计值是不精确的,有一定的误差,但是在海量数据场景,这些误差一般是可以接受的。

4. 消息队列

在一些简单场景,也可以利用 Redis 来实现消息队列功能。例如使用列表的 lpush 实现消息的发布,rpop 实现消息的消费。也可以使用 Redis 5.0 之后引入的 stream 这个数据结构来实现消息功能。

但是要注意,用 Redis 来实现消息队列肯定比不上正常的消息队列中间件,例如无法保证消息的持久性,即使有 aof 和 rdb 也无法保证消息一定不会丢。

在大型系统或正常的业务场景下,如果要使用消息队列还是得用 RocketMQ、Kafka 等,不推荐使用 Redis 来实现。

5. 实时系统的构建

由于 Redis 高性能的特性,其经常被用于构建实时系统,比如抽奖、秒杀等,最常见的还有排行榜的实现,其可以使用 Redis 的 Zset 数据结构,根据用户的分数、时间等参数构建一个实时的排行榜。

主要就列举这些了,更多的场景可以结合你的项目去拓展,比如登录鉴权、限流、会话等,都是可以的。

Comments