首頁>技術>

不,Redis不僅僅是快取。

像快取一樣,Redis儲存鍵值對。但是與快取不同,Redis可讓您對值進行操作。Redis中有5種資料型別:字串,集合,雜湊,列表和有序集合。每種資料型別都公開各種操作。理解Redis的最好方法是對應用程式進行建模,而無需考慮如何將其儲存在資料庫中。假設我們要構建StackOverflow.com。為了簡單起見,我們需要問題,答案,標籤和使用者。

1、建模問題,使用者和答案

每個物件都可以建模為Map。例如,問題是具有欄位{id,title,date_asked,votes,asked_by,status}的Map。類似地,答案是具有欄位{id,question_id,answer_text,answer_by,votes, status}的Map。同樣,我們可以為使用者物件建模。這些物件中的每一個都可以作為雜湊直接儲存在Redis中。要生成唯一的ID,您可以使用“原子增量”命令。像這樣-

$ HINCRBY unique_ids question 1(integer) 1$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0OK$ HINCRBY unique_ids answer 1(integer) 1$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1OK
2、投票處理

現在,每當有人對問題或答案投票時,您只需要這樣做

$ HINCRBY question:1 votes 1(integer) 1$ HINCRBY question:1 votes 1(integer) 2
3、 主頁問題清單

接下來,我們要儲存最新問題以顯示在主頁上。如果您正在編寫.NET或Java程式,則可以將問題儲存在列表中。事實證明,這也是將其儲存在Redis中的最佳方法。每當有人問問題時,我們都會將其ID新增到列表中。

$ lpush questions question:1(integer) 1$ lpush questions question:2(integer) 1

現在,當您要呈現主頁時,您可以向Redis詢問最近的25個問題。

$ lrange questions 0 241) "question:100"2) "question:99"3) "question:98"4) "question:97"5) "question:96"...25) "question:76"

現在您有了ID,使用piline從Redis檢索專案並將其顯示給使用者。

4、按標籤提問,按投票排序

接下來,我們要檢索每個標籤的問題。但是StackOverflow.com允許您在每個標籤下檢視投票最多的問題,新問題或未回答的問題。為了對此建模,我們使用Redis的Sorted Set功能。排序集可讓您將分數與每個元素相關聯。然後,您可以根據元素的分數來檢索它們。讓我們繼續為Redis標籤執行此操作

$ zadd questions_by_votes_tagged:redis 2 question:1 (integer) 1$ zadd questions_by_votes_tagged:redis 10 question:2 (integer) 1$ zadd questions_by_votes_tagged:redis 5 question:613 (integer) 1$ zrange questions_by_votes_tagged:redis 0 5 1) "question:1"2) "question:613"3) "question:2"$ zrevrange questions_by_votes_tagged:redis 0 5 1) "question:2"2) "question:613"3) "question:1"

我們在這裡做了什麼?我們將問題新增到有序集合Set中,併為每個問題分配分數(投票數)。每次提出問題時,我們都會增加其分數。當用戶單擊“按標記排序的問題,標記為Redis的問題”時,我們只需執行一次zrevrange,然後返回最前面的問題。

5、實時問題,無需重新整理頁面

最後,還有獎金功能。如果您開啟問題頁面,StackOverflow.com將在新增新問題時通知您。Redis如何在這裡提供幫助?Redis具有釋出訂閱模型。您可以建立頻道,例如“ channel_questions_tagged_redis”。然後subscribe,您將使用者轉到特定的頻道。新增新問題後,您會publish向該頻道傳送訊息。然後,所有使用者都將收到該訊息。您必須使用網路套接字之類的網路技術才能將訊息實際傳遞到瀏覽器,但是Redis可以幫助您解決伺服器端的所有問題。

23
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 阿里面試官:Redis快取一致性問題怎麼解決?