Skip to content

Redis 业务场景

更新: Invalid Date 字数: 0 字 时长: 0 分钟

redis 在项目中的应用场景有哪些?

Redis 本质是一个基于内存的 key-value 缓存数据库,基于此,redis 常有的应用场景有:

  1. 缓存:常用于热点数据和查询数据的缓存,减少数据库的压力
  2. 分布式锁:防止重复提交;防止超卖;保证分布式环境下的互斥
  3. 限流:利用计数器和 lua 脚本实现接口限流、短信发送限制、登录失败次数限制等
  4. 消息队列:利用 List 和 Redis Stream 实现消息队列,用于异步任务和流量削峰
  5. 计数器/统计:访问量统计;点赞数统计;浏览次数统计;
  6. 排行榜: 利用 Zset(有序集合)实现(支持按 score 排序);
  7. 分布式共享数据的访问

Redis 单线程为什么还能支撑十万 QPS?

Redis 单线程仍然能支撑十万级 QPS,核心原因是:

  1. 基于内存操作
  2. I/O 多路复用模型
  3. 单线程执行命令避免了锁竞争和上下文切换,在 I/O 密集场景下效率更高。
  4. Redis 使用高度优化的数据结构,并采用 C 语言实现,进一步提升了性能。
  5. Redis 6 之后网络 I/O 支持多线程,但命令执行仍然是单线程。

Redis如何实现延迟队列

两个方案:Zset实现和过期监听。推荐使用Zset实现,过期监听不准确且可能会丢失事件

Zset实现,score存储时间戳,后台轮询。利用 score 存储任务执行时间,消费者通过 rangeByScore 获取已到期任务,再通过 ZREM 抢占消费,为了避免重复消费,会先删除再执行

为什么避免使用redis过期监听来实现延迟任务

  1. 过期事件可能丢失 若设置过期监听后,redis宕机,宕机期间的过期事件会丢失

  2. Redis的过期事件不是持久化

Redis分布式锁应用场景

  1. 秒杀下单
  2. 防止重复提交
  3. 用户操作并发控制
  4. 定时任务互斥执行

Redis分布式锁(setNX)有哪些问题?

  1. 锁续期问题

    redis分布式锁过期后不会自动续期,若此时业务未完成,则会导致并发问题

  2. 重入锁问题

    例如在方法A中获取锁,方法A中调用方法B,方法B也需要获取同一把锁,这个时候涉及到重入锁问题,而一般的redis锁是不支持重入锁的

  3. Redis主从切换问题

    主节点写入锁还未同步到从节点,主节点就挂了。此时就会导致多个客户端同时获取到锁

如有转载或 CV 的请标注本站原文地址