Redis与RabbitMQ共同使用多线程(多消耗者)处理处罚消息

[复制链接]
发表于 2026-2-6 00:55:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
弁言

并发引起的服务器瓦解黑白经常见的征象,为相识决这一标题,现在盛行使用缓存数据库与消息队列搭配使用。在近来的项目中也是使用到这一本事,本篇文章通过一个案例为各人展示该套方案怎样使用。
案例形貌与流程

本案例是一个经典的并发下单的案例。在Redis中存在一条key为Apple,Value为10000的数据,为防止超卖标题的发生使用Redisson分布式锁克制超卖(在Redis办理超卖Demo这篇文章中已经讲过),在一个线程拿到锁而且符合下单条件则直接返回下单乐成同时发送消息,使用AMQP监听队列消息,通过线程池创建多个线程作为消耗者举行底层DB的更新。
   

  情况预备

创建模块名为Redis

   

  yml设置文件的编写

  1. server:
  2.   port: 9000
  3. spring:
  4.   application:
  5.     name: redis
  6.   datasource:
  7.     driver-class-name: com.mysql.jdbc.Driver
  8.     url: jdbc:mysql://localhost:3306/user?useSSL=false
  9.     username: root
  10.     password: 123456
  11.   redis:
  12.     host: 192.168.136.130
  13.     port: 6379
  14.     password: 123456
  15.     lettuce:
  16.       pool:
  17.         max-active: 10
  18.         max-idle: 10
  19.         min-idle: 1
  20.         time-between-eviction-runs: 10s
  21.   rabbitmq:
  22.     host: 192.168.136.130  #MQ地址
  23.     port: 5672        #端口
  24.     virtual-host: /   #虚拟主机
  25.     username: demo   #用户密码
  26.     password: 123321
  27.     connection-timeout: 1s
  28.     template:
  29.       retry:  #重试机制
  30.         enabled: true
  31.         initial-interval: 1000ms
  32.         multiplier: 1
  33.         max-attempts: 3
  34.     publisher-confirm-type: correlated
  35.     publisher-returns: true
复制代码
Controller Test类的编写

  设置路径为  /testAddsetxAddFinally
  1. @RestController
  2. @RequestMapping("/")
  3. public class Test {
  4.     @Autowired
  5.     private RedisTemplate redisTemplate;
  6.     @Autowired
  7.     private RabbitTemplate rabbitTemplate;
  8.     /*使用setnx锁,同时给锁释放过期时间,自动释放锁
  9.     * */
  10.     @RequestMapping("testAddsetxAddFinally")
  11.     String cherkAndReduceStockAddSetnxAddFinally()
  12.     {
  13.         Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock-stock", "0000",2, TimeUnit.SECONDS);
  14.         //获取锁失败,停止50ms,递归调用
  15.         if (!lock){
  16.             try {
  17.                 Thread.sleep(3000);
  18.                 this.cherkAndReduceStockAdd
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表