Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

超高速なKey-Value型DB「Redis」をOS X上で遊んでみた。

Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.

RedisはいわゆるNonSQLの類で早いとの噂。
データをインメモリで処理するので超高速。
そのうえ、永続化もサポート(非同期)という素敵仕様。
イケイケエンジニャーの間では常識レベルらしいので、僕もやってみることにしました。

まずはお試し版。
Web上で動作するチュートリアルがあるのでガチャガチャ弄ってみましょう。
Try Redis
f:id:shuzo_kino:20140601221318p:plain
画面下にあるプロンプトにtutorialと打てばはじまります


一通り試して感覚を掴んだらいよいよ導入です。
幸いにしてbrewが使えます。

$ brew install redis
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/redis-2.8.9
######################################################################## 100.0%
==> Pouring redis-2.8.9.mavericks.bottle.tar.gz
==> Caveats
To have launchd start redis at login:
    ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
    redis-server /usr/local/etc/redis.conf
==> Summary
?  /usr/local/Cellar/redis/2.8.9: 10 files, 1.3M

指示通り、まずは起動後にredisが立ち上がるよう設定します。

$ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents

終わったら、launchctlで先ほど設定したLaunchAgents下のredisを再読み込みします。

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

あとは

$ redis-cli

とやれば、CLIが起動します。
まずはhelpで確認。

127.0.0.1:6379> help
redis-cli 2.8.9
Type: "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit

便利なことに、うろ覚えで先頭の文字を打ってTABをおせば補完してくれる便利機能つき。
たとえば、"help se"とやってTABを連打すると

  • help SELECT
  • help SET
  • help SETBIT
  • help SETEX
  • help SETNX
  • help SETRANGE
  • help se

といった感じで候補を順繰りに出してくれます。便利!

値投入はset、取得はget。

127.0.0.1:6379> set num 12
OK
127.0.0.1:6379> get num
"12"

構造は:で表現します

127.0.0.1:6379> set user:number:value 12
OK
> get user:number:value
"12"

リスト構造も使えます。末尾は「−1」指定

127.0.0.1:6379> rpush list 'hanako'
(integer) 1
127.0.0.1:6379> rpush list 'taro'
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "hanako"
2) "taro"

頭にくっ付けるのはlpush

127.0.0.1:6379> lpush list 'ichiro'
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "ichiro"
2) "hanako"
3) "taro"

削除はdel

127.0.0.1:6379> del list
(integer) 1
127.0.0.1:6379> get list
(nil)

おわりに

一通り弄ってみました。
なんだかスクリプト言語弄ってる感覚でしたが...これはまぎれも無くDBです。
使い勝手は相当良さげです。