準備工作,查詢商品資訊,將剩餘數量同步到redis中
jedis jedis = jedispool.getresource();
buygood good=buygoodservice.getbyid(good_id);
jedis.set("residue"+good_id, good.getresidue()+"");
jedispool.returnresource(jedis);
請求封裝物件
public class buyrequest
public void setbuyorders(buyorders buyorders)
public int getgood_id()
public void setgood_id(int good_id)
public int getorder_id()
public void setorder_id(int order_id)
public int getresponse_status()
public void setresponse_status(int response_status)
public int getuser_id()
public void setuser_id(int user_id)
}
處理請求的controller
@controller
public class buycontroller
//如果還有剩餘商品,就準備將請求放到請求佇列中
if(buyqueue==null)
if(buyqueue.remainingcapacity()>0)else
if(!dealqueuethread.excute)
//請求放入到佇列中,即完成下單請求
results.put("done", true);
results.put("msg", "下訂單成功");
} catch (exception e) finally
return results;
}}
處理請求的執行緒類
@component
public class dealqueuethread implements runnable
public dealqueuethread(buyqueuebuyqueue)
@postconstruct
public void init()
@override
public void run()
} catch (interruptedexception e) finally
}public synchronized void dealwithqueue(buyrequest buyreq)
//如果有剩餘商品,先在redis中將剩餘數量減一,再開始下訂單
jedis.decr("residue" + buyreq.getgood_id());
//將資料庫中將剩餘數量減一,這一步處理可以在佇列處理完成之後一次性更新剩餘數量
dealqueuethread.buygoodservice.minusresidue(buyreq.getgood_id());
//處理請求,下訂單
buyorders bo = new buyorders();
bo.setgood_id(buyreq.getgood_id());
bo.setuser_id(buyreq.getuser_id());
int order_id = dealqueuethread.buyordersservice.insert(bo);
buyorders orders = dealqueuethread.buyordersservice.getbyid(order_id);
buyreq.setorder_id(order_id);//訂單id
buyreq.setbuyorders(orders);//訂單資訊
buyreq.setresponse_status(1);//處理完成狀態
} catch (exception e)
}}
buyqueue:
public class buyqueue extends arrayblockingqueue
}
Redis高併發和高可用
如何保證 redis 的高併發和高可用?redis 的主從複製原理能介紹一下麼?redis 的哨兵原理能介紹一下麼?其實問這個問題,主要是考考你,redis 單機能承載多高併發?如果單機扛不住如何擴容扛更多的併發?redis 會不會掛?既然 redis 會掛那怎麼保證 redis 是高可用的?其實針...
利用Redis鎖解決高併發問題
這裡我們主要利用redis的setnx的命令來處理高併發。setnx 有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回 1。如果當前鍵存在,那麼會返回0。建立庫存表 create tablestorage idint 11 unsigned...
利用Redis鎖解決高併發問題
這裡我們主要利用redis的setnx的命令來處理高併發。setnx有兩個引數。第乙個引數表示鍵。第二個引數表示值。如果當前鍵不存在,那麼會插入當前鍵,將第二個引數做為值。返回1。如果當前鍵存在,那麼會返回0。建立庫存表 create table storage id int 11 unsigned...