kakts-log

技術・エンジニアリング組織などについて調べたことをまとめます

[Valkey] valkey-bloom モジュールによるブルームフィルターの利用

概要

今回は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のドキュメントの方で詳細を確認できます。

redis.io

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クライアントからブルームフィルターの機能を使うことができました。