redis實現秒殺搶票功能

一,前言

實踐是檢驗真理的唯一標準,紙上得來終覺淺嘛!想認識一個人,光靠個人資料怎麼行,哪怕見面聊上那麼一兩句,那也是會產生很多偶然性的結果,俗話說,患難見真情,當然,此處不是讓你去患難,而是和redis進行一個簡單的交互,那其中機理雖不說詳識,但大致什麼樣子和總體印象還是會有的。話不多說,擼起袖子就是幹!

二,具體操作

1,打開eclipse,新建Maven工程,

2,額外導入jar包:

        <!-- redis工具包 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.0.1</version>
        </dependency>

3,代碼不多,就兩個類

(1)MyRedisTest.java

package com.spring.server.redis;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import redis.clients.jedis.Jedis;

public class MyRedisTest {
	public static void main(String args[]){
		final String watchKeys = "watchKeys";
		ExecutorService executor = Executors.newFixedThreadPool(20);//20個線程池併發。
		
		final Jedis jedis = new Jedis("127.0.0.1",6379);
		System.out.println(jedis.get("myKey"));
		jedis.set(watchKeys,"100");//設置起始的搶購數。
		jedis.close();
		
		for(int i = 0; i < 1000; i++){//設置1000個人來發起搶購
			executor.execute(new MyRunnable("user"+getRandomString(6)));
		}
		executor.shutdown();
	}

	private static String getRandomString(int length) {//length是隨機字符串長度
		String base = "abcdefghijklmnopqrstuvwxyz0123456789";
		Random random = new Random();
		StringBuffer sb  = new StringBuffer();
		for(int i = 0; i<length; i++){
			//該方法的作用是生成一個隨機的int值,該值介於[0,n)的區間,也就是0到n之間的隨機int值,包含0而不包含n。
			int number = random.nextInt(base.length());
			//charAt() 方法用於返回指定索引處的字符。索引範圍爲從 0 到 length() - 1。
			sb.append(base.charAt(number));
		}
		return sb.toString();
	}
}

 (2)MyRunnable.java

package com.spring.server.redis;

import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class MyRunnable implements Runnable {
	
	String watchKeys = "watchKeys";//監視keys
	Jedis jedis = new Jedis("127.0.0.1",6379);
	String userInfo;
	
	public void myRunnable(){
		
	}
	public MyRunnable(String uinfo){
		this.userInfo = uinfo;
	}

	@Override
	public void run() {
		try{
			jedis.watch(watchKeys);
			
			String val = jedis.get(watchKeys);
			int valint = Integer.valueOf(val);
			
			if(valint <= 100 && valint >=1){
				Transaction  tx  = jedis.multi();//開啓事務
				tx.incrBy("watchKeys",-1);
				List<Object> list = tx.exec();//提交事務,如果此時watchKeys被改動了,則返回null
				
				if(list == null || list.size()==0){
					 String failuserifo = "fail"+userInfo;
	                    String failinfo="用戶:" + failuserifo + "商品爭搶失敗,搶購失敗";
	                    System.out.println(failinfo);
	                    /* 搶購失敗業務邏輯 */
	                    jedis.setnx(failuserifo, failinfo);
				}else{
					for(Object succ : list){
						String succuserifo ="succ"+succ.toString() +userInfo ;
                        String succinfo="用戶:" + succuserifo + "搶購成功,當前搶購成功人數:"
                                + (1-(valint-100));
                        System.out.println(succinfo);
                        /* 搶購成功業務邏輯 */
                        jedis.setnx(succuserifo, succinfo);
					}
				}
			}else{
				String failuserifo = "kcfail" + userInfo;
                String failinfo1="用戶:" + failuserifo + "商品被搶購完畢,搶購失敗";
                System.out.println(failinfo1);
                jedis.setnx(failuserifo, failinfo1);
                // Thread.sleep(500);
                return;
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			jedis.close();
		}
	}
}

 4,點擊運行

 OK! 到這,與redis的互動結束了,你有什麼收穫呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章