@syuilo Mastodonはユーザー別のホームとリストをそれぞれRedisにOrderedSetで800件保持して、大小比較可能なStatusID(SnowflakeID)をscoreにしてソート状態で、StatusIDやブーストのStatusIDを値にして持たせている。
新規投稿をフィードするときは、OrderdSetにまず追加して、それを800件にトリミングすることで件数を維持してる。
誰かをフォローしたらそれをOrderedSetにまとめて追加したり(タイムラインにその人の過去投稿が一気に追加される)、解除したら削除したり、という処理を行っている。
ホームやリストを取得するときは、RedisからIDだけ取り出して、DBからそのID使ってデータ本体を取り出す手間をかけているんだけど、ここで削除済み投稿を外したりミュート・ブロックやワードミュートなどのフィルター処理をする。Redisにキャッシュした時点とは状態が変わっている可能性があるので、40件の取得なら40件単位でこの処理だけはDBとサーバ側コードでやってる。
@noellabo@fedibird.com 🙏🙏🙏🙏