質問: 本番サービスで初めてRedisを使った運用をする予定です。 現在実装しようとしているのは、ユーザーがどのルームに入っているかの情報をRedisで保存する機能です。 ユーザーIDをキーに、ルームIDをバリューに入れるだけでも良いのかと当初は考えたのですが、複数デバイスからの利用を考えると次のような実装にしようと考えています。 アイデア 1 ------- **各ユーザーごとに独立したハッシュ型の値を生成し、キーにルームID、値に接続数を保存。** 接続数というのは、例えばスマホとPCで同じルームにアクセスしていた場合、どちらか一方が抜けてしまってもオフライン判定にならないように、端末ごとにカウントするものを想定しています。 (サンプル) | ルームID | 接続数 | | --- | --- | | 1 | 1 | | 2 | 2 | | 4 | 1 | 【懸念点】 ・ユーザーごとにキーを生成すると、キーが多くなりすぎて管理が煩雑になりそう? アイデア 2 ------- **接続数を管理するのは一つのキーで、ユーザーIDごとにJSONで管理する** アイデア1のハッシュ型をJSONの形式で埋め込んでしまうことで、一つのキーだけで管理できるようにします。 (サンプル) | ユーザーID | 値 | | --- | --- | | 1 | "{1: 1, 2:2, 4:1}" | | 2 | "{5: 1, 9: 3, 12: 1}" | | 3 | "{15: 1, 91: 3, 122: 1}" | 【懸念点】 ・そもそもJSON形式の運用はイレギュラーなのでは?という不安 ・JSONにすることでデコード時などにオーバーヘッドが生じる 今回思いついた案としては上の二つがあり、どちらが運用上適切かどうか教えていただけないでしょうか。 またこの2つ以外にもっと良い方法がありましたら、ぜひ教えて頂けると幸いです。 よろしくお願いします。
回答: 私ならサービスの利便性や拡張性を考え Hash 型を利用するかも。 DB:サービス Key:お店 field:ルーム value:ユーザ HGET(お店, ルーム) でルームに入ってるユーザ一覧を取得とかですかね。 色々な方式で格納を選択できるのが Redis の特徴だったりします。 http://redis.shibu.jp/commandreference/hashes.html