关于rabbitMQ和redis整合

关于rabbitMQ与redis整合所需要所需要的包有:

spring-webmvc 、spring-data-redis、jedis、redisson、amqp-client、log4j-core、log4j-api、log4j-core、log4j-api、spring-rabbit、log4j、jackson-core、jackson-databind、jackson-annotations等

在porm.xml 下配置好:

 


	4.0.0
	s69-rabbitmq
	s69-rabbitmq
	0.0.1-SNAPSHOT
	war
	s69-rabbitmq
	
	
		UTF-8
		4.3.20.RELEASE
	
	

		
		
			org.springframework
			spring-webmvc
			${spring.version}
		


		
		
			org.springframework.data
			spring-data-redis
			1.7.2.RELEASE
		

		
		
			redis.clients
			jedis
			2.9.0
		

		
			org.redisson
			redisson
			3.5.7
		

		
		
			com.rabbitmq
			amqp-client
			5.0.0
		
		
			
		
			org.apache.logging.log4j
			log4j-core
			2.11.1
		

		
		
			org.apache.logging.log4j
			log4j-api
			2.11.1
		

		
		
			org.apache.logging.log4j
			log4j-core
			2.9.0
		
		
		
			org.apache.logging.log4j
			log4j-api
			2.9.0
		


		
		
			org.springframework.amqp
			spring-rabbit
			2.0.0.RELEASE
		

		
		
			log4j
			log4j
			1.2.17
		

		
		
			com.fasterxml.jackson.core
			jackson-core
			2.9.1
		
		
			com.fasterxml.jackson.core
			jackson-databind
			2.9.1
		
		
			com.fasterxml.jackson.core
			jackson-annotations
			2.9.1
		



		
			javax
			javaee-api
			7.0
			provided
		
		
			org.glassfish.web
			javax.servlet.jsp.jstl
			1.2.2
		
	
	
		
			
				maven-compiler-plugin
				2.3.2
				
					1.7
					1.7
				
			
			
				maven-war-plugin 
				2.2
				
					3.1
					false
				
			
		
	

然后za再把配置文件配置好,首先配置redis和redisson,这里不加赘述。可以在上篇的https://blog.csdn.net/qq_37186247/article/details/84197708

再配置好spring-task定时器配置文件,代码如下:




	

	
	

   

再把关于定时的javada代码写好:

package com.service;

import java.util.concurrent.TimeUnit;

import javax.ejb.Schedule;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;


@Service
public class TaskMiaosha {
	
	@Autowired
	private RedisTemplate  redisTemplate;
	
	@Autowired 
	private RedissonClient redissonClient;
	
	@Scheduled(cron="0/5 * * * * ? ") 
	public void removeExpireUser() throws InterruptedException {
		RLock rLock = redissonClient.getLock("task_lock");
		boolean f = rLock.tryLock(0,5,TimeUnit.SECONDS);
		if(f){
			long t = System.currentTimeMillis() - 24 * 60 * 60 * 1000;
			redisTemplate.boundZSetOps("miaosha_iphone").removeRange(0, t);
			Thread.sleep(4000);
			rLock.unlock();
			System.out.println("执行了删除");
		}else{
			System.out.println("跳过了这次操作");
		}
	}
}

上面代码中的@scheduled(cron)是设置一个定时,其中里面的 0/5 * * * * ? 指的是秒、分、时、日、月、星期,其中‘?’是指让其自动计算,根据不同的日子计算不同的星期, 0/5 * * * * ?指的是每隔在5秒执行一次(比如0 5 10  .。。。。);

tryLock()方法:等待几秒后执行,执行多久解锁,时间单位。

if里面的是删除redis中的在24小时前的数据。

在写Miaosha这个方法。

package com.service;

import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

@Service
public class MiaoShaService {

	@Autowired
	private RedisTemplate redisTemplate;
	
	@Autowired
	private RedissonClient  redissonClient;
	
	@Autowired
	private RabbitTemplate rabbitTemplate;

	public int miaosha(String username) {
		// 加锁
		RLock rLock =redissonClient.getLock("lock_redis");
		
		rLock.lock();
		
		// 得库存
		int num = Integer.parseInt(redisTemplate.boundValueOps("iphone").get()
				.toString());
		if (num < 1)
			return -1;
		
		//如果用户已经秒过就不能再秒
		Long result = redisTemplate.boundZSetOps("miaosha_users").rank(username+":iphone");
		if (result!=null)
		{
			System.out.println("用户:"+username+"已经秒过,不能重复秒");
			return -2;
		}
		// 数量-1
		redisTemplate.boundValueOps("iphone").increment(-1);

		//秒成功,加入集合
		redisTemplate.boundZSetOps("miaosha_users").add(username+":iphone", System.currentTimeMillis());
		 
		//发消息队列 
		rabbitTemplate.convertAndSend("miaosha", username+":iphone");
		
		//解锁
		rLock.unlock();
		
		return 0;//成功
	}

}

在写rabbitMQ的配置文件:




    

    
    
    
    
    
     
    
    
    
    
    
    
    
    
          
                   
          
    
 
	

在编写一个接收的方法:

	package com.mq;
	
	import java.io.UnsupportedEncodingException;
	
	import org.springframework.amqp.core.Message;
	import org.springframework.amqp.core.MessageListener;
	
	public class MiaoshaListen implements MessageListener {
	
		@Override
		public void onMessage(Message msg) {
			try {
				String str = new String(msg.getBody(),"utf-8");
				System.out.println("接收到消息:"+str);
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			
		}
		
	}

再ji进行测试:

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.service.MiaoShaService;

public class 测试基本秒杀 {
	public static void main(String[] args) {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		MiaoShaService miaoShaService = applicationContext.getBean(MiaoShaService.class);
		miaoShaService.miaosha("杀");
	}
}

 

你可能感兴趣的:(并发,database)