JavaScriptを有効にしてください

【Elixir】キャッシュを簡単に扱う Cachex の紹介

 ·  ☕ 2 分で読めます

【Elixir】キャッシュを簡単に扱う方法: Cachex の紹介

Elixir では、Cachex という強力なキャッシュライブラリを使用することで、簡単にキャッシュを扱うことができます。
この記事では、Cachex のインストール方法と基本的な使い方を紹介します。

以下のドキュメントを参考にしています。
Cachex — Cachex v3.6.0

環境

  • Elixir 1.14.2
  • Cachex 3.6

Cachex のインストール方法

Cachex をプロジェクトに追加するには、mix.exs ファイルの deps 関数に Cachex を追加します。

1
2
3
4
5
def deps do
  [
    {:cachex, "~> 3.6"}
  ]
end

その後、ターミナルで mix deps.get コマンドを実行して、Cachex をインストールします。

使用方法

キャッシュ定義

アプリケーションの supervision tree に Cachex キャッシュプロセスを追加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
defmodule Demo.Application do
  use Application

  def start(_type, _args) do
    children = [
      {Cachex, name: :my_cache}
    ]

    opts = [strategy: :one_for_one, name: Demo.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

複数のキャッシュを扱いたい時は {Cachex, name: :my_cache2} など新たに追加することで可能です。

キャッシュ追加

キャッシュにデータを追加する。

1
2
# キャッシュ追加(キャッシュ生存時間 5秒
Cachex.put(:my_cache, "key", "value", ttl: :timer.seconds(5))

キャッシュ取得

キャッシュからデータを取得する。

1
2
3
4
case Cachex.get(:my_cache, key) do
  {:ok, value} -> value # キャッシュあり
  :not_found -> nil # キャッシュなし
end

キャッシュ削除

キャッシュを削除します

1
Cachex.del(:my_cache, "key")

キャッシュにデータがない場合のデフォルト動作を定義

キャッシュにデータがない場合の動作を定義しておけます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
result = Cachex.fetch(:my_cache, "key", fn key ->
    # データが無い場合にデータを返す
    result = %{key => "test"}

    #24時間有効
    {:commit, result, ttl: :timer.hours(24)}
  end)

case result do
  {:commit, value, opt} ->
    # キャッシュが登録

  {:ok, value} ->
    # キャッシュが存在

  true ->
    # その他
end

:commit でキャッシュデータを入れて返します。
:ignore を指定すると値を入れません。

複数のCacheを使う

複数のキャッシュストアを設定する際は以下のようにしてください。
単純にコピペすると同じIDで子プロセスを作るためエラーが出ます。

1
2
3
4
5
6
7
8
    children = [

      # キャッシュ1
      Supervisor.child_spec({Cachex, name: :cache_1}, id: :cache_1),
      # キャッシュ2
      Supervisor.child_spec({Cachex, name: :cache_1}, id: :cache_2)
    ]

参考

共有

こぴぺたん
著者
こぴぺたん
Copy & Paste Engineer