Redis 业务场景
更新: Invalid Date 字数: 0 字 时长: 0 分钟
redis 在项目中的应用场景有哪些?
Redis 本质是一个基于内存的 key-value 缓存数据库,基于此,redis 常有的应用场景有:
- 缓存:常用于热点数据和查询数据的缓存,减少数据库的压力
- 分布式锁:防止重复提交;防止超卖;保证分布式环境下的互斥
- 限流:利用计数器和 lua 脚本实现接口限流、短信发送限制、登录失败次数限制等
- 消息队列:利用 List 和 Redis Stream 实现消息队列,用于异步任务和流量削峰
- 计数器/统计:访问量统计;点赞数统计;浏览次数统计;
- 排行榜: 利用 Zset(有序集合)实现(支持按 score 排序);
- 分布式共享数据的访问
Redis 单线程为什么还能支撑十万 QPS?
Redis 单线程仍然能支撑十万级 QPS,核心原因是:
- 基于内存操作
- I/O 多路复用模型
- 单线程执行命令避免了锁竞争和上下文切换,在 I/O 密集场景下效率更高。
- Redis 使用高度优化的数据结构,并采用 C 语言实现,进一步提升了性能。
- Redis 6 之后网络 I/O 支持多线程,但命令执行仍然是单线程。
Redis如何实现延迟队列
两个方案:Zset实现和过期监听。推荐使用Zset实现,过期监听不准确且可能会丢失事件
Zset实现,score存储时间戳,后台轮询。利用 score 存储任务执行时间,消费者通过 rangeByScore 获取已到期任务,再通过 ZREM 抢占消费,为了避免重复消费,会先删除再执行
为什么避免使用redis过期监听来实现延迟任务
过期事件可能丢失 若设置过期监听后,redis宕机,宕机期间的过期事件会丢失
Redis的过期事件不是持久化
Redis分布式锁应用场景
- 秒杀下单
- 防止重复提交
- 用户操作并发控制
- 定时任务互斥执行
Redis分布式锁(setNX)有哪些问题?
锁续期问题
redis分布式锁过期后不会自动续期,若此时业务未完成,则会导致并发问题
重入锁问题
例如在方法A中获取锁,方法A中调用方法B,方法B也需要获取同一把锁,这个时候涉及到重入锁问题,而一般的redis锁是不支持重入锁的
Redis主从切换问题
主节点写入锁还未同步到从节点,主节点就挂了。此时就会导致多个客户端同时获取到锁
