service層 高併發秒殺案例

2021-09-13 18:38:12 字數 3229 閱讀 5552

一、service層介面設計

業務介面設計應當站在「使用者」角度設計介面,應遵循三個規範:合理的命令,明確的引數,返回結果(正常介面/異常結果)。建立設計的業務邏輯介面如下:

public inte***ce seckillservice

public seckill getbyid(long seckillid)

public exposer exportseckillurl(long seckillid)

date starttime=seckill.getstarttime();

date endtime=seckill.getendtime();

//系統當前時間

date nowtime=new date();

if(nowtime.gettime()endtime.gettime())

string md5=ge***5(seckillid);

return new exposer(true,md5,seckillid);

}private string ge***5(long seckillid)

@transactional

/** *使用註解控制事務方法的優點

* 1:開發團隊達成一致約定,明確標註事務方法的程式設計風格

* 2:保證事務方法的執行時間盡可能短,不要穿插其他網路請求,rpc/http請求或者剝離到事務方法外

* 3:不是所有的方法都需要事務,如只有一條修改操作,唯讀操作不需要事務控制

*/public seckillexecution executeseckill(long seckillid, long userphone, string md5) throws seckillexception, repeatkillexception, seckillcloseexception

//執行秒殺邏輯:減庫存+記錄購買行為

date nowtime=new date();

try elseelse

}}catch(seckillcloseexception e1) catch (repeatkillexception e2) catch (exception e)

}//丟擲異常是為了告訴spring是否rollback,此處使用儲存過程的話,就不需要拋異常了

public seckillexecution executeseckillprocedure(long seckillid, long userphone, string md5)

date killtime=new date();

mapmap=new hashmap();

map.put("seckillid",seckillid);

map.put("phone",userphone);

map.put("killtime",killtime);

map.put("result",null);

//執行儲存過程,result被賦值

try else

} catch (exception e)

}三、sping託管 service的實現類

本專案採用spring ioc :

1.xml配置

2.包掃瞄

3.annotation註解。

建立sping-service.xml

採用包掃瞄+註解方式,首先在xml中宣告包掃瞄:

<?xml version="1.0" encoding="utf-8"?>

xmlns:xsi=「

xmlns:context=「 xmlns:tx=「

xsi:schemalocation=「

/spring-beans.xsd

/spring-context.xsd

/spring-tx.xsd」

然後在org,forezp.service包下的類採用註解。比如@service 註解宣告是乙個service, @autowired注入service 所需依賴。

@service//宣告是乙個service

public class seckillserviceimpl implements seckillservice

只需要乙個包掃瞄和幾個簡單的註解就可以將service註解到spring ioc容器中。

四、spring宣告式事物

在秒殺案例中,我們需要採用事物來防止資料的正確性,防止重複秒殺,防止庫存不足、庫存剩餘等情況。一般使用事物需要開啟事物/經常一些列的操作,提交或者回滾。spring宣告式事物,就是將事物的開啟、提交等託管給spring管理,我們只需要注重如何修改資料。

配置spring 宣告式事物 在spring-service.xml中配置:

在需要事物的業務邏輯下加 @transactional註解。 比如在開啟秒殺方法:

@transactional

public seckillexecution executeseckill(long seckillid, long userphone, string md5) throws seckillexception, repeatkillexception, seckillcloseexception

注意:1開發團隊達成一致約定,明確標註事務方法的程式設計風格

2:保證事務方法的執行時間盡可能短,不要穿插其他網路請求,rpc/http請求或者剝離到事務方法外

3:不是所有的方法都需要事務,如只有一條修改操作,唯讀操作不需要事務控制

五、單元測試

需要配置:

@contextconfiguration() 直接上**:

@runwith(springjunit4classrunner.class)

@contextconfiguration()

public class seckillservicetest

@test

public void getbyid() throws exception

}@test

public void exportseckillurl() throws exception

@test

public void executeseckill() throws exception }

這篇文章主要講了service業務介面的編寫和實現,以及採用xml和註解方式講service 注入到spring ioc,以及宣告式事物

秒殺系統 併發處理

這種題目,小菜是準備過的,巴拉巴拉的說了一堆。面試官 那這裡是怎麼保證秒殺成功的?小菜 8 面試官 你這裡用了redis,有什麼用?小菜 面試官 你用什麼測試過這個系統的併發量?小菜 面試官 你覺得你這個系統還可以再優化麼?小菜 面試官 你知道這個系統的瓶頸在 嗎?如果流量再大10倍,怎麼應對?小菜...

高併發秒殺專案 05

頁面快取 改造goodscontroller中的方法,加入thymeleafviewresolver註解 手動渲染 springwebcontext ctx newspringwebcontext request,response,request.getservletcontext request....

活動秒殺解決併發問題

一 秒殺帶來了什麼?秒殺或搶購活動一般會經過 預約 搶訂單 支付 這3個大環節,而其中 搶訂單 這個環節是最考驗業務提供方的抗壓能力的。搶訂單環節一般會帶來2個問題 1 高併發 2 超賣 任何商品都會有數量上限,如何避免成功下訂單買到商品的人數不超過商品數量的上限,這是每個搶購活動都要面臨的難題。二...