2019年6月28日金曜日

Firebase のデータを Redis に格納する Ruby スクリプト

概要

メモがてら残しておきます
Firebase の認証はレガシーな Database Secret を使っています

環境

  • macOS 10.14.5
  • Ruby 2.6.2p47

準備

  • bundle init
  • vim Gemfile
gem "firebase"
gem "redis"
  • bundle install --path vendor

アプリ

  • vim app.rb
require './lib/my_fb.rb'
require './lib/my_redis.rb'

p MyRedis.store(MyFB.fetch_all)

firebase の処理

  • vim lib/my_fb.rb
require 'firebase'

module MyFB
  BASE_URL = 'https://product_id.firebaseio.com/'
  SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

  def fetch_all
    client = Firebase::Client.new(BASE_URL, SECRET)
    ret = {}
    ret.store('category1', client.get('db1/category1').body)
    ret.store('category2', client.get('db1/category2').body)
    ret
  end

  module_function :fetch_all
end

Redis の処理

  • vim lib/my_redis.rb
require 'redis'
require 'json'

module MyRedis

  def store(ret)
    client = Redis.new
    sum = 0
    ret.each do |key, ary|
      ary.each_with_index do |p, i|
        client.set("#{key}_#{i}", p.to_json)
      end
      client.set("#{key}", ary.length)
      sum += ary.length
    end
    sum
  end

  module_function :store
end

Redis には category1_0 のような key で登録します
後からインデックスで検索、ループ処理しやすいように各カテゴリごとのデータのサイズを category1 という key に登録しています

実行

  • bundle exec ruby app.rb

動作確認

redis-cli get category1_0 で JSON の値が取得できれば OK
また redis-cli get category1 でコンテンツの数が取得できれば OK

最後に

サブカテゴリみたいに更に階層が深い場合にはループを増やせば OK です
Redis も localhost を前提にしているので外部なのであれば URL を指定してください

0 件のコメント:

コメントを投稿