限流+共享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类型作为缓存时,需要合理设置过期时间
目录
相关文章
|
17天前
|
NoSQL 算法 Java
Java Redis多限流
通过本文的介绍,我们详细讲解了如何在Java中使用Redis实现三种不同的限流策略:固定窗口限流、滑动窗口限流和令牌桶算法。每种限流策略都有其适用的场景和特点,根据具体需求选择合适的限流策略可以有效保护系统资源和提高服务的稳定性。
42 18
|
7月前
|
存储 算法 NoSQL
百度面试:如何用Redis实现限流?
百度面试:如何用Redis实现限流?
82 2
|
6月前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
115 1
|
8月前
|
算法 NoSQL Java
springboot整合redis及lua脚本实现接口限流
springboot整合redis及lua脚本实现接口限流
296 0
|
6月前
|
NoSQL Redis
简单5步实现接口限流 Redis
简单5步实现接口限流 Redis
|
7月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
232 0
|
7月前
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
126 0
|
8月前
|
存储 算法 NoSQL
|
8月前
|
算法 NoSQL API
使用redis进行限流
使用redis进行限流
403 1
|
8月前
|
负载均衡 NoSQL Java
Spring Boot + Redis 处理 Session 共享
Spring Boot + Redis 处理 Session 共享
82 1