<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          12306搶票算法居然被曝光了!!!居然是redis實現(xiàn)的

          共 1200字,需瀏覽 3分鐘

           ·

          2021-11-28 14:18

          導(dǎo)讀

          相信大家應(yīng)該都有搶火車票的經(jīng)驗,每年年底,這都是一場盛宴。然而你有沒有想過搶火車票這個算法是怎么實現(xiàn)的呢?應(yīng)該沒有吧,咱們今天就來一一探討。其實并沒有你想的那么難

          bitmap與位運算

          redis的bitmap基本使用咱們之前已經(jīng)介紹過了,如果不是很熟悉的朋友可以看看這里

          redis中setbit(位操作)的實際應(yīng)用

          今天在這里咱們主要是先回顧一下位運算

          12306搶票算法詳解

          我們以北京到西安這趟高鐵為例,比如我的路線就是從北京到西安,車上如果只剩最后一張票了,那么如果有其他人,在北京到西安這條路線之間買任何一站,那么我都是買不了票的,換句話說,對于單個座位來說,必須是起點到目的地之間的所有站,都沒有人買的話,那么才能被算是有票狀態(tài)。

          所以我們可以嘗試用bitmap結(jié)合上位操作來實現(xiàn)這種場景,以上述北京到西安為例,我們把問題簡化

          • 比如一個火車上只有4個座位
          • 北京到西安,一共是4站,其實是三個區(qū)間的,分別為北京->石家莊,石家莊->鄭州,鄭州->西安

          首先我們給每個區(qū)間構(gòu)建一個空位圖(0為有票,1為無票)

          接下來,比如有人買了一張從北京到西安的票

          買票這個動作,比如被分配到的座位是編號為1的座位,那么我們直接把北京到西安的所有站,1號座位全部設(shè)置為1,如下圖

          接下來又有人買了一張從石家莊到西安的票

          比如這次分配的是座位2,那么我們把石家莊到西安的所有票全部設(shè)置為1就行了,如下圖

          如何知道還剩幾張票?

          其實解決這個問題很簡單,我們直接把上述位圖做一個或操作就可以了,因為或操作是必須全部都為0,才為0

          或操作結(jié)果有幾個0,則說明還剩幾張票。

          總結(jié)

          其實解決這個問題主要在于位圖的構(gòu)建,因為火車票對于某一個座位來說,只要起點到終點中間某一個區(qū)間被占用了(置為1),那么整個座位都是無效的這個特點,很容易想到用或操作的結(jié)果來判斷買票結(jié)果,我們這里只用了4位是為了方便說明問題,實際中應(yīng)該是火車上有多少座位,位圖的長度就應(yīng)該是多少。好了,關(guān)于搶票算法我們就介紹到這里,你有沒有Get到呢?或者你有沒有更好的實現(xiàn)方法呢?



          ??

          往期精選


          手把手教你Golang的協(xié)程池設(shè)計

          看了這篇還不會Linux性能分析和優(yōu)化,你來打我

          聊一聊mysql的buffer pool

          mysql索引原理,看這篇就夠啦

          mysql int 類型的長度到底是什么含義

          redis源碼之zset結(jié)構(gòu)的實現(xiàn)

          redis源碼之set結(jié)構(gòu)

          redis源碼之hash結(jié)構(gòu)的實現(xiàn)

          redis源碼之list結(jié)構(gòu)的實現(xiàn)

          redis源碼之dict

          redis源碼之SDS

          redis中setbit(位操作)的實際應(yīng)用

          redis五種數(shù)據(jù)的應(yīng)用場景



          瀏覽 36
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲天堂高清无码 | 呦小泬哟小泬哟小泬免费看 | 欧美大屌白嫩 | 理论在线观看视频 | 日韩AV无码免费看 |