当前位置:   article > 正文

redission 配置与限流 仅有代码思路_redission实现限流器

redission实现限流器

第一点 导入配置

  1. ​​​​​​​<dependency>
  2. <groupId>org.redisson</groupId>
  3. <artifactId>redisson</artifactId>
  4. <version>3.12.0</version>
  5. </dependency>
  6. spring.redis.port=6379
  7. spring.redis.host=***.***.***.***

第二点 配置 分布式锁 和 redissonClient 的@bean配置

  1. ​​​​​​​@Configuration
  2. public class RedissonClientConfig {
  3. @Bean
  4. public RedissonClient redissonClient(){
  5. //创建一个Redisson配置对象 Config。
  6. Config config = new Config();
  7. //调用 useSingleServer 方法,选择单机模式,并指定 Redis 服务器的地址
  8. config.useSingleServer().setAddress("redis://***.***.***.***:6379");
  9. //调用 setConnectionMinimumIdleSize 方法,设置连接池最小空闲连接数为 10
  10. config.useSingleServer().setConnectionMinimumIdleSize(10);
  11. //调用 Redisson.create 方法,创建一个 RedissonClient 对象,该对象可以用于连接和操作 Redis 数据库
  12. RedissonClient redissonClient = Redisson.create(config);
  13. return redissonClient;
  14. }
  15. }
  16. //注意:这段代码连接的 Redis 服务器地址为 "redis://***.***.***.***:6379",如果该地址是无法连接成功的话,需要确认 Redis 服务器是否已经启动,并检查网络连接是否正常。另外,还需要根据实际情况调整连接池参数,以保证系统的性能和稳定性。

第三点 可以写 简略版分布式锁

  1. //上锁/下锁
  2. @RequestMapping("/lock")
  3. public Result lock(Long id){
  4. //每一把锁 都有直接的解锁线程在底层 所以线程 无法互相开锁
  5. //创建锁 获取到锁对象Rlock
  6. RLock lock = redissonClient.getLock("category_" + id);
  7. try {
  8. //判断锁的状态
  9. boolean flag = lock.tryLock();
  10. if(!flag){
  11. return Result.error(501,"访问失败");
  12. }
  13. System.out.println("开始");
  14. //给锁加时长
  15. lock.lock(3, TimeUnit.SECONDS);
  16. //沉睡3
  17. Thread.sleep(3000L);
  18. System.out.println("结束");
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }finally {
  22. //强制释放锁在 finally 块中强制释放锁,确保锁一定会被释放,避免出现死锁等问题
  23. lock.forceUnlock();
  24. }
  25. return Result.success(null,"成功");
  26. }
  27. //注意:需要注意的是,分布式锁的使用场景需要谨慎考虑,因为如果并发量过高,可能会造成锁争用严重,导致系统性能下降。此外,在设置锁的超时时间时,应该根据实际情况进行调整,避免锁的超时时间设置太短或太长,从而影响系统性能和稳定性。

第四点 限流操作

  1. //限流 每5秒执行一次 令牌桶算法
  2. @RequestMapping("/rateLimit")
  3. public Result rateLimit(Long id){
  4. //创建一个名为 "category_rateLimiter_" + id 的令牌桶对象,并使用 RedissonClient 对象 redissonClient 获取该令牌桶对象 RRateLimiter
  5. RRateLimiter rateLimiter = redissonClient.getRateLimiter("category_rateLimiter_" + id);
  6. //使用 trySetRate() 方法设置令牌发放速率,每 5 秒发放 1 个令牌
  7. rateLimiter.trySetRate(RateType.OVERALL,1,5, RateIntervalUnit.SECONDS);
  8. //使用 tryAcquire() 方法尝试从令牌桶中获取一个令牌,如果获取令牌成功,则可以进行访问;否则返回访问失败提示信息。此处限流的方式是控制请求发送的速率,使用令牌桶算法来平稳地控制进入系统的请求数量和频率
  9. boolean flag = rateLimiter.tryAcquire(1);
  10. if(!flag){
  11. return Result.error(501,"访问频繁");
  12. }
  13. return Result.success(null,"成功");
  14. }
  15. //注意:令牌桶算法能够平滑地限制请求的发送速率,避免系统瞬间被大量请求压垮,但是如果访问者在短时间内发起大量请求,也有可能导致系统出现性能问题。因此,在设计限流策略时,还需要对请求频率的控制进行限制,比如设置一个固定的时间窗口内最多允许发送多少个请求。
 
  1. //于 Redisson 实现的限流示例 最多容纳5个车位
  2. @RequestMapping("/semaphore")
  3. public Result semaphore(Long id){
  4. //限流
  5. RSemaphore semaphore = redissonClient.getSemaphore("category_semaphore_" + id);
  6. //设置信号量的容量,即最多容纳 5 个车位,使用 trySetPermits() 方法设置。
  7. semaphore.trySetPermits(5);
  8. //如果需要展示限流效果,可以使用 Thread.sleep() 方法沉睡一段时间,模拟使用者占用许可的时间
  9. try {
  10. Thread.sleep(10000);
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. //使用 tryAcquire() 方法尝试获取一个许可,如果获取许可成功,则进入访问限制区;否则返回访问失败提示信息。此处限流的方式是使用信号量控制并发访问的数量,当已有 5 个访问者时,后续的访问者需要等待之前的访问者释放许可才能进行访问
  15. boolean flag = semaphore.tryAcquire(1);
  16. if(!flag){
  17. return Result.error(501,"访问受限失败");
  18. }
  19. return Result.success(null,"成功");
  20. }
  21. //注意:限流的实现必须适合具体场景,不能滥用,否则可能会影响正常业务操作,甚至导致系统崩溃。因此,在设计限流策略时,需要综合考虑请求频率、资源情况、业务特点等因素,在性能和稳定性之间寻找平衡点。


                
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/883841
推荐阅读
相关标签
  

闽ICP备14008679号