最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

優(yōu)惠券優(yōu)惠的思路以及實踐

 更新時間:2017年02月09日 08:54:58   作者:朝向遠(yuǎn)方  
本文主要介紹了優(yōu)惠券優(yōu)惠的思路以及實踐。具有很好的參考價值,下面跟著小編一起來看下吧

前言:最近做關(guān)于優(yōu)惠券的開發(fā),但是發(fā)現(xiàn)優(yōu)惠券量大了之后,性能完全跟不上,庫中存200萬條優(yōu)惠券,發(fā)一張券竟然需要5分鐘之久,然后我就著手優(yōu)化,最終到發(fā)一張券只需要15毫秒左右,現(xiàn)在把整個思路以及代碼貼出來,供大家一起討論和學(xué)習(xí)。

簡介

主要實現(xiàn)優(yōu)惠券促銷活動,首先創(chuàng)建活動,然后創(chuàng)建券組,采用預(yù)處理的方式提前進(jìn)行制券,在第一版本主要實現(xiàn),功能的基本業(yè)務(wù)。然后在分支實現(xiàn),大數(shù)量和高并發(fā)問題。

分支1.1

1:解決優(yōu)惠券編碼重復(fù)問題,原先采用的是獲取數(shù)據(jù)庫所有的券,然后去比對是否重復(fù),如果庫數(shù)據(jù)量達(dá)百萬的時候就會出現(xiàn)非常緩慢,而且會 出現(xiàn)經(jīng)常制券失敗等,所以此版本舍棄原先采用隨機(jī)數(shù)的模式,通過推特的雪花算法來避免唯一,但是依然保留優(yōu)惠券前綴和后綴。

2:由原來的異步采用線程修改為線程池,以為高并發(fā)時候存在大量的線程占內(nèi)存空間。

3:由原來制券采用for循環(huán)模式修改為批量制券,而且采用分配插入優(yōu)惠券,一批次目前定為5000.

4:加入消息隊列(采用rabbitMQ)對于某一批次添加失敗,把失敗的放入對列中,通過隊列進(jìn)行補(bǔ)救,已到達(dá)高可用。避免大批量優(yōu)惠券來回重新導(dǎo)入 消息隊列對于異常信息拒絕解決并重返消息隊列中,配置2個消費者以避免其中一個服務(wù)異常,消息處理出現(xiàn)死循環(huán)

分支1.2

1:加入操作日志

目的:跟蹤熱點數(shù)據(jù),查詢?nèi)罩究焖俑檻?yīng)用程序中的慢查詢或慢操作,為后面的優(yōu)化奠定基礎(chǔ)

2:加入異常日志

目的:快速的獲取線程的異常問題,通過日志中的數(shù)據(jù)能快速修改

3:采用技術(shù) 通過aop和rabbitmq中間件來做,這樣減少由于日志問題給程序帶來的效率問題

未做優(yōu)化效率統(tǒng)計

采用數(shù)據(jù)庫mysql

數(shù)據(jù):添加25個有效活動,每個活動下分別有2個券組,每個券組下制券是5萬張。優(yōu)惠券表中250萬條記錄

業(yè)務(wù):一個會員消費同時滿足這25個活動要送50張優(yōu)惠券。

統(tǒng)計:整個發(fā)券過程經(jīng)過10次統(tǒng)計得出大約消耗是306s,其中每次獲取優(yōu)惠券耗時6s。如果多次循環(huán)必然帶來性能的瓶頸

更新優(yōu)惠券狀態(tài)大約耗時是0.5s,從上我們可以看出我們的性能問題主要出在獲取優(yōu)惠券上。所以才1.3版本主要通過程序來解決這個問題

分支1.3

目的:通過程序代碼和優(yōu)化數(shù)據(jù)庫來提高性能

具體方案:

1:以前獲取券組下所有的優(yōu)惠券現(xiàn)在修改為每次只獲取100條(經(jīng)測試統(tǒng)計得出發(fā)送50張券消耗時間是106s,每次獲取優(yōu)惠券大約耗時是2s多,整體性能提升近3倍)

2:優(yōu)化sql,加入組合索引(統(tǒng)計得出發(fā)送50張優(yōu)惠券消耗總時間是2.5s,每次獲取優(yōu)惠券大約耗時是0.015s,整體的性能提升了近42倍)

3:加入本地緩存(如果一次性獲取的優(yōu)惠券先放入map中,那么下次如果還有就不需要從庫中獲取優(yōu)惠券。統(tǒng)計發(fā)現(xiàn):10件商品,每件商品發(fā)50張優(yōu)惠券

不加本地緩存效率耗時是7.5s,加入本地緩存后耗時約5.5s,整體性能提升了2s)

效果分析:

4:對于發(fā)券采用批量更新來替代for循環(huán)(由上面的約5.5s性能提升為大約4.8s)

分支1.4

目的:通過異步和消息隊列來進(jìn)行發(fā)券

具體方案:

1:通過異步進(jìn)行發(fā)券,這樣可以提高cpu的利用率,同時通過消息隊列來保證穩(wěn)定性,避免出現(xiàn)異常導(dǎo)致返回前端發(fā)券成功,但是異步制券時候出現(xiàn)異常在發(fā)500張優(yōu)惠券的時候效率大約提升了0.5s

2:對代碼進(jìn)行一次重構(gòu)

原則:把大方法修改小方法,每個小方法處理一個業(yè)務(wù),比如獲取活動,那么這個方法的職責(zé)就是獲取活動,同時每個小方法盡量有返回值,這樣可以增加代碼的可讀性

分支1.5

1:采用redis做緩存,取當(dāng)天有效的活動,活動下券組,券組下500張券存入緩存中。

2:加入定時任務(wù),在每天12點時候更新緩存(這個時間可以通過熱點數(shù)據(jù)來監(jiān)控)

3:統(tǒng)計結(jié)果發(fā)現(xiàn):

加入緩存后發(fā)送500張優(yōu)惠券耗時只有2.7s,比之前的4.8s快了2.1s,大大的提升了性能

總結(jié):代碼我就不貼,大家可以自己去看。感興趣的朋友可以在這個基礎(chǔ)繼續(xù)研發(fā)學(xué)習(xí)。在版本1.6可能加入分庫分表,目前想采用的是當(dāng)當(dāng)?shù)膕harding-jdbc

源碼地址

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • Java Eclipse中實現(xiàn)快速替換變量

    Java Eclipse中實現(xiàn)快速替換變量

    這篇文章主要介紹了Java Eclipse中實現(xiàn)快速替換變量,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • JVM類加載之雙親委派機(jī)制解讀

    JVM類加載之雙親委派機(jī)制解讀

    這篇文章主要介紹了JVM類加載之雙親委派機(jī)制解讀,類加載階段分為加載、連接、初始化三個階段,而加載階段需要通過類的全限定名來獲取定義了此類的二進(jìn)制字節(jié)流,Java特意把這一步抽出來用類加載器來實現(xiàn),需要的朋友可以參考下
    2023-12-12
  • 分享一個簡單的java爬蟲框架

    分享一個簡單的java爬蟲框架

    這篇文章主要介紹了分享一個簡單的java爬蟲框架,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java調(diào)用windows系統(tǒng)的CMD命令并啟動新程序

    Java調(diào)用windows系統(tǒng)的CMD命令并啟動新程序

    本文教你如何使用java程序調(diào)用windows系統(tǒng)的CMD命令啟動新程序方法,需要的朋友可以參考下
    2023-05-05
  • Java接收前端請求體的多種方式總結(jié)

    Java接收前端請求體的多種方式總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java接收前端請求體的多種方式,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者Java具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-08-08
  • idea使用Mybatis逆向工程插件詳情

    idea使用Mybatis逆向工程插件詳情

    這篇文章主要介紹了idea使用Mybatis逆向工程插件詳情,首先使用mybatis連接數(shù)據(jù)庫接著添加連接的mysql的信息,測試鏈接等過程,更多過程了解請參考下面文章的詳細(xì)內(nèi)容
    2022-01-01
  • Java8新特性之方法引用的實踐指南

    Java8新特性之方法引用的實踐指南

    這篇文章主要給大家介紹了關(guān)于Java8新特性之方法引用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java實現(xiàn)多選批量刪除功能(vue+Element)

    Java實現(xiàn)多選批量刪除功能(vue+Element)

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)多選批量刪除功能,包括前端vue實現(xiàn)代碼文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Spring Boot中的Properties的使用詳解

    Spring Boot中的Properties的使用詳解

    這篇文章主要介紹了Spring Boot中的Properties的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java基礎(chǔ)篇之HashMap指定初始值

    Java基礎(chǔ)篇之HashMap指定初始值

    這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之HashMap指定初始值的相關(guān)資料,HashMap是Java中常用的數(shù)據(jù)結(jié)構(gòu),它提供了高效的鍵值對存儲和查詢功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12

最新評論

金平| 阳城县| 乐至县| 大厂| 襄城县| 沧州市| 五家渠市| 襄樊市| 抚宁县| 丰城市| 永宁县| 陆川县| 厦门市| 湘西| 赤壁市| 阜南县| 雷州市| 嵩明县| 吉木乃县| 吉林市| 永嘉县| 广南县| 定日县| 吉木乃县| 五峰| 南宁市| 上林县| 龙门县| 竹溪县| 威海市| 荥经县| 扶绥县| 灵宝市| 九江县| 文昌市| 贵港市| 旌德县| 涟水县| 乡宁县| 苏州市| 阿拉尔市|