Redis 快速實現簽到統計功能 Redis 位運算

1. 實例化一個 Redis 連接

 $redis = app('redis.connection');

2. 如何去設計 key 呢?

 $dayKey = 'login:'.\now()->format('Ymd'); // 輸出類似:login:20190310

3. 簽到

  • setbit - SETBIT KEY_NAME OFFSET (Time complexity: O(1))

    對 key 所儲存的字符串值,設置或清除指定偏移量上的位 bit

    $redis->setbit($dayKey, $this->user->id, 1);

 

4. 統計一週內的簽到數據

  • bitop - BITOP operation destkey key [key ...]

    對一個或多個保存二進制位的字符串 key 進行位元操作,並將結果保存到 destkey 上

    AND : 對一個或多個 key 求邏輯並
    OR : 對一個或多個 key 求邏輯或
    XOR : 對一個或多個 key 求邏輯異或
    NOT : 對給定 key 求邏輯非

    $redis->bitop('AND', 'threeAnd', 'login:20190311', 'login:20190312', 'login:20190313');
    echo "連續三天都簽到的用戶數量:" . $redis->bitCount('threeAnd');
    
    $redis->bitop('OR', 'threeOr', 'login:20190311', 'login:20190312', 'login:20190313');
    echo "三天中籤到用戶數量(有一天籤也算簽了):" . $redis->bitCount('threeOr');
    
    $redis->bitop('AND', 'monthActivities'', $redis->keys('login:201903*'));
    echo "連續一個月簽到用戶數量:" . $redis->bitCount('monthActivities');
    
    echo "當前用戶指定天數是否簽到:" . $redis->getbit('login:20190311', $this->user->id);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章