/var/log/messages

Jan 26, 2014 - 2 minute read - Comments - Redis

動作の確認など

Redis Set Intersection - Using Sets to Filter Data にて例示されている動作を確認しておきます。手元に Redis 使うプロジェクトがあるので redis-server 動かしておいて rails c で確認。

The flight data is stored as strings in Redis ということで以下かな。

> $redis = Redis.current
> $redis.set "flights:1", "1, Virgin America, 03/23/2013 1:30 pm, San Francisco, San Diego"
> $redis.set "flights:2", "2, Virgin America, 03/23/2013 1:45 pm, San Francisco, New York"
> $redis.set "flights:3", "3, American Airlines, 03/23/2013 1:45 pm, San Francisco, New York"
> $redis.set "flights:4", "4, American Airlines, 03/23/2013 1:50 pm, Los Angels, Boston"
> $redis.set "flights:5", "5, Southwest, 03/23/2013 2:45 pm, San Francisco, New York"
> $redis.set "flights:6", "6, Southwest, 03/23/2013 3:30 pm, San Francisco, New York"

set できました。で、smembers してみたのですが戻りが以下。

> $redis.smembers "departure_time:1364068800:flights"
=> []

これ、sunionstore しなきゃ、なのか。確かに departure_time_keys で云々な記述があるな。なんとなくスクリプトの全体は把握できた感はありはしますがやはりキモは

redis.sunionstore('temp_set', *depature_time_keys)
redis.sinter('temp_set', departure_cities_key, arrival_cities_key)

あたりなのか。でも sunionstore は「セットの結合を作成」ってマニュアルにはあります。使用例があったのですが上記な例で sinter に複数の引数ってのがアレ。って思ったら sinter には複数のキー設定が可能なのか。

やっぱこれって

例示されてる smembers で正しい id が戻るようにデータを設定しとく必要があるのではないかなぁ。その前提がないと flight_ids という手続きは思った通りに動かない。

あら、でも

smembers departure_time:1364068800:flights

  1. “1”
  2. “2”
  3. “3”
  4. “4”

みたいな書き方になってる、ってことは id 戻す形なのか。なんだかあまり参考になっていない気がしてきました。おそらくは追加時に “departure_time:{#epoc}:flights で flight:{#id} な id を戻す set を作る sadd とかって演算が必要になってくるのかな。

これはデータの書式を規定しておいてそこに set を使って id を関連付ける、という手法なのかどうなのか。

がしかし、この set というやつはなかなか良さげ。