Redis 在 C#的應用
Redis適用的場合
1.代替主機的Session機制,利於擴展多部主機
2.簡單、不講求精準的計數,如人氣排行榜等;可以容忍部分lost
3.極端要求前端回應速度、使用者體驗好的場合 (轉址查詢)
4.有許多人查詢"共同"、高度相似的資料集,讀多於寫 (查選課...火車班表...公車路線)
5.有某些資料是會定期失效清除的(Token) ,例如實作登入失敗進行鎖定的機制
6.競爭性資源的鎖定機制,例如搶票系統的交易鎖(SETNX)
Redis不適用的場合
1.只有後端管理者在使用的場合,沒有多人競爭、搶快的必要
2.全都講求即時計算,不能接受時間差
3.因為精準數問題,避免儲存金額或是貨幣數字
4.沒有足夠資源建置cluster機制,單點失效或快取miss造成的損失與遲滯問題反而更嚴重
Redis Key的設計與使用
1.利用namespace的方式來標示有意義的內容,如 usr:vip:faculty:sigfried
2.key 跟 value不要過長(key 小於1K)
3.思考每筆key的生命週期該存活多久,設定有效期限
4.針對人、事、物資料可以把資料抽象到一個雜湊表裡;不要把JSON 的key-value 組合拆開、一個個當字串值塞進redis 的value
5. keys 指令會把效能拖垮,用 keys xxxxx* 無法預估筆數;應該用scan 取代,可以限制回傳筆數、分批執行,例如 redis-cli scan 0 match key99* count 1000
6.設計key 時避免使用特殊字元
Redis Key的設定與組態
1.記得設定密碼認證,並限定存取來源
2.將敏感、耗時語法rename,避免在production遭到誤用,例如: rename-command keys mykeysys
3.C#應用不使用using資源語法,因為是單執行緒
4.利用docker環境安裝
5.擷取 redis 最大占用記憶體
config get maxmemory
6.通過 info 指令檢視 redis 記憶體使用情況
maxmemory 104857600
表示redis的最大記憶體 單位是Byte
used_memory_human:表示實際已經占用的記憶體
延伸模組:RediSearch
RediSearch 是一個Redis Module,配合Redis運作。
docker run -p 6379:6379 redislabs/redisearch:latest
RediSearch 如果要查询中文内容的话,需要在寫入資料时設定中文編碼,在查詢時也要設定中文編碼
很棒的Redis觀念分享(Trevor Sullivan covers the Redis cache service)
https://www.youtube.com/watch?v=8A_iNFRP0F4
留言
張貼留言