限流+共享session redis实现

简介: 【10月更文挑战第7天】

限流

背景:
使用EXPIRE命令,结合INCR操作,可以实现API的限流功能,防止系统被过度访问
案例:
在线视频平台有一个获取视频元数据的API,当流量高峰期时,比如电视剧更新,这个API会收到大量并发请求,导致后端服务压力增加。
优点:

  1. 保障稳定性:通过限流,可以防止系统在高负载下崩溃,确保核心服务的稳定性
  2. 服务公平性:不同用户和客户端在高并发环境下公平地使用服务
  3. 防止滥用:限制API地调用频率,防止恶意攻击

具体方案:

  1. 请求计数:每次API收到请求后,先用INCR命令对特定的key进行递增操作
  2. 设置过期时间:使用EXPIRE命令为计数key设置过期时间,这就是限流的时间窗口,例如1秒
  3. 检查请求频率:如果请求计数超过阈值,比如每秒100次,则拒绝新的请求进行排队

共享session

背景:

多服务器的web应用里,在不同的服务器上请求时都能保持登录状态,实现会话共享

案例:

一个大型的电商平台里,使用多个服务器来处理用户请求以提高可用性和伸缩性。当用户登录后,会话信息session需要在所有服务器共享,以确保无论哪个请求到达服务器,都能识别其登录状态

优点:

  1. 用户体验:无需重复登录
  2. 系统可靠性:集中管理session减少了因服务器故障导致用户登录状态丢失的风险
  3. 伸缩性:易于扩展系统以支持更多服务器,session管理不受影响

具体方案:

使用Redis的String类型集中存储和管理用户Session信息

  • 存储Session:用户登录后将用户的唯一标识(如Session ID)和用户信息序列化后存储在Redis里
  • 验证Session:每次用户请求时,通过请求中的session ID从Redis获取session信息,验证用户状态
  • 更新Session:用户活动时,更新session信息
  • 过期策略:设置过期时间

注意事项:

  • String类型的值可以为任意形式的文本或二进制数据,最大容量为512MB
  • 用String类型做计数器要保证操作的原子性
  • 分布式锁的使用要注意锁的释放和超时机制,防止死锁的发生
  • 存储对象时,要考虑序列化和反序列化的成本,以及数据的压缩和安全性
  • 在使用String类型作为缓存时,需要合理设置过期时间
目录
相关文章
|
5月前
|
存储 算法 NoSQL
百度面试:如何用Redis实现限流?
百度面试:如何用Redis实现限流?
73 2
|
4月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
6月前
|
算法 NoSQL Java
springboot整合redis及lua脚本实现接口限流
springboot整合redis及lua脚本实现接口限流
266 0
|
4月前
|
NoSQL Redis
简单5步实现接口限流 Redis
简单5步实现接口限流 Redis
|
5月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
198 0
|
5月前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
100 0
|
6月前
|
存储 算法 NoSQL
|
6月前
|
算法 NoSQL API
使用redis进行限流
使用redis进行限流
324 1
|
6月前
|
负载均衡 NoSQL Java
Spring Boot + Redis 处理 Session 共享
Spring Boot + Redis 处理 Session 共享
65 1
|
6月前
|
缓存 NoSQL Java
【亮剑】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护,如何使用注解来实现 Redis 分布式锁的功能?
【4月更文挑战第30天】分布式锁是保证多服务实例同步的关键机制,常用于互斥访问共享资源、控制访问顺序和系统保护。基于 Redis 的分布式锁利用 SETNX 或 SET 命令实现,并考虑自动过期、可重入及原子性以确保可靠性。在 Java Spring Boot 中,可通过 `@EnableCaching`、`@Cacheable` 和 `@CacheEvict` 注解轻松实现 Redis 分布式锁功能。
122 0