Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

超高速な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です。
使い勝手は相当良さげです。