限流
背景:
使用EXPIRE命令,结合INCR操作,可以实现API的限流功能,防止系统被过度访问
案例:
在线视频平台有一个获取视频元数据的API,当流量高峰期时,比如电视剧更新,这个API会收到大量并发请求,导致后端服务压力增加。
优点:
- 保障稳定性:通过限流,可以防止系统在高负载下崩溃,确保核心服务的稳定性
- 服务公平性:不同用户和客户端在高并发环境下公平地使用服务
- 防止滥用:限制API地调用频率,防止恶意攻击
具体方案:
- 请求计数:每次API收到请求后,先用INCR命令对特定的key进行递增操作
- 设置过期时间:使用EXPIRE命令为计数key设置过期时间,这就是限流的时间窗口,例如1秒
- 检查请求频率:如果请求计数超过阈值,比如每秒100次,则拒绝新的请求进行排队
共享session
背景:
多服务器的web应用里,在不同的服务器上请求时都能保持登录状态,实现会话共享
案例:
一个大型的电商平台里,使用多个服务器来处理用户请求以提高可用性和伸缩性。当用户登录后,会话信息session需要在所有服务器共享,以确保无论哪个请求到达服务器,都能识别其登录状态
优点:
- 用户体验:无需重复登录
- 系统可靠性:集中管理session减少了因服务器故障导致用户登录状态丢失的风险
- 伸缩性:易于扩展系统以支持更多服务器,session管理不受影响
具体方案:
使用Redis的String类型集中存储和管理用户Session信息
- 存储Session:用户登录后将用户的唯一标识(如Session ID)和用户信息序列化后存储在Redis里
- 验证Session:每次用户请求时,通过请求中的session ID从Redis获取session信息,验证用户状态
- 更新Session:用户活动时,更新session信息
- 过期策略:设置过期时间
注意事项:
- String类型的值可以为任意形式的文本或二进制数据,最大容量为512MB
- 用String类型做计数器要保证操作的原子性
- 分布式锁的使用要注意锁的释放和超时机制,防止死锁的发生
- 存储对象时,要考虑序列化和反序列化的成本,以及数据的压缩和安全性
- 在使用String类型作为缓存时,需要合理设置过期时间