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"
複製程式碼
如此就簡單快捷的完成了品牌推薦