Redis簡單案例 三 連續登陸活動的簡單實現

2021-09-19 21:37:24 字數 4652 閱讀 3909

原文:

redis簡單案例(三) 連續登陸活動的簡單實現

連續登陸活動,或許大家都不會陌生,簡單理解就是使用者連續登陸了多少天之後,系統就會送一些禮品給相應的使用者。最常見的

莫過於遊戲和**這些。遊戲就送遊戲幣之類的東西,**就送一些禮券。正值國慶,應該也有不少類似的活動。

下面就對這個的實現提供兩個思路,並提供解決方案。

思路1(以使用者為維度):

連續登陸活動,必然是要求連續登陸,不能有間隔。用1表示登陸,0表示沒有登陸,這樣我們可以為每個使用者建立乙個key去儲存

他的登陸情況,就可以得到類似這樣的乙個二進位制序列:1110111,如果是7個1,就表示連續7天,如果不是7個1就表示沒有連續登

陸7天。所以就能實現這個登陸活動的要求了。

思路2(以天數為維度):

一天之內,使用者要麼是登陸過,要麼是沒有登陸過。同樣的用1來表示登陸過,用0表示沒有登陸過。假設我們連續登陸的活動是2天,

同時有3個使用者,那麼就要有2個key去儲存這3個使用者的登陸資訊,這樣就會得到類似這樣的兩個二進位制序列:101(key1),111(key2)。

此時,對這兩個key的每一位都進行邏輯與運算,就會得到101,就表明,使用者1和使用者3連續登陸了兩天。從而達到活動的要求。

下面就簡單模擬一下國慶7天假期連續登陸七天的活動。

方案1 :以使用者為維度

先為每個使用者建立乙個key(holiday:使用者標識),對於我們的例子來說,每個key就會有7位二進位制位。這時key會有這樣的結構

七天。這樣就可以在第七天使用者登陸的時間去處理了是否傳送禮品了。處理的邏輯是十分簡單的。控制器簡單邏輯如下:

在這裡還是用隨機數的方法來模擬資料。主要操作有兩個,乙個是模擬登陸後把當天對應的偏移設定為1(true),另乙個是取出使用者

登陸的天數。這是一次性模擬操作,與正常情況的登陸操作還是有些許不同的。大致如下:

回到我們模擬的情況,在介面展示時,模擬登陸後會顯示累計登陸使用者的id。

1

<

script

id="everyonetpl"

type

="text/html"

>

2<

span

>

total:}

<

/span>

3<

ul>4}

5<

li>6}

7<

/li>8}

9<

/ul>

10script

>

11<

script

>

12$(

function

() 23}24

})25

});26

})27

script

>

下面來看看效果:

方案2 :以天數為維度

既然是以天數為維度,那麼就要定義7個redis的key用來當作每天的登陸記錄,類似:

這樣的話就要讓我們的使用者標識是數字才行,如果是用guid做的使用者標識就要做一定的處理將其轉化成數字,這樣方便我們

在給使用者設定是否登陸。現在假設我們的使用者標識是從1~1000。使用者標識對應的就是在key中的偏移量。這時我們就會得到每天

對應的二進位制序列,然後就可以用bitop命令去得到邏輯與運算之後的key/value。如果這個key對應偏移量(使用者標識)是1,就是

連續登陸了七天,處理的邏輯是十分簡單的。控制器簡單邏輯如下:

前台的處理與方案一的一模一樣,所以就不貼**了。下面來看看效果圖。

可能光看效果圖沒太大意義,還是要看一下redis中的資料來驗證一下的。圖中取了76和991這兩個使用者標識(偏移量)來驗證。

一大堆16進製制的東西,有興趣可以去轉換成二進位制試試。

對這兩種方案簡單的總結一下: 方案

優點缺點

以使用者為維度

1.可以無縫對接,無論使用者標識是數字還是其他

2.key對應的資料較少便於觀察

隨著使用者數量的增長,要管理的key會越來越多

以天數為維度

1.有確定數量的key,方便管理

2.key對應的基數大

1.偏移量可能需要根據實際情況處理

2.資料檢視不是很清晰

可至於實際中用那種方案更合適,要根據情況來選擇。使用者量少的時候,可以用第一種方案,也可以用第二種方案,當使用者量很大的時候,

建議採用第二種方案,畢竟只要使用者數量沒有超過43億,就不會超出其二進位制位數的限制。是可以比較放心使用的。

redis使用案例

1.計數器 string 單執行緒,避免併發問題,保證不會出錯,毫秒級效能 命令 incrby incrby 2.佇列 list 簡單訊息佇列 使用者第幾個訪問 新聞列表排序 由於redis把資料新增到佇列是返回新增元素在佇列的第幾位,所以可以做判斷使用者是第幾個訪問這種業務 新聞列表頁面最新的新聞...

三層架構簡單案例分析

最近在網上找了一些資料學習三層架構的知識,初學者就像我來說理解那些抽象的道理還是很困難的,其實不妨用乙個小例子來好好地分析一下 首先,我們需要明白的是三層架構的劃分原理 如下圖所示 各個層的任務 資料訪問層 為資料庫中的每個表,設計乙個資料訪問類,類中實現 記錄的插入 刪除 單條記錄的查詢 記錄集的...

Redis之事務案例

一次執行多個命令,本質是一組命令的集合。乙個事務中的所有命令都會序列化,按順序地序列化執行而不會被其它命令插入,不許加塞。乙個佇列中,一次性 順序性 排他性的執行一系列命令。單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷 沒有隔離...