redisによる高併発秒殺のJAVA-DEMO実現!redis watch楽観ロックに基づく

2190 ワード

	public static void testWatch() throws Exception {
		Jedis jedis = null;
		try {

			jedis = ConnectionManager.getConnection();//   jedis  

			String key_s = "user_name";//      
			String key = "test_count";//     
			String clientName = UUID.randomUUID().toString().replace("-", "");//     

			while (true) {
				try {
					jedis.watch(key);// key     
					System.out.println("  :" + clientName + "     ");
					System.out.println("       :" + jedis.get(key));
					int prdNum = Integer.parseInt(jedis.get(key));//       
					if (prdNum > 0) {
						
						Transaction transaction = jedis.multi();//           
						transaction.set(key, String.valueOf(prdNum - 1));
						List result = transaction.exec();//        
						if (result == null || result.isEmpty()) {
							System.out.println("  :" + clientName + "      ");//    watch-key     ,          
						} else {
							jedis.sadd(key_s, clientName);//          
							System.out.println("  :" + clientName + "    ");
							break;
						}
					} else {
						System.out.println("   0,  :" + clientName + "      ");
						break;
					}
				} catch (Exception e) {
					e.printStackTrace();
				} finally {

					jedis.unwatch();// exec,discard,unwatch              

				}
			} // while
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("redis bug:" + e.getMessage());
		} finally {
			//   jedis  
			try {
				ConnectionManager.closeConnection(jedis);
			} catch (Exception e) {
				System.out.println("redis bug:" + e.getMessage());
				// TODO Auto-generated catch block

			}
		}

	}

基本ロジック1は、keyが500個の商品2、jedisに設定.watch(key);//keyに楽観ロック3,Transaction transaction=jedis.multi();//トランザクション・ブロックの開始をマークします.4,transaction.set(key, String.valueOf(prdNum - 1));//value 5、List result=transactionを変更します.exec();//原子性実行事物result==null|result.isEmpty()はすべて失敗6、jedis.unwatch();//exec,discard,unwatchコマンドは、接続中のすべての監視7,ConnectionManagementをクリアします.closeConnection(jedis);//解放jedis接続これはすべて知っているはずです......
スレ主はすでに500個のスレッドでOKのをテストしたことがあります