概要
今回はValkeyにおいて、ブルームフィルターの機能を有効にする方法をまとめます。
valkey-server起動時にvalkey-bloomというモジュールを指定することで、Valkeyにブルームフィルター機能を追加することができます。
ブルームフィルターについては、以前のまとめた記事がありますのでこちらを参照ください。
kakts.dev
valkey-io/valkey-bloomについて
valkey-bloomは、Valkey公式のリポジトリで管理されているブルームフィルター用のValkey モジュールです。
github.com
Redisのブルームフィルター関連コマンド(BF.*)と互換性があり、Redisから移行した際にもこのモジュールを有効にしていれば使うことができます。 `
Valkeyサーバでブルームフィルターを使えるようにする
Valkeyのサーバでは、デフォルトではブルームフィルターの機能が使えないため、valkey-bloomモジュールを有効にしてBF.*コマンドを使えるようにします。
valkey-bloomモジュールのビルド
ここでは下記環境を前提に解説します。 rustで書かれたモジュールのため、rust関連のコマンドも必要となります。
環境
- ubuntu 22.04
- rustc , cargo: 1.84.0
ここで、valkey-io/valkey-bloomのREADMEに記載の通り、cargo buildを使ってビルドしていきます。
cargo build --all --all-targets --release
このコマンド実行により、target/release/libvalkey_bloom.so に.soファイルが生成されます。
この.soファイルを、valkey-server起動時にオプションか、valkey.confで指定してあげれば利用可能です。
valkey-bloomモジュールを有効にする
Valkeyのサーバでvalkey-bloomモジュールを有効にする方法は、下記の2つあります。
- valkey.conf内で
loadmoduleディレクティブでビルドしたものを指定 - valkey-server起動時に --loadmodule オプションで指定
- valkey-serverを起動した上で、valkeyのクライアントで
MODULE LOADで.soファイルを指定
valkey.confで指定する方法
redis.confのように、Valkeyでも起動時の設定をvalkey.confファイルにまとめることができます。
loadmodule ディレクティブを使って .soファイルのパスを指定してあげます。
loadmodule /path/to/libvalkey_bloom.so
# valkey-server起動
valkey-server /path/to/valkey.conf
valkey-server起動時の--loadmoduleオプションで指定する方法
valkey.confでの指定でなく、--loadmoduleオプションでも指定できます。
valkey-server --loadmodule /path/to/libvalkey_bloom.so
valkeyのクライアントでMODULE LOAD で.soファイルを指定
valkeyのソースコードをビルドした際にvalkey-cliというコマンドも生成されます。 これを使ってvalkeyのサーバに接続したあと、MODULE LOAD /path/to/libvalkey_bloom.so を実行することでモジュールをロードできます。
127.0.0.1:6379> MODULE LOAD /path/to/libvalkey_bloom.so
上記3つの方法のどれかでvalkey-bloomモジュールを有効にすることで、クライアントからBF.*関連のコマンドが使えるようになります。
127.0.0.1:6379> BF.ADD (error) ERR wrong number of arguments for 'BF.ADD' command
試しにBF.ADDを実行してみると、コマンドが存在することが確認できます。
次は、実際にコマンドを実行してみて、簡単にブルームフィルターの機能を試します。
valkey-bloomモジュールで使えるコマンド
基本的にはredisで元々使えていたブルームフィルター関連のコマンドBF.* と互換性があり、redisのドキュメントの方で詳細を確認できます。
2025年1月時点ではvalkey-bloomでは下記コマンドをサポートしています。
- BF.EXISTS
- BF.ADD
- BF.MEXISTS
- BF.MADD
- BF.CARD
- BF.RESERVE
- BF.INFO
- BF.INSERT
- BF.LOAD
ここでは簡単な使い方をまとめます。
BF.ADD
127.0.0.1:6379> BF.ADD a b (integer) 1 127.0.0.1:6379> BF.ADD a b (integer) 0 # key: aに対してbが追加済みのため0 127.0.0.1:6379> BF.ADD a c (integer) 1
BF.CARD カーディナリティの確認
ここでは、指定したキーのブルームフィルタのカーディナリティ、つまり要素数を確認できます。
127.0.0.1:6379> BF.CARD a (integer) 2 # key: aに対して b, cというアイテムが追加されているため2
BF.EXISTS 要素がブルームフィルターに存在するかの確認
ブルームフィルターの仕組み上、偽陽性があります。
127.0.0.1:6379> BF.EXISTS a b (integer) 1 # 存在する 127.0.0.1:6379> BF.EXISTS a d (integer) 0 # 存在しない
BF.INFO 指定したブルームフィルターに関する情報を確認する
BF.INFOは、下記のように、ブルームフィルターの要素数やキャパシティなどの情報を確認できます。
127.0.0.1:6379> BF.INFO a 1) Capacity 2) (integer) 100 3) Size 4) (integer) 384 5) Number of filters 6) (integer) 1 7) Number of items inserted 8) (integer) 2 9) Expansion rate 10) (integer) 2
こういう感じでvalkey-bloomモジュールをビルドし.soファイルを生成した上でモジュールを有効にし、valkeyクライアントからブルームフィルターの機能を使うことができました。