redis常用demo收集(一)——總起

liangxingwei發表於2018-07-18

收錄常見的redis用法,既漲漲見識,也方便遇到相關場景能快速參考。

求共同好友

原理 : sinter key1 key2

redis自帶的sinter命令就是對兩個集合求交集,系統為使用者新增好友的同時,只要往redis存入使用者的好友ID集合,後續就能很簡單得出了使用者相對於另一個使用者的共同好友

127.0.0.1:6379> sinter user:friend:123 user:friend:234
1) "3"
2) "5"
複製程式碼

簡單的使用者協同推薦

原理:交集與差集的合理利用

假設有使用者A的喜好列表SA[1,2,3]和使用者B的喜好列表SB[3,4,5],通過len(SA^SB)/len(SA)就能簡單地得到一個能代表B相對於A的相似度,雖然不一定很精準,但勝在簡單。

127.0.0.1:6379> sinter a:like b:like
1) "3"

len(SA^SB)=1 
len(SA)=3
因而相似度為1/3
複製程式碼

對於某個使用者A,用A對其他使用者C[2,3,6],D[1,2,3,4],E[1,2,3,4,5,6,7],求相似度,通過對列表排序,就能得到關於A的相似度優先列表[D,E,C,B]

相似度分別為2/3,1,1(此處有點問題,遠多於這種情形應該是不怎麼相似才對)
因而排序是D,E,C,B
複製程式碼

使用差集操作,B相對於A的差集就是除並集外B的剩餘部分,此場景下通俗點來講就是從相似好友中推薦A可能會喜歡的物品。 sdiff key1 key2,求出key1相對於key2的差集

127.0.0.1:6379> sdiff d:like a:like
1) "4"
127.0.0.1:6379> sdiff e:like a:like
1) "4"
2) "5"
3) "6"
4) "7"
127.0.0.1:6379> sdiff c:like a:like
1) "6"
127.0.0.1:6379> sdiff b:like a:like
1) "4"
2) "5"
(integer) 2
複製程式碼

這個時候,將所有的差集求並集之後就能得到使用者a的推薦列表了

訂閱釋出

原理 : redis自帶的pub/sub

某個客戶端sub某個頻道後,往後有訊息從該頻道被pub時,該客戶端就會收到通知,可以用在非同步回撥,應用解耦,廣播等情形。

sub操作的客戶端
127.0.0.1:6379> subscribe test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
1) "message"
2) "test"
3) "test pub/sub"

pub操作的客戶端
127.0.0.1:6379> publish test "test pub/sub"
(integer) 1
複製程式碼

簡單的延遲佇列

原理 : zrangebyscore delay:queue 0 now

往zset裡放置需要延時處理的訊息或者任務的同時,設定score為當前時間的時間戳。

另起一個協程,每隔一段時間從zset內取出score比取出時間的時間戳要小的訊息或任務進行處理。

錯誤限制次數

原理:setex userToken count ex

通過設定key為使用者的唯一標識,每次使用者錯誤就累加count,達到限制次數後就禁止使用者的操作,直到redis中的key過期後才恢復

尾聲

期待交流

後續程式碼存放地址

相關文章