Redis實現使用者熱詞推薦

qixiaobo發表於2018-01-05

title: Redis實現使用者熱詞推薦 tags:

  • sortset
  • redis
  • 排序
  • 分頁 categories: redis date: 2017-10-31 11:05:23

背景

前一段時間實施反饋來了新的需求 使用者不希望太多的品牌選擇希望做個性化的推薦

比如品牌需要根據登入使用者的點選數排序

小夥伴實現了一個版本 【基於資料庫】

但是如果換成使用Redis如何實現呢?

首先要做的是選擇合適的資料結構

分析

如上需求需要根據不同的使用者來使用不同的推薦不同的品牌

可以確定相同的品牌對於同一個使用者應該出現一次【使用redis可以減少許多併發問題】

我們考慮對於系統來說 需要進行排序 因此考慮使用有序集合 即zset

我們需要先來設計對應儲存的key

我們設計如下的key:

    f6car:brand:hot:123456789:qixiaobo
複製程式碼

通常來說redis建議使用:來做為key的切分 我們以f6car:brand:hot作為字首

123456789為對應的idOwnOrg 祁曉波為使用者名稱

當使用者對於carzone品牌進行點選時我們執行一個非同步請求為

    ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
複製程式碼

這個不需要考慮有否初始值 比如我們連續執行多次後結果如下

    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    "1"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    "2"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    "3"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    "4"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    "5"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    "6"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 carzone
    "7"

    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
    "1"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
    "2"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
    "3"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
    "4"
    127.0.0.1:6379> ZINCRBY f6car:brand:hot:123456789:qixiaobo 1 f6car
    "5"
複製程式碼

而對於mysql我們需要先查詢再插入很容易造成併發問題 出現兩個同樣的品牌

當我們需要獲取對應使用者的點選情況只需要

    127.0.0.1:6379> ZREVRANGE f6car:brand:hot:123456789:qixiaobo 0 -1
    1) "carzone"
    2) "f6car"
複製程式碼
ZREVRANGE表示按照score從大到小排序
複製程式碼

其中-1 表示不限制長度【即全部資料】

當我們需要查詢個數的限制時我們可以

    127.0.0.1:6379> ZREVRANGE f6car:brand:hot:123456789:qixiaobo 0 0
    1) "carzone"
複製程式碼

如果需要返回分數我們也可以使用

    127.0.0.1:6379> ZREVRANGE f6car:brand:hot:123456789:qixiaobo 0 0 WITHSCORES
    1) "carzone"
    2) "7"
複製程式碼

如此就簡單快捷的完成了品牌推薦

相關文章