[name=makicamel]
- Redis 入門 を読んでいる
インメモリ KVS データベース
特徴
- ハイパフォーマンス
- レプリケーション
- KVS:Key-Value Store
- Ruby でいう Hash、Dart でいう Map
- e.g. Amazon DynamoDB
- 永続化
- Amazon ElastiCache for Redis Redis クラスタの複製(および|または)シャーディングによるレイテンシの少なさが特徴
- Amazon MemoryDB for Redis 書き込み時のトランザクションログを分散させデータロストの耐久性が特徴
- Azure Cache for Redis | Microsoft Azure
- Memorystore: インメモリ データストア | Google Cloud
ゲームアプリやセッション・キャッシュの保存などスピードが求められる一時データが現在の主な用途だが、 Amazon MemoryDB for Redis が登場したことで永続化面でも用途が広がっていきそう
- レプリケーション
- 目的: 負荷分散、障害対策
- 頻度: リアルタイム
- シャーディング
- 目的: 負荷分散
- 頻度: リアルタイム
- 説明: 水平分割。テーブルデータをレコード単位で複数のサーバに分散して保持する
- バックアップ
- 目的: データ復旧
- 頻度: 低頻度。日に 1 度など
- スケールアップ / スケールアウト
- スケールアップ マシンの処理能力の向上
- スケールアウト マシンの台数を増やし処理分散による全体としての処理能力の向上
- ノード
- Redis インスタンスを指す
- マスターノード・レプリカノードがある
- マスターノード
- 0 個以上のレプリカノードを持つ
- リアルタイムでスレーブノードにレプリケーションされる
- スレーブノード
- 読み取り専用
- マスターノードが死んだ場合マスターノードに昇格する
- シャード
- ノード郡を指す。複数のマスター・レプリカノードを持つ
- シャード内のノード間でデータがレプリケーションされる
Redis 入門 p.33
Redis 入門 p.36
- STRING
文字列を数値としてインクリメント / デクリメントするためのコマンドなどもある
Rails.cache
でもサポートされている increment (ActiveSupport::Cache::MemCacheStore) - APIdock - LIST 右端・左端に値を追加 / 削除する、インデックスや範囲を指定して値をフェッチするほか、リストの中間に複数の要素を指定したりリストのサイズを任意の長さに指定したり(端から要素を捨てる)などができる
- SET LIST と異なり順序が指定されない、一意な文字列となる。 このため値を指定して要素の追加 / 削除を行う
- HASH 値が数値として解釈できる場合は値をインクリメント / デクリメントすることができる
- ZSET キー(メンバー)と値(スコア)を持つ。 キーは一意であり、値(スコア)は浮動小数点数に限られる。 スコアは数値として順序を評価される。 ソートされた順序、スコアの値によってもアクセスできる。
[name=ken3ypa]
あまり rake タスクを書いてこず、今の現場でrakeタスクの書き方について色々学んだのでまとめます
- Makeに影響を受けているので、RubyのMakeファイルでRake
- 設定ファイルはMakefile、Rakefile
# $ rake
# $ rake hogetask
task default: :hello
# $ rake
desc "hello"
task :hello do
puts "Hello Rake!!"
end
require "bundler/gem_tasks"
require "rake/testtask"
Rake::TestTask.new(:test) do |t|
t.libs << "test"
t.libs << "lib"
t.test_files = FileList["test/**/*_test.rb"]
end
task :default => [:rubocop, :test]
directory
file
という DSL がある...!!
HOGE = 'hoge'
directory HOGE
指定のタスクが実行される前に、Prerequisites に指定したタスクを実行することが可能です。配列をとることができます
rake task内でコンテクストが共有されてしまうので注意。各task内に書いてあると意図せずメソッドを上書きしてしまう可能性がある。そのため
- 汎用的なものについては、
task_helper.rb
- その他のものについては refinements かPOROに切り出すとよい
CLI作成ツール。 Rakeと比較して
- 構造化しやすい。ネームスペースを class、module単位で分割可能。
- rakeだとスコープを共有するので名前の競合がつらい
- taskへ引数を渡しやすい
- テストコードが書きやすい
- おまじない的に書いていたものの、意味を把握したい
- rails環境で実行するという意味
eager_load
するとかかな...?
単独で実行される予定のないタスクについては、descを付与しないようにしてもいいかもしれません。 rake -T で実行可能なrakeタスクを表示する際、単独実行されるタスクが表示されると誤解させてしまうのを防ぐ意味でメリットがあります。
実行時にタスク名の引数として配列を渡す。各配列の要素に対してアクセサが定義され、タスク内で参照できるようになる
task :hoge, [:a, :b] do |task, args|
p args.a
p args.b
end
key=value 形式で渡すことが出来る。渡した値は ENV['key'] で取り出し可能
rake hoge LOGIN_NAME=
渡した引数は ENV[
Rakeタスクのテストが書きやすくなる
https://github.com/willnet/rake_shared_context
include_context 'rake'
subject { Rake.application.invoke_task('chart:check_to_exist_backups') }
allow(ENV).to receive(:[]).and_call_original
allow(ENV).to receive(:[]).with('LOGIN_NAME') { login_name }
allow(ENV).to receive(:[]).with('DEPARTMENT') { department_code }
and_call_original
Mockではなく元のメソッドを呼べる
output + to_stderr
context 'ログインネーム指定されていない場合' do
let(:login_name) { '' }
it 'エラーが発生し rake タスクの実行が中断される' do
expect { subject }.to output("ユーザーが見つかりませんでした。\n").to_stderr
.and raise_error(SystemExit)
end
end
_archives
などの階層の下に移動しておくと便利。
spec や rubocop などが不要に走らず節約できるため
/lib/tasks
配下に置く
- 90 分にしてみよう
- 15:00〜16:30
- 日曜日(12/19)
- やることは各自
- メモはHackMD継続