Stan's Blog

[Coscup] RUBY 上 REDIS 的四種寫法

講者: 丁盛豪 (網路代號: 東仙隊長)
github

  1. redis-rb

redis.get、redis.set
最核心的 code 只有 5 行

redis get、set override 了 method missing

  1. action cable 也用了 redis

rails 是多線程的 model
在 ruby 裡面 redis 是非同步的 i/o blocking
response time 裡有百分之 90 都是 i/o blocking time

文件裡寫的 async 是 development mode
在 production mode 是非同步

  1. EM-HIREDIS

event machine
c 的 drive 在 ruby 綁定

用了很多 callback 做這件事
2019 JS 都不這麼寫了, 如果還這麼寫是不是很傻

講者重寫版本 midori-contrib
後期覺得自己維護太累了, 還要上班

沒多久出現了 falcon, 做的事跟講者幾乎一樣, 講者考慮將自己 gem 的一些部分核心 code 給 merge 進 falcon

  1. ohm

大家都把 redis 當作 cache & counter
redis 官方說明, in-memory data structure store, used as a database, cache and message broker.

why do you use redus for cache
  • single-threaded key-value database (easy to use)
  • time-based mwssage broker (TTL support)
  • rich data stucture support (LRU support)
  • 圖靈完備 (Lua support)

gem ohm
停止維護一段時間了, 不過講者自己的經驗, 用 ohm 上 production 到現在四、五年了沒遇到什麼問題

用在風控系統 login token

也有用在氣象監控資料 (很固定時間會產出很多資料)
用了 ohm 可以把 reids 當關聯式資料庫來用

當然, redis 也有一些小問題
舊的資料應該要放到 disk 裡, 留新的資料當 hot data

redis 替代品:

  1. ssdb
    背後加了 google 的 Level DB, 資料一但變多, 會移動一部分去 level db
    資料量大的時候效能會比較好

  2. codis
    不過好像沒在維護了 XD

Summary:

  • 正視 ruby 上 redis 存在的效能問題
  • 正確使用 ruby 上的 redis
  • 發揮 ruby 的優勢用好 redis
  • 將 ruby 的簡潔性和 reids 的簡潔性有效結合

補充:
簡單的分布式系統可以用 redis 當鎖

ohm 用在 production, 要 call 資料,正常是繼承 active record 改成繼承 ohm model

共筆連結

邊聽邊寫 如果有錯誤的地方, 請不吝指教, 謝謝