Redis和請求佇列解決高併發

2021-09-24 03:51:28 字數 2244 閱讀 5791

準備工作,查詢商品資訊,將剩餘數量同步到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...