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つの新しいデータが挿入され、
データが生成されるたびにredis秩序セットに追加され、ID(idが数値型である場合)またはタイムスタンプ(これは処理するが、後述する)に基づいてソートされます.取るときは以下の方法で値を取ります.
ページごとに5つのデータがある場合:第1ページ:
ここで使用しているjedisClusterクライアント
sortedSetコレクションの数を保証する方法
100個のデータしかキャッシュされていない場合は、ページごとに10個表示されます.redisに文字列を保存するときに使用されるSDS動的文字列のようなバッファポリシーをとることができます.保存するたびにsetの大きさ
同時セキュリティ
上記のポリシーには、2つのステップを含む同時セキュリティの問題があります.1.setにデータを挿入します.2.sortedSetサイズを問い合わせる、120より大きいかどうかを判断する.120より大きい場合、
高同時環境では、解決策:
ページをめくるとキャッシュサイズを超える
この場合、データベース内のクエリーや検索エンジンを考えることができます.結局、ユーザーが最も多く見ているのは前のページのデータです.具体的にどの程度のデータをキャッシュするかは、実際の業務に基づいて計算する.
生中継プラットフォームでは、ユーザーが生中継リストを表示します.このリストデータは時々性があり、ホットスポットデータが強いです.つまり、毎時毎刻新しい生中継がある可能性があります.これらのデータは、毎回データベースから読み出すのは望ましくないので、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スクリプトを実行するときに他のリクエストを処理できないことに注意してください.ページをめくるとキャッシュサイズを超える
この場合、データベース内のクエリーや検索エンジンを考えることができます.結局、ユーザーが最も多く見ているのは前のページのデータです.具体的にどの程度のデータをキャッシュするかは、実際の業務に基づいて計算する.