2023年9月26日火曜日

dogpile.cache 超入門

dogpile.cache 超入門

概要

dogpile.cache は SQLAlchemy のクエリキャッシュのために作られたライブラリでその名の通りクエリキャッシュに使います
しかし dogpile.cache 自体は単なる関数キャッシュとしても使えるので今回は SQLAlchemy なしで簡単に動かせるサンプルコードを紹介します

環境

  • macOS 13.5.2
  • Python 3.11.5
  • dogpile.cache 1.2.2

サンプルコード

from dogpile.cache import make_region

# Dogpileキャッシュリージョンを作成
cache_region = make_region().configure(
    "dogpile.cache.memory",  # メモリキャッシュを使用しますが、他のバックエンドも利用可能です
    expiration_time=3600,  # キャッシュの有効期限を設定(秒単位)
)


# キャッシュする関数を定義
@cache_region.cache_on_arguments()
def expensive_function(x, y):
    print("Function executed!")
    return x + y


# 関数を呼び出してキャッシュを利用
result1 = expensive_function(2, 3)
print("Result 1:", result1)  # この行が実行されると、関数が実際に呼び出されます

# 同じ引数で関数を再度呼び出し
result2 = expensive_function(2, 3)
print("Result 2:", result2)  # この行はキャッシュから結果を取得します

# 別の引数で関数を呼び出し
result3 = expensive_function(4, 5)
print("Result 3:", result3)  # この行が実行されると、新しい結果がキャッシュされます

ちょっと解説

result1 と result3 は関数を実行しています
result2 は関数を実行せずキャッシュ (メモリ) から結果を取得しているため「Function executed!」が表示されないのが確認できます

またdogpile.cache.memoryでキャッシュ先のバックエンドを指定することもできます
今回はメモリを使っていますが他にも redis や memcached などいろいろなバックエンドがキャッシュ先として使えます

最後に

アノテーションを一つ付けるだけで簡単に関数の結果をキャッシュすることができます
大量にコールされる関数でかつ結果が非同期でも問題ない場合は使えるかなと思います
結果が非同期というかどんな結果でも問題ないような関数の場合には使えると思います

次回は SQLAlchemy と組み合わせて使ってみたいと思います

参考サイト

0 件のコメント:

コメントを投稿