[Redis functions | Redis](https://redis.io/docs/manual/programmability/functions-intro/)
- [[Redis 7.0]]
- Evalにとってかわる機能
- Evalはアプリでの管理 => FunctionsはRedisサーバが管理
## Prologue (or, what's wrong with Eval Scripts?)
- EVALを使用する場合、アプリケーションは毎回スクリプト全体を送信して実行する必要があります。
- EVALSHAコマンドという形で最適化を提供します。最初にSCRIPT LOADを呼び出してスクリプトのSHA1を取得することで、アプリケーションはその後、そのダイジェストだけを繰り返し呼び出すことができます。
- SCRIPT FLUSHの呼び出し後、サーバーの再起動後、レプリカへのフェイルオーバー時など、いつでもスクリプトのキャッシュが失われる可能性があるスクリプトはアプリケーションの一部であり、Redisサーバーで管理されるものではないというのが基本的な考え方です。
- このアプローチは、多くの軽量スクリプトのユースケースに適していますが、アプリケーションが複雑になり、スクリプトに大きく依存するようになると、次のようないくつかの困難が生じます。
すべてのクライアントアプリケーションインスタンスは、すべてのスクリプトのコピーを保持する必要があります。つまり、スクリプトの更新をアプリケーションのすべてのインスタンスに適用するメカニズムが必要です。
- トランザクションのコンテキスト内でキャッシュされたスクリプトを呼び出すと、スクリプトが見つからないためにトランザクションが失敗する可能性が高くなります。失敗する確率が高くなると、キャッシュされたスクリプトをワークフローの構成要素として使用する魅力が半減します。
- EVALを素直に使用すると、クライアントアプリケーションがKEYSやARGV Lua APIを責任を持って使用する代わりに、スクリプトをそのままレンダリングするというアンチパターンが促進されます。
- スクリプトは別のスクリプトを呼び出すことができません。
Redis v7.0では、このようなニーズに対応するため、すでに確立され、好まれているエフェメラルスクリプトの変更を避けながら、Redis Functionsを導入しました。
## What are Redis Functions?
- ファンクションはスクリプトと同じコア機能を提供しますが、データベースの第一級のソフトウェア成果物です。
- Redisは関数をデータベースの一部として管理し、データの永続化とレプリケーションによってその可用性を保証します。関数はデータベースの一部であり、使用前に宣言されるため、アプリケーションは実行時に関数をロードする必要がなく、トランザクションが中断されるリスクもありません。関数を使用するアプリケーションは、データベース内に埋め込まれたスクリプトロジックではなく、関数のAPIにのみ依存します。
- エフェメラルスクリプトがアプリケーションのドメインの一部とみなされるのに対し、関数はユーザが提供するロジックでデータベースサーバ自体を拡張します。
- 関数は、モジュールに似たRedisのコアコマンドで構成されるリッチなAPIを公開するために使用され、一度開発すれば起動時にロードされ、さまざまなアプリケーションやクライアントによって繰り返し使用されます。各関数にはユニークなユーザー定義名が付けられているため、呼び出しや実行の追跡が非常に簡単になります。
- 関数の作成に使用するプログラミング言語と、サーバーによる関数の管理を区別することも試みられています。Redisが現在、組み込み実行エンジンとしてサポートしている唯一の言語インタプリタであるLuaは、シンプルで習得しやすいように意図されています。しかし、言語としてLuaを選択したことで、多くのRedisユーザは未だに課題を抱えています。
Redis Functionsの機能は、実装の言語を前提としない。関数の定義の一部である実行エンジンが、関数の実行を処理します。エンジンは、いくつかのルール(実行中の関数を終了させる機能など)を守る限り、理論的にはどの言語でも関数を実行することができます。
現在、RedisにはLua 5.1エンジンが1つだけ組み込まれています。将来的には、さらに多くのエンジンに対応する予定です。Redisのファンクションは、Luaのすべての機能をエフェメラル・スクリプトに使用することができますが、唯一の例外はRedis Luaスクリプト・デバッガです。
- また、関数はコード共有を可能にすることで、開発を簡素化します。全ての関数は1つのライブラリに所属し、任意のライブラリは複数の関数で構成されることが可能です。
- 関数は、前述のように、論理スキーマによってデータ実体の一貫した表示を維持するというユースケースをよりよくサポートすることを目的としている。そのため、関数はデータそのものと一緒に保存される。また、関数はAOFファイルに保存され、マスターからレプリカに複製されるため、データそのものと同様に耐久性があります。Redisがエフェメラルキャッシュとして使用される場合、関数の耐久性を高めるために追加のメカニズム(後述)が必要になります。
- Redisの他のすべての操作と同様、関数の実行はアトミックです。