Redis学習ノート(九)redisは時々生中継リストキャッシュを実現し、ページング[ホットスポットデータストレージ]をサポートする


redisシリーズ記事ディレクトリ
  • spring-data-redisを用いてincr自己増加
  • を実現する.
  • Redis Hashストレージによるメモリ節約
  • Redis学習ノート(九)redisは時々生中継リストキャッシュを実現し、ページング[ホットスポットデータストレージ]
  • をサポートする.
  • Redis学習ノート(8)redisのluaスクリプト学習
  • Redis学習ノート(七)jedisタイムアウト再試行メカニズム注意事項
  • Redis学習ノート(六)redis実装分散ロック
  • Redis学習ノート(五)jedis(JedisCluster)操作Redisクラスタredis-cluster
  • redisラーニングノート(4)キャッシュとデータベースの整合性の問題
  • redis学習ノート(3)データ淘汰戦略
  • redis学習ノート(二)JedisCluster+redis 3.2.5クラスタ
  • redis学習ノート(一)redis 3.2.5クラスタのインストールとテスト
  • 需要説明
    生中継プラットフォームでは、ユーザーが生中継リストを表示します.このリストデータは時々性があり、ホットスポットデータが強いです.つまり、毎時毎刻新しい生中継がある可能性があります.これらのデータは、毎回データベースから読み出すのは望ましくないので、redisを用いて実現することが考えられる.
    redisシーケンスセットを使用して生中継リストを保存する
    考え方の概要
    常に新しいデータがsortedsetに入る可能性があるため、redisの秩序化された集合を使用して格納されます.順序付きコレクションを使用するのは、ページをめくるときに重複データがないことを考慮し、重複データの出現を許可する必要がある場合は、先進的な先頭キューqueueを使用することができます.
    重複データの発生原因:ユーザーが現在第1ページのデータを見ていると、sortedSetに2つの新しいデータが挿入され、zrevrange(key, pageSize*pageNum, pageSize*(pageNum+1)で値を取ると、2つの重複データが発生します.
    データが生成されるたびにredis秩序セットに追加され、ID(idが数値型である場合)またはタイムスタンプ(これは処理するが、後述する)に基づいてソートされます.取るときは以下の方法で値を取ります.
    Set zrevrangeByScore(final String key, final double max, final double min, final int offset, final int count)

    ページごとに5つのデータがある場合:第1ページ:jedisCluster.zrevrangeByScore(key , Double.MAX_VALUE , 0, 0 , 5)第1ページの後のデータを記録するscoreはM第2ページ:jedisCluster.zrevrangeByScore(key , M , 0 ,1, 5)である.
    ここで使用しているjedisClusterクライアント
    sortedSetコレクションの数を保証する方法
    100個のデータしかキャッシュされていない場合は、ページごとに10個表示されます.redisに文字列を保存するときに使用されるSDS動的文字列のようなバッファポリシーをとることができます.保存するたびにsetの大きさzcardを検出することができ、zcardが120を超えると(20個のマルチキャッシュが許可され、setを切り取る操作回数を減らし、効率を高めることができる)、以下のコマンドを使用して100に切り取ることができます.
    jedisCluster.zremrangeByRank(key, 0, jedisCluster.zcard(key)-100)

    同時セキュリティ
    上記のポリシーには、2つのステップを含む同時セキュリティの問題があります.1.setにデータを挿入します.2.sortedSetサイズを問い合わせる、120より大きいかどうかを判断する.120より大きい場合、zremrangeByRankの動作が行われる.
    高同時環境では、zremrangeByRankを複数回実行することが容易である.
  • 解決策:
  • luaスクリプトを使用して、上記の操作をluaスクリプトに書きます.luaスクリプトで実行される操作は原子的であり,スレッドが安全である.ただし、redisはluaスクリプトを実行するときに他のリクエストを処理できないことに注意してください.
    ページをめくるとキャッシュサイズを超える
    この場合、データベース内のクエリーや検索エンジンを考えることができます.結局、ユーザーが最も多く見ているのは前のページのデータです.具体的にどの程度のデータをキャッシュするかは、実際の業務に基づいて計算する.