---
# System prepended metadata

title: Ch8. Builda simple social
tags: [Redis]

---

---
tags: Redis
---
# Ch8. Builda simple social 

:::info
以twitter的後端為參考，建構所需的資料
* 用戶與狀態鏈
* 主頁時間線
* 追蹤、被追蹤清單
* 狀態消息、發布、刪除
:::


## 8.1 Users and statuses
* User >> 建構其他關係的起點
    * 基本身份
    * 關注人數
    * 發布狀態數
* Status >> 不同用戶間具體的內容與交流
### 8.1.1 User Information
* Hash 來儲存結構
* 情境
    * 新用戶註冊：建立所有key都為初始值得物件；
        * 檢查ID重複性
        * 建立初始化

### 8.1.2 Status messages
* HASH來儲存結構
    * 包含id，設計的想法可以想成如果會有大量query的需求，那對應的key是甚麼？把ID放在這裡面的好處是，如果有要查找多個發布者時的情境，可能就不用再回到User端去查找


## 8.2 Home timeline (首頁的時間線)
* 情境：使用者在首頁，可以看到自己朋友圈及自己的消息們
* home timeline
    * ZSET來儲存結構
        * 儲存的內容是status message的ID為主，並不是文案本身；所以實作時會需要去取得ID後再取得文案
* profile timeline


## 8.3 Followers/following lists
* ZSET來儲存結構
* 情境：
    * 當關注發生
        * Step 1:增減一個資料到對應的ZSET中
        * Step 2:並從對應用戶的profile timeline中，抓取部分的新訊息到自己的home timeline中；
    
    
    
## 8.4 Posting or deleting a status update 
* 8.1.2 介紹了建立的作法，但怎麼互動則是需要思考的
* 回到實務的情境，人少好辦事，畢竟也沒多少要被判斷，但一些KOL、明星，可能動值數萬或千萬人的追蹤，該如何盡快的返回內容
    * 兩個概念：
        * 先將status ID 加到top 1000的關注者中
            * twitter 中關注者超過1000的約佔0.1%的人
        * 透過在第六章所提過deferred task的設計，將列表顯示狀態推送出去
* 刪除已發布的訊息

* 其他附加功能
    * 私人用戶
    * 收藏
    * 用戶之間 可以私聊
    * 轉發

## 8.5 Streaming API
* 回到社群網站的開發者，我們可能會想要知道訊息上的統計、熱門主題追蹤、KOL等
    * 直覺做法，以call去追蹤這些訊息
    * 進階做法：建立broadcast vs. listener的機制


### 8.5.1 Data to be streamed 
* 各類API開發的考量有哪些？
    * 哪些事情要對外追蹤或公開
    * 是否須要進行權限的控管？如何實現？
        * 通常在涉及隱私、系統資源時才會考慮；
    * 有沒有特定的篩選機制，e.g. 時間區間、事件、角色、類型等
        * 類似Twttier 的public stream
        * firehose + sample 來獲取隨機訊息
        * 

### 8.5.2 Serving the data
:::info
相較於傳統的API，都會假設web端的使用是在特定情境時呼叫API；但在streaming 當中，因為會持續地給予資料，則是有相對不同的；
> 目標是當有新的訊息產商，只要能跟filter匹配，就會透過streaming api將資料回傳client端；
:::

* A STREAMING HTTP SERVER
    ![Uploading file..._0rjrl2bqc]()

* IDENTIFYING THE CLIENT
    * parse_dentifer 透過pasing url的break down取得顧客資訊
* HANDLING HTTP STREAMING
    * 為了不斷拋訊息過去，第一步是先作身分驗證> 如果身分或訊息的驗證OK，就會開始不斷向client端發送訊息
    * 
### 8.5.3 Filtering streamed messages
* Goal: 如何讓客戶端只接收到自己有興趣的訊息
    * 只接受到自己有興趣、特定用戶、特定關鍵字
    * 隨機性



* UPDATING STATUS MESSAGE POSTING AND DELETION
    * 概念上來看，當消息刪除時，我們會須要同步刪除的資訊
        * 實作上，我不用每個人都考慮去記現在還活著的所有訊息
        * 我只要再篩選時，只考慮活著的訊息就好>> 直接在status的地方，押上delted = True
* RECEIVING STREAMED MESSAGES FOR FILTERING
* FILTERING MESSAGES
    * 隨機採樣：SampleFilter
        * 設定一個返回隨機Status的函數
        * 除了上述做法外，有些也會在隨機中塞進一部份比例的熱門
            * 可以用機率值實作
    * Track
        * Status須要跟某個詞組的所有單詞匹配，才會被篩選出來；
    * Follow
    * Location
* 

