はじめに
個人開発しているSNSサービスで、ユーザーのブロック機能を実装している際に、Redisキャッシュ・無限スクロール・ユーザーごとのフィルタリングが絡む設計上の問題に直面しました。
最初は「ブロックしたユーザーの投稿を表示しない」というシンプルな機能だと思っていましたが、実際に実装を進めると、ページネーションやキャッシュ戦略にも影響することが分かりました。
この記事では、発生した問題、原因、検討した解決案を整理し、現在どのような方針で実装を進めているかをまとめます。
※この記事の内容は執筆時点ではまだ検証・実装中です。最終的な解決方法については、実装完了後に追記または別記事としてまとめる予定です。
目次
1. 実装の目的
ブロック機能を実装した理由
ブロックした/されたユーザーの投稿を非表示にしたい
2. システム構成
3. 発生した問題
・無限スクロールで投稿数が不足する
4. 原因分析
・投稿取得後にフィルタリングしていたページネーションとの整合性が崩れた
5. 解決案
1) SQLで除外する
1-1) 内容
WHERE NOT IN
NOT EXISTS
1-2) 問題点
・Redisキャッシュとの相性が悪い
・共通キャッシュにユーザー固有データが混ざる可能性
2) Redis取得後にフィルタリング
2-1) 内容
・Redis取得
・フィルタ
・不足したら追加取得
2-2) 懸念点
・ブロック数が多い場合のパフォーマンス
・取得回数が増える可能性
6. 現在の状況
・まだ実装中
・各案を比較検討中
7. 学んだこと
・キャッシュとユーザー固有データは分離して考える必要がある
・ページネーションとフィルタリングの順序は重要