redisデータベースキャッシュの詳細

3917 ワード

redis需要背景
  • キャッシュは必須ではなく、パフォーマンスの向上が必要であるため増加します.
  • ターゲット:ディスク・データベースのクエリーを減らすためにmysqlのクエリーよりも、メモリからデータを読み取るmysqlのクエリー・データの方が1 s程度かかります.1 s以上は通常遅いクエリーと考えられていますが、ridesがサポートする操作性能は1 sで行うことができます(1 w~10 w)データ
  • 使用シーン:1.使用前提は頻繁に読み取る2.データは常に変化しないので、基本的には必ずキャッシュ処理をする.データは頻繁に変化する可能性があります.データが製品のコアデータであれば、キャッシュの構築を考慮することができます.キャッシュ時間が短く、5分間キャッシュしても、データベースクエリー操作を大幅に削減することができ、パフォーマンスを向上させることができます.

  • キャッシュアーキテクチャ
    マルチレベルキャッシュ
  • ローカルキャッシュグローバル変数ormフレームワークquerysetクエリーセット保存、ローカル保存キャッシュの役割
  • を果たす.
  • 外部キャッシュはマルチレベルキャッシュredisを構築することができ、mencachedキャッシュデータの保存方式
  • を得る.
  • シーケンス化文字列
  • setex('user:{user_id}:info')
    setex (''user:1:info,expiry,json.dumps(user_dict))
    
  • redisはhash,set,zset
  • のような他のデータ型を得る
    #   hash  :        ,        
    #   :     ,             
    hset('user:1:info',user_dict)
    

    キャッシュ有効期間
    データをキャッシュするには、次の理由で有効期間を設定する必要があります.
  • タイムリーにクリーンアップすることで、スペースを節約できます.
  • はデータの整合性を保証し、mysql中のデータとreids中のデータを保証し、更行データの後も継続することができ、一定時間以内にredisとmysql中のデータは異なるが、有効期間が過ぎるとredisはデータを整理し、再びデータを照会する際に新しいキャッシュデータを形成し、redisとmysqlはまた同じである.

  • redisの有効期間ポリシー
    共通の有効なポリシー:
  • タイミング失効
  • set a 100    10min
    set  b 100    20min
    

    タイマーをオンにし、有効期限が到着した後にデータを整理することは、各データに必要なタイマーと理解できます.欠点:パフォーマンスの消費
  • 不活性期限切れ保存データ有効期間が設定された後、このデータの有効期間を自発的に維持しない.
  • 定期的に期限切れになったデータが期限切れになっていないことを定期的にチェックします.例えば、100 msごとに期限切れと判断し、期限切れがあればすぐに整理します.

  • redisの有効期間ポリシー:不活性期限切れ+定期期限切れredisが定期期限切れを実現する場合、すべてのデータをクエリーするのではなく、100 msごとにランダムにいくつかのデータを選択して期限切れを判断し、100 msを超えてランダムにいくつかの判断を選択します.
    キャッシュの除外
    背景:redisのデータ有効期間ポリシーは、データが本当にクリーンアップされても、スペースが浪費される可能性があることを保証することはできません.また、新しいデータが保存される場所がありません.新しいデータを保存するためには、redisの新しいデータをクリーンアップし、新しいデータを保存するスペースを空ける必要があります.
    汎用メモリ淘汰アルゴリズム:LRU&LFU
  • LRU(least recently used、最近最小使用)思想:最近使用したデータほど、次に使用する機会が大きいほど、昔使用したデータ
  • を整理すべきだと考えている.
    cache_data  = [
    	cache1       
    	cache2
    	cache3
    	cache4         #    
    ]
    
       cache3
    cache_data  = [
    	cache3
    	cache1       
    	cache2
    	cache4
    ]
       cache4
    cache_data  = [
    	cache4
    	cache3
    	cache1       
    	cache2
    ]
    
  • LFU(least frequently used)の最小使用思想:使用回数の多いデータは、次に使用する機会が大きいほど、使用回数の少ないデータ
  • を整理すべきであると考えている.
    cache_data  = [
    	cache1 :200
    	cache2:5
    	cache3:150
    	cache4:1   #    
    ]
    
    

    Redisのメモリ淘汰ポリシー(3.x以降)
  • noeviction:メモリがデータを書き込むのに不足している場合、新しい書き込み操作はエラーを報告し、デフォルトはnoevitionです.
  • allkeys-lru:メモリが不足している場合に新しいデータを書き込む場合、キースペースで最近最も少ないkeyを削除します.
  • allkeys-random:メモリが新しいデータに書き込まれない場合、キースペースでキーをランダムに削除します.
  • volatile-lru:メモリが新しいデータに書き込まれていない場合、有効期限が設定されているキースペースで、最近最も少ないkeyを削除します.
  • vlatile-random:メモリが不足して新しいデータを書き込む場合、有効期限が設定されているキースペースでキーをランダムに削除します.
  • volatile-ttl:メモリが不足して新しいデータを書き込む場合、有効期限が設定されたキースペースでは、より早い時間のkeyが優先的に削除されます.redisの構成
  • maxmemorry    redis         
    maxmemorry-policy volati-lru         
    

    キャッシュ・モード
    アプリケーションがキャッシュを使用する方法
  • キャッシュシーンを読む:頻繁にデータベースをクエリーするシーン方式:アプリケーションとmysqlデータベースの間でredisをキャッシュと仮定し、データを保存するときにキャッシュredisに保存し、直接redisに保存せず、その後redisからmysqlにデータを同期する.
  • キャッシュシーンを書く:頻繁にデータを保存する必要があるシーン方式:アプリケーションとmysqlデータベースの間にredisをキャッシュとして架設し、データを保存する時にredisに保存し、mysqlに直接保存しないで、その後reidsからデータを同期してmysqlまで中読キャッシュの大きいデータ同期問題:mysqlから得たデータを修正し、Redisでキャッシュされたデータの処理方法
  • まずデータベースを更新し、更新キャッシュ
  • まずキャッシュを削除し、更新データベース
  • まずデータベースを更新し、削除キャッシュで問題が発生する確率が小さく、負の影響が最小
  • である.
    キャッシュの使用中に問題が発生する可能性があります
  • キャッシュスルー問題:クエリーに存在しないデータの場合、キャッシュは空で、データも空で、アクセスするたびにデータベースに落下し、データベースの性能が悪くなる解決:キャッシュに存在しないデータを保存するより、-1で保存し、データが存在しないことを示し、このような攻撃をブロックすることができ、データベースクエリー
  • を減らす
  • キャッシュ雪崩問題:データをキャッシュする時、同じ時効を設定して、ちょうど同時アクセスして、データはすべて失効して、クエリーキャッシュが空になって、直接データベースにアクセスして、データベースは担ぐことができなくて、崩壊して解決します:1.データの有効期間に偏差値を増やし、同じデータを異なる期間で失効させる.2.マルチレベルキャッシュは、各レベルのキャッシュの時効が異なると仮定します.3.保護データベースから出発し、データベース操作にロック
  • を追加する.