[Rails3.1]メモ

Rails 3.1.0のメモ


Rails3.1.0rc4を想定
はまったところを順次メモしていく


CoffeeScriptはnodejsを入れないといけません


当たり前ですけどね。。。初めての人にはわからないと思いますよ。Rails3.1作っている人。。。


nodejsが入っていない場合のエラーメッセージ


rake -Tを実行したときにでたやつ


Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.

nodejsを入れる方法(Ubuntu11の場合)


sudo apt-get install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo aptitude install nodejs

一番最初のpython-software-propertiesは大抵入っています
aptitudeのところはapt-getでもOK
Ubuntu以外のOSの場合はここを参照


スポンサーサイト

[Rails][非同期処理]Resqueをはじめる その2 (Redisを操作する)

Railsの非同期処理 Resque Redis使い方編


何事も基礎から、、、ということでredis-cliを使ってRedisを操作してみます


サーバ操作系コマンド


状態を調べたりするコマンドです
使いそうなのをピックアップ


最後にディスクに書き出された時間を調べる


lastsave

Redisの特徴の1つにメモリ上のデータをディスクフラッシュする機能があります
このディスクフラッシュした時刻を取得するコマンドです
なお、このままだとUnixtimestampで出力されますので変換してあげないとわかりにくいです


Unixtimstampの変換のサンプルsh
もっといい書き方があるはず


#!/bin/bash
res=`/opt/redis/redis-cli<lastsave
EOS`
date -d"1970-1-1 GMT +$res second"

Redisに登録されている全データを削除する


flushall

なお、後述しますが、Redisはdbという概念も持っています
そのため指定されたdbの中身を削除するコマンドもあります
そのコマンドが以下のとおりです


flushdb

後述するselectコマンドでdb選択をしない場合は、db0の中身が全削除されます


Redisの動作を監視するコマンド


monitor

実行時のサンプル


$ /opt/redis/redis-cli 
redis 127.0.0.1:6379> monitor
OK
1309795407.075768 "monitor"
1309795421.663802 "set" "y" "3"
1309795428.071447 "set" "x" "5"

monitorを起動させているコンソールと、redisに値を設定しているコンソールの2つを立ち上げています
操作がすべて表示されますので、監視や、デバック時などに効果があります


手動でメモリの内容をディスクフラッシュさせる


bgsave

save

bgsaveは非同期で実行されます
そのため、正常に完了したかどうかは前述のlastsaveコマンドで時刻を確認する必要があります


select [Integer]


dbを指定するコマンドです
namespace等で制御することが多いですが、dbで制御することも可能です
指定しない場合はdb 0が利用されます


dbが異なれば同一のKeyでも違う値を登録できる例
>の前のredis 127.0.0.1:6379は省略しています


$ /opt/redis/redis-cli 
> get x
(nil)
> set x 1 <= xというKeyに1をセット
OK
> get x
"1"
> select 1 <= ここでdbを1に切り替えている
OK
[1]> get x <= db0に設定したxというKeyはnil
(nil)
[1]> set x 2 <= db1のxというKeyに2をセット
OK
[1]> get x
"2"
[1]> select 0 <= db0に変更する
OK
> get x <= db0のxというKeyのValueに変更はない
"1"

RedisのList構造操作


RailsのResqueではQueueの管理にRedisのList構造を用いています
具体的にはQueueを追加する際にはRPUSHコマンドでリストの末尾にQueueを追加し、
Queueを取り出すときはLPOPコマンドでリストの先頭からQueueを取り出しています
(いわゆるFIFO方式)
あまり意識する必要はありませんが、知っておくとメンテナンス等で威力を発揮するかもしれません
なお、List構造以外にもQueueの管理・監視にSets構造(すでに存在する要素は登録できない)も利用しています


要素の追加


要素の追加はpushコマンドを使います
pushする際にどの位置にpushするかの選択ができます


lpush [Key] [Value]

rpush [Key] [Value]

lpushがLeft Push(だと思われる)でリストの先頭に要素を追加するコマンドです
rpushがRight Push(だと思われる)でリストの末尾に要素を追加するコマンドです


lpushのサンプル


> lpush list1 "a"
(integer) 1
> lpush list1 "b"
(integer) 2
> lpush list1 "c"
(integer) 3
> lrange list1 0 -1
1) "c"
2) "b"
3) "a"

rpushのサンプル


> rpush list2 "a"
(integer) 1
> rpush list2 "b"
(integer) 2
> rpush list2 "c"
(integer) 3
> lrange list2 0 -1
1) "a"
2) "b"
3) "c"

上記の例のようにlpushの場合はListの先頭に、rpushの場合はリストの末尾に要素を追加しています


要素の取得


要素の取得は2パターンあります


Listから削除して要素を取得するコマンドがPOPです
POPはPUSHと同様に2種類存在します
要素の先頭から取得するlpopと要素の末尾から取得するrpopです


lpop [Key]

rpop [Key]

[Key]はList構造である必要があります


Listから削除せずに取得するのがLINDEXです


lindex [Key] [INDEX]

サンプル
以下の構造があるものとします


> lrange list2 0 -1
1) "a"
2) "b"
3) "c"

list2の要素1番目(0からはじまる)をlindexで取得


> lindex list2 1
"b"

list2の末尾の要素を取得し、取得した要素をリストから削除(rpop)


> rpop list2
"c"

list2の先頭の要素を取得し、取得した要素をリストから削除(lpop)


> lpop list2
"a"

リストのサイズを取得する方法


Redisのリスト構造内の要素の数を取得するにはllenコマンドを用います


llen [Key]

[Key]はリスト構造


リストの中身を一覧で取得する方法


Redisのリスト構造の中身を一括で取得するにはlrangeコマンドを用います


lrange [Key] [Start] [End]

[Key]はリスト構造
[Start]にはリスト構造の見たい箇所の開始インデックスを数値で指定
[End]には[Key]内の見たい箇所の終了インデックスを数値で指定


若干わかりにくいですが、全部出力するときの以下のコマンドを覚えておけばだいたいOKだと思います


lrange [Key] 0 -1

-は「から」の意味ではなく負数の意味です
-1はリスト構造の最後を示しますので[0] = リストの先頭 から [-1] = リストの最後の要素が出力されます


なお、-2を指定するとリスト構造の最後から1つ前を示し、-3の場合はリスト構造の最後から2つ前の要素を示します
この仕組みはLINDEXコマンドでも利用でき、末尾の1つ前の要素を取得したい場合は以下のコマンドで取得することができます


lindex [Key] -2

その他にも色々と用意されています
指定されたインデックス番号の要素を書き換えるLSETコマンド
指定されたインデックス番号の要素の削除するLREMコマンド
指定された要素の前(Before) または 後(After)に要素を追加するLINSERTコマンド
(※インデックス番号だとダメ)


[おまけ] Redis 2.1系から使えるコマンド


List構造においてはいくつか使用できるコマンドが増えています
サポートしているライブラリがあるかは知りませんが。。。


[Key]が存在しなければ要素を追加しない


lpushx [Key] [Value]

[Key]は既に要素が設定されているList構造であること


サンプル


> flushall
> lpush list1 x
(integer) 1
> lpushx list1 y
(integer) 2
> lrange list1 0 -1
1) "y"
2) "x"
> lpushx list2 y
(integer) 0
> lrange list2 0 -1
(empty list or set)

lpushx list2 yはlist2に要素がないので要素の追加に失敗している
指定された[Key]が存在しなければ要素の末尾に追加するrpushxコマンドもあります

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。