storage 選用: redis & scylla & mysql 簡介
每件事情的走向要是用二分法來切分的話, 大概就是預期內跟預期外了。
自己寫的code、使用的套件、使用的周邊配套可以自己決定要不要更換, 但是除了自己寫的code之外, 套件跟周邊配套使用後就會存在著不可預期的狀況, 所以在套件的選用上需要經過分析跟評估, 甚至如果已知的需求夠明確也可以先對同性質的套件先做壓力測試之後再下決定。
儲存工具通常是我會先評估的項目,每種不同性質的資料依照內容、讀寫頻率、儲存時間、查詢複雜度...等, 搭配儲存工具的特性、優缺點、工具限制等資訊來找出最適合的工具。
從昨天的流程圖中可以看到本次開發需要應用到兩個資料儲存工具
我會整理一下資料的差異跟特性,再來決定工具, 先分析這兩種資料
項目 | 異動頻率 | 讀取頻率 | 保存時長 | 資料量 |
---|---|---|---|---|
上限設定值 | 設定後每月異動N次以下 | 每次統計都要查 | 永久 | M筆以下 |
統計點數 | 每日會有N*10次以上異動 | 每次異動都要讀 | 至少24hr | 每天M*100筆以上 |
這邊介紹常用的三個儲存資料的工具
MYSQL
號稱全世界最受歡迎的open source關聯式資料庫管理系統, 搜尋功能是它的強項, 可以自訂各種搜尋條件, 也可以依照常用的搜尋條件設定INDEX, 但是在高頻率的讀寫較耗效能且會變慢, 所以通常會拿來做沒有即時回應需求的資料查詢, ex: 統計報表或log紀錄。
MYSQL 還有提供Transaction 功能, 可以確保資料更新整批成功或整批失敗, 在需要高完整性的操作時可以選用, ex.金額相關異動。
Scylla
傳說中最快的NoSQL DB, 支援橫向擴展, 快速讀取資料的表現很好, 即時高頻的讀取也不影響效能。但是搜尋功能需要按照建立的INDEX來操作, 如果要擴充搜尋條件需要增設很多VIEW, 相較於MYSQL來說,支援複雜搜尋條件的功能較差。
Scylla我們通常拿來存放異動頻率低, 但是需要高頻讀取的項目。
Redis
Redis是把資料儲存在緩存中, 它也可以設定資料持久化來備份資料。Redis是我最常用的儲存工具, 主要用來記錄短期資料, 在設定expire time之後資料就會自動消失, 不需要額外處理清資料。相較於另一個緩存Memcached, Redis 提供的操作指令很豐富, 可以依照不同的情境選擇不同的儲存資料結構, 同時如果有需要排隊異動同一個key的需求, Redis也支援lua script操作, 可以把一整串Redis 語法寫成scrpt 一次操作, 減少IO的處理次數。
在這次的點數統計需求中, 要存放點數上限設定值資料且會在每次異動時讀取設定值來使用,但是沒有類似報表的複雜查詢需求,所以選用Scylla來存放點數限額設定, 而每天的點數統計需求不需要長期保留也不需要人為介入去異動已經統計的點數, 所以會選用Redis來存放。