【趙強老師】Redis案例分析:用setbit統計活躍用戶

1、需求背景

首先,咱們來看一下需求:網站統計用戶登陸的次數,具體以下:redis

  • 網站有1億個用戶,有常常登陸的,也有不常常登陸的
  • 如何來記錄用戶的登陸信息
  • 如何查詢活躍用戶:好比:一週內,登陸3次的

2、使用傳統的關係型數據庫

咱們使用傳統的關係型數據庫(好比:Oracle)來存儲這樣的數據,以下圖所示。數據庫

 每週產生7億條數據,對於任何一個關係型數據庫來講,都是很是很差維護的,對性能也會有很大的影響。性能

3、使用Redis的setbit操做

Redis支持對String類型的value進行基於二進制位的置位操做。經過將一個用戶的id對應value上的一位,經過對活躍用戶對應的位進行置位,就可以用一個value記錄全部活躍用戶的信息。以下圖所未,下圖中的bitmap有9個位被置爲1,表示這9個位上對應的用戶是今天的活躍用戶。其中第15位表示uid爲15的用戶,第一位表示uid爲0的用戶。(若是你的uid不是從1開始的,好比從100000開始,實際上你也能夠相應的用uid減去初始值來表示其位數,好比1000000用戶對應到bitmap的第一位)網站

具體的代碼相似下面這樣:
redis.setbit(key, user_id, 1)
這樣一次記錄的複雜度是O(1),在Redis中速度很是快。
下面代碼是在Redis CLI中執行的Demo演示,好比:用戶ID爲100的用戶在星期一登陸了網站,咱們就經過setbit操做,把星期一對應的100位的值置爲1,
127.0.0.1:6379> setbit monday 100 1
(integer) 0
而咱們經過天天換用一個不一樣的key來將天天的活躍用戶狀態記錄分開存。而且能夠經過一些與或運算計算出N天活躍用戶,和鏈接N天活躍用戶這樣的統計數據。

以下圖,第一行表示星期一的活躍用戶狀況,第二行表示週二的,以此類推。爲樣咱們經過對N天的活躍用戶記錄取並集操做,就能得出在N天內活躍過的用戶列表。ui

相關文章
相關標籤/搜索