当前位置: 首页 > news >正文

哪些网站是用php编写的所有北京网站建设公司

哪些网站是用php编写的,所有北京网站建设公司,wordpress制作单页,网上商城包括什么类型在高并发的分布式系统中#xff0c;限流是保证服务稳定性的重要手段之一。通过限流机制#xff0c;可以控制系统处理请求的频率#xff0c;避免因瞬时流量过大导致系统崩溃。Redis 是一种高效的缓存数据库#xff0c;具备丰富的数据结构和原子操作#xff0c;适合用来实现… 在高并发的分布式系统中限流是保证服务稳定性的重要手段之一。通过限流机制可以控制系统处理请求的频率避免因瞬时流量过大导致系统崩溃。Redis 是一种高效的缓存数据库具备丰富的数据结构和原子操作适合用来实现分布式环境下的限流。 本文将结合 Spring Boot 和 Redis详细讲解如何实现基于 Redis 的限流功能包括应用场景、实现原理、具体过程以及效果分析。 一、限流的应用场景 限流在各种场景中扮演着重要角色以下是几个典型的使用场景 接口防刷防止恶意用户或爬虫频繁访问某些接口导致服务负载过高。API 调用频率控制对外部 API 提供服务时限制用户调用频率避免超出系统处理能力。短信验证码发送短信验证码时限制同一用户的发送频率防止滥用。交易场景在抢购或秒杀系统中限制用户请求的频次防止瞬时高并发请求导致服务器宕机。 二、限流的实现原理 Redis 实现限流通常采用以下几种方式 固定窗口限流在固定的时间窗口内限制请求的次数。例如每分钟最多允许 100 次请求。滑动窗口限流将固定时间窗口划分为多个小的时间段保证限流更平滑和公平。令牌桶算法限制访问速率按照固定的速率往令牌桶中放置令牌用户每次请求必须获取一个令牌才能通过。漏桶算法按照固定的速率处理请求若请求过多则溢出丢弃。 本文主要使用固定窗口和滑动窗口两种方法进行 Redis 限流的实现。 三、基于 Redis 实现限流的步骤 1. 项目配置 首先创建一个 Spring Boot 项目并引入 Redis 相关依赖。 dependencies!-- Spring Boot Starter for Redis --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- Spring Boot Web Starter --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency /dependencies在 application.properties 中配置 Redis 连接 spring.redis.hostlocalhost spring.redis.port6379 spring.redis.passwordyourpassword2. 实现固定窗口限流 固定窗口限流的核心思路是每个用户在一个固定时间窗口如 1 分钟内只能发起 N 次请求。Redis 提供的 INCR 和 EXPIRE 命令可以高效地实现这一限流机制。 我们可以通过以下步骤来实现固定窗口限流 检查 Redis 中该用户的访问计数如果不存在则创建并设置有效期为 1 分钟。如果计数未达到阈值允许访问并增加计数。如果计数超过阈值拒绝请求。 首先创建 RateLimiterUtil 工具类。 import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;Component public class RateLimiterUtil {private final StringRedisTemplate redisTemplate;public RateLimiterUtil(StringRedisTemplate redisTemplate) {this.redisTemplate redisTemplate;}/*** 基于固定窗口的限流* param key 限流标识* param limit 限流次数* param windowSize 时间窗口大小秒* return 是否允许访问*/public boolean isAllowed(String key, int limit, long windowSize) {Long count redisTemplate.opsForValue().increment(key);if (count 1) {// 第一次访问设置过期时间redisTemplate.expire(key, windowSize, TimeUnit.SECONDS);}return count limit;} }3. 使用固定窗口限流进行接口请求控制 接下来我们可以在需要限流的接口上使用 RateLimiterUtil 来控制请求的频率。 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;RestController public class ApiController {Autowiredprivate RateLimiterUtil rateLimiterUtil;private static final String LIMIT_KEY api_limit;GetMapping(/api/resource)public String getResource() {// 限制每个用户每分钟最多访问 10 次boolean isAllowed rateLimiterUtil.isAllowed(LIMIT_KEY, 10, 60);if (!isAllowed) {return 访问频率过高请稍后再试;}return 访问成功;} }4. 实现滑动窗口限流 相比固定窗口滑动窗口限流可以更细粒度地控制请求频率避免流量高峰时集中在某个时间段。 滑动窗口的核心思想是将一个大时间窗口划分为多个小的时间段每次请求都会在 Redis 中记录当前时间段的请求次数并删除过期的时间段数据。 可以通过 Redis 的 ZADD有序集合来记录请求的时间戳结合 ZRANGE 和 ZREM 来计算当前窗口内的请求次数。 import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component;import java.time.Instant;Component public class SlidingWindowRateLimiter {private final StringRedisTemplate redisTemplate;public SlidingWindowRateLimiter(StringRedisTemplate redisTemplate) {this.redisTemplate redisTemplate;}/*** 基于滑动窗口的限流* param key 限流标识* param limit 限流次数* param windowSize 时间窗口大小秒* return 是否允许访问*/public boolean isAllowed(String key, int limit, long windowSize) {long now Instant.now().getEpochSecond();long windowStart now - windowSize;// 使用 Redis 的有序集合记录请求时间redisTemplate.opsForZSet().add(key, String.valueOf(now), now);// 移除窗口之外的数据redisTemplate.opsForZSet().removeRangeByScore(key, 0, windowStart);// 统计窗口内的请求数Long requestCount redisTemplate.opsForZSet().zCard(key);if (requestCount ! null requestCount limit) {return false;}return true;} }5. 使用滑动窗口限流控制接口访问 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;RestController public class SlidingApiController {Autowiredprivate SlidingWindowRateLimiter slidingWindowRateLimiter;private static final String LIMIT_KEY sliding_api_limit;GetMapping(/api/sliding_resource)public String getResource() {// 限制每个用户每分钟最多访问 10 次boolean isAllowed slidingWindowRateLimiter.isAllowed(LIMIT_KEY, 10, 60);if (!isAllowed) {return 访问频率过高请稍后再试;}return 访问成功;} }四、限流效果分析 性能与效率基于 Redis 的限流具有较高的性能INCR、EXPIRE 和 ZADD 等操作都具备原子性且 Redis 本身可以高效处理大量并发请求适用于分布式系统。限流精度固定窗口限流简单易实现适用于对请求频率没有精细控制要求的场景滑动窗口限流能够提供更加平滑的限流体验避免了流量高峰。分布式扩展Redis 支持分布式部署适用于多实例环境中的限流需求能够保证多个节点对同一用户的请求进行统一控制。 五、其他优化与改进建议 限流规则动态调整可以通过 Redis 订阅发布模式Pub/Sub实现限流规则的动态调整适应不同的流量需求。用户维度限流在实际应用中限流往往根据不同用户、IP 地址等维度进行可以通过 key 动态拼接用户 ID 或 IP 来实现多维度限流。分布式缓存与 Redis 哨兵使用 Redis 的哨兵机制或集群模式来提高限流系统的可用性。
http://www.dnsts.com.cn/news/92475.html

相关文章:

  • 网站的设计路线网站做推广页需要什么软件下载
  • 婚恋网站排名前三网站建设 长期待摊
  • 长沙哪里有做网站的公司wordpress授权破解
  • 网站建设摘要如何做博客网站
  • 济源建设工程管理处网站怎么屏蔽ip段访问网站
  • 制作静态动漫网站模板域名交易的安全措施
  • 西安建筑科技大学就业信息网郑州优化网站
  • 网站建设错误要点怀化市建设局招投标网站
  • ps如何做切片网站按钮人才招聘网最新招聘2023
  • 官方网站怎么做广州有名的网站建设公司
  • 西安网站制作资源网站网页设计培训班
  • 做外贸进大公司网站建设通和天眼查网站
  • 沧州网站制作多少钱wordpress快速部署
  • php html5企业网站源码微信管理系统平台
  • 网站被管理员权限wordpress首页调用
  • 知名网站建设公司网站开发列表
  • 商丘做网站的价格微型购物网站建设模板
  • 怎么做视频平台网站自己制作网页的网站
  • 建设博客网站制作网站公司设计公司
  • 惠州网站搭建域名备案系统
  • 简洁网站首页html代码响应式网页设计答案
  • 西宁建一个网站公司做私人网站
  • 什么网站做设计可以赚钱吗joomla与wordpress哪个好
  • 网站制作在哪里的大庆网页制作收费
  • 免费简历模板的网站山东东营市是几线城市
  • 无锡鸿源建设集团有限公司网站云服务器 网站
  • 网站开发时的闭包写法高校网站建设研究意义
  • 网站举报12321wordpress下载官网
  • 什么网站可以接单做海报大连市建设局网站
  • 做网站1万多块钱软件开发服务公司