🗂️

re:Invent2024におけるValkey関連セッションまとめ

2024/12/20に公開

Social Databank Advent Calendar 2024 の20日目です。

AWS re:Invent 2024 における、Valkey 関連のセッションのまとめです。

Valkeyとは?

2024年3月のRedisのライセンス変更 によって Redisからフォークされたプロジェクト で、Redisに携わったメンテナーやコミュニティによって引き続きオープンソースとして提供されており、パフォーマンスや効率性がより高まっているとされています。

AWS(ElastiCache)におけるValkey

先述のRedisのライセンス変更が背景にと考えられますが、
2024年10月のValkeyサポート発表(日本語) 以降、
リザーブドノードの柔軟性対応(日本語)Valkey8.0のサポート(日本語)、また価格面で優位性を持たせるなど精力的な対応が行われている

re:Invent2024におけるValkey

re:Invent2024では、OPN304とDAT422という2つのセッションでValkeyが取り上げられていました。

OPN304-R: Maximize application performance with Valkey

Using Valkey with your application tends to give quick performance wins using only a few strategically placed GETs and SETs. However, understanding all of Valkey’s data types and commands unlocks even more use cases and performance boosts. This builders’ session gives you an overview of the entire Valkey landscape of data types and their related commands, linking them to real-world use cases with hands-on exercises. Previous Valkey or Redis experience is helpful, but this session starts at the basics and moves quickly to touch on more advanced topics. You must bring your laptop to participate.

  • Session types: Builders' session
  • Level: 300 – Advanced

会場の雰囲気などは DevelopersIOによるまとめ をご覧ください。
私の着いた卓では各自与えられたAWS環境を使ってもくもく学習を進める形式で、ノベルティもステッカーとキーホルダーでした。

実習内容

Pythonにて valkey-glide ライブラリを使ってvalkeyコマンドの実行時間を比べるといった内容でした。

ハッシュ型におけるデータ取得

HGetAll コマンドは、

O(N) where N is the size of the hash.

であり、ハッシュのサイズに応じて実行時間が長くなります。

  • 15000要素の場合でも18ms程度で取得できるというメモリデータベースのパワーを体験
  • しかし、意図せずに要素が巨大になってしまった場合、処理をブロッキングしてしまう可能性がある
    • それを防止するには HScan コマンドを代わりに使うことで読み込み量の上限を設定できる。

複数bool値のValkeyでの取り扱い

例えば機能フラグのデータといった、複数のbool値を扱う場合を考えましょう。

  • ハッシュで管理すれば、HGet コマンドはO(1)なので、高速に値を得られる
  • bool値の場合、SetBit コマンドや GetBit コマンドを使い、ハッシュではなくBitmap型にすることで容量を節約して記録できる
    • MemoryUsage コマンドを使ってハッシュ型とBitmap型のデータサイズを比較した

※Valkeyではハッシュのサイズが閾値(設定のhash-max-listpack-entriesとhash-max-listpack-valueで決定)を超えるとlistpack形式に変換されサイズが変わる
(Redis6.2以前はziplist形式であった)

コネクションの取り扱い

  • コネクション(GlideではClient相当)インスタンスをコマンド実行のたびに作成すると、オーバーヘッドが生じる
    • なのでコネクションのインスタンスは使いまわすのがよい
    • 実際に時間計測して使いまわす方がよいことを体験

DAT422: Advanced data modeling for Amazon ElastiCache

This session delves into the intricacies of Amazon ElastiCache data modeling using the purpose-built Valkey data types to optimize application performance and scalability. Explore the use of strings, sets, sorted sets, hashes, bitmaps, and geospatial indexes to model complex relationships and solve use cases such as caching, session store, feature store, real-time analytics, geospatial applications, and rate limiters.

  • Session types: Breakout session
  • Level: 400 – Expert

https://www.youtube.com/watch?v=Ej6TRC_uYzA

詳細は こちらの日本語まとめ にゆずります

  • RDSやDynamoDBのキャッシュとしてValkeyを用い、パフォーマンスを向上させる構成の紹介
    • SetNx パターンを使って、バックエンドDBへの流量を制御する方法
  • PubSub 機能を使ってローカルキャッシュと組み合わせて更にパフォーマンスを向上させる方法
  • 生成AIやリアルタイム分析での使用例紹介
  • 特殊なデータ型を使ったサンプル紹介
    • HyperLogLog(HLL) 型を使った高効率ユニークユーザー訪問数の実装
    • Geospatial 型を使った位置情報を使ったマッチングの実装
    • Luaスクリプト 機能を使った、レート制限の実装
      • そろそろIncrにExpireオプション公式で実装してほしい
  • 運用のベストプラクティス紹介
    • データロスを許容できないならMemoryDBがよい
    • 負荷分散のために、キャッシュTTLにはjitterを足すのがよい
    • ストアのサイズ制御のベストプラクティスはElasticache Serverless
    • keysコマンドなどの高負荷のコマンドはリーダーに対して実行する

結論

事前ではValkey8.0にて追加された機能や、Redisとのパフォーマンス比較などのValkeyならではの優位性を学べると期待していたのですが、
実際はどちらのセッションもRedis時代と共通する特質やデータ型の紹介と言った内容でした。
特にDAT422の方は、valkeyを使った典型的な実装パターンが多く紹介されていたので、デザインパターンまとめとしてよいセッションだと感じました。

ソーシャルデータバンク テックブログ

Discussion