MySQLとRedisでセカンダリキャッシュを実装する方法の詳細な説明

MySQLとRedisでセカンダリキャッシュを実装する方法の詳細な説明

Redis の紹介

Redis は完全にオープンソースで無料であり、BSD プロトコルに準拠しており、高性能なキー値データベースです。

Redis やその他のキー値キャッシュ製品には、次の 3 つの特徴があります。

  • Redis はデータの永続性をサポートしています。メモリ内のデータをディスクに保存し、再起動時に再度読み込むことができます。
  • Redis は単純なキー値データだけでなく、リスト、セット、zset、ハッシュ、その他のデータ構造のストレージも提供します。
  • Redisはデータバックアップ、つまりマスタースレーブモードでのデータバックアップをサポートしています。

利点

  • 高性能 - Redis は 110,000 回/秒の読み取りと 81,000 回/秒の書き込みが可能です。
  • 豊富なデータ型 – Redis は、バイナリの場合、文字列、リスト、ハッシュ、セット、順序付きセットのデータ型操作をサポートします。
  • アトミック – すべての Redis 操作はアトミックです。つまり、操作は成功するか失敗するかのいずれかであり、まったく実行されません。個々の操作はアトミックです。複数の操作は、MULTIおよびEXEC命令でラップすることでトランザクション、つまりアトミック性もサポートします。

ダウンロードとインストール

ダウンロードして解凍する

http://download.redis.io/releases/redis-5.0.3.tar.gz をダウンロードしてください
tar xzf redis-5.0.3.tar.gz

フォルダを/usr/local/に移動する

mv redis-5.0.3 /usr/local/

フォルダに移動してテストをコンパイルします

/usr/local/redis-5.0.3 をコピーします
sudo テストを実行する

コンパイルしてインストールする

sudo インストール

Redisを起動する

redis サーバー

セカンダリキャッシュとしてのMySQLとRedis

アクセス数が多いデータの場合、データをより速く取得するために、データベースから取得したデータをキャッシュする必要があります。

プロジェクトでRedisキャッシュプロセスを使用する

  • クエリを実行するときは、まずキャッシュからクエリを実行します
  • キャッシュにデータがない場合、データベースからクエリを実行し、キャッシュにデータを保存します。
  • データがキャッシュ内に見つかった場合、データベースにクエリを実行せずに直接返されます。

データ キャッシュでは、同期の問題を考慮する必要があります。データがキャッシュされている場合、データを照会するときに、キャッシュ内にデータがあれば、データベースを照会せずにキャッシュされたデータが直接返されます。データベース データが変更されると、データベースの不整合が発生する可能性があります。データベースを変更するたびに、対応するキャッシュ データを削除して、再度クエリを実行するときにデータベースをクエリしてキャッシュするようにすることを検討できます。

実装手順

接続プールを初期化するためのredisPool.goファイルを作成する

パッケージ redigo_pool

輸入 (
 "フラグ"
 「github.com/garyburd/redigo/redis」
 "時間"
)
var (
 プール *redis.Pool
 RedisServer = flag.String("redisServer", ":6379", "")
 
)
関数init() {
 プール = &redis.Pool{
  MaxIdle: 3, // アイドルリンクの最大数。Redis 接続がない場合でも、N 個のアイドルリンクはクリアされずに維持されることを示します。MaxActive: 3, // アクティブ接続の最大数。同時に存在するリンクの最大数を示します。IdleTimeout: 240 * time.Second, // アイドルリンクの最大待機時間。この時間を超えると、アイドルが閉じられます。Dial: func() (redis.Conn, error) {
   c, err := redis.Dial("tcp", *RedisServer)
   err != nil の場合 {
    nil、エラーを返す
   }
   c を返す、エラー
  },
  TestOnBorrow: func(c redis.Conn, t time.Time) エラー {
   time.Since(t) < time.Minute の場合
    nilを返す
   }
   _, エラー:= c.Do("PING")
   エラーを返す
  },
 }
}

セカンダリキャッシュを実装するためのmain.goファイルを作成する

パッケージメイン

輸入 (
 「データベース/SQL」
 「エンコーディング/json」
 「fmt」
 「github.com/garyburd/redigo/redis」
 _ "github.com/go-sql-driver/mysql"
 「strconv」
 「web/redis/redigo_pool」
 _ "web/redis/redigo_pool"
)

タイプPerson構造体{
 ID int `db:"id"`
 名前文字列 `db:"name"`
 年齢 int `db:"age"`
 Rmb int `db:"rmb"`
}

関数main() {
 var コマンド文字列
 のために{
  fmt.Println("コマンドを入力してください")
  fmt.Scan(&cmd)
  スイッチコマンド{
  ケース「getall」:
   すべて取得()
  デフォルト:
   fmt.Println("他のコマンドを認識できません")
  }
  fmt.Println()
 }
}

getAll()関数{
 //接続プールから接続を取得します conn := redigo_pool.Pool.Get()
 //まずredisにデータがあるかどうかを確認します//conn,_ :=redis.Dial("tcp","localhost:6379")
 conn.Close() を延期する
 値、_ := redis.Values(conn.Do("lrange", "mlist",0,-1))

 len(値) > 0 の場合 {
  //データがある場合 fmt.Println("Redisからデータを取得")
  //_ の redis から直接取得します。キー:= 範囲値{
   pid := 文字列(キー.([]バイト))
   id ,_:= strconv.Atoi(pid)
   結果、_ := redis.Bytes(conn.Do("GET",id))
   var p 人
   err := json.Unmarshal(結果、&p)
   err != nil の場合 {
    fmt.Println("json デシリアライズ エラー")
   }それ以外 {
    fmt.Printf("name = %s\n",p.Name)
   }
  }
 }それ以外 {
  fmt.Println("mysqlから取得")

  //データベースをクエリ db,_ := sql.Open("mysql","root:Szt930708@tcp(localhost:3306)/mydb")
  db.Close() を延期する

  var persons []人

  行、_ := db.Query("人から id、名前、年齢、rmb を選択")
  行のNext() {
   変数ID int
   変数名文字列
   変数 年齢 int
   var rmb int
   行.Scan(&id,&name,&age,&rmb)
   per := 人{id,名前,年齢,rmb}
   人 = append(人、あたり)

  }
  //redis に書き込み: ハッシュモードで person を redis に書き込みます for _,p := range persons{

   p_byte,_ := json.Marshal(p)
   _,err1 := conn.Do("SETNX",p.Id,p_byte)
   _,err2 := conn.Do("lpush","mlist",p.Id)
   // 有効期限を設定します conn.Do("EXPIRE",p.Id,60*5)
   err1 != nil || err2 != nil の場合 {
    fmt.Println("書き込みに失敗しました")
   }それ以外 {
    fmt.Println("書き込みに成功しました")
   }
  }
  conn.Do("EXPIRE","mlist",60*5)
 }
}

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • MySQL クエリ キャッシュとバッファ プール
  • mysqldump によるバッファプール汚染の調査
  • Redis サーバー環境下での MySQL での lnmp アーキテクチャ キャッシュの実装
  • MySQL セレクトキャッシュメカニズムの使用に関する詳細な説明
  • MySQL キャッシュのクエリおよびクリアコマンドの詳細な説明
  • PHP で Redis を使用して MySQL キャッシュの負荷を計算する方法
  • MySQL キャッシュの起動方法とパラメータの詳細 (query_cache_size)
  • MySQLクエリキャッシュをクリアする方法
  • Memcache を使用して MySQL データベース操作をキャッシュする原理とキャッシュ プロセスの簡単な分析
  • MySQLのバッファプールの詳細な説明

<<:  vite+vue3+element-plus プロジェクトをビルドする手順

>>:  Nginx の高同時実行最適化の実践

推薦する

VMware での Ubuntu Docker のインストール (コンテナ構築)

1. マインドマップ 2. コンテナの構築方法2.1 実験環境の準備(1)環境選択管理ツール: D...

Bootstrap 3.0 の特殊効果の学習ノート(表示と非表示、フローティングの除去、閉じるボタンなど)

この記事の主な内容は次のとおりです。 1. 閉じるボタン2.キャレット3. フローティングを素早く設...

CSS3 タブアニメーションの例 背景切り替えの動的効果

CSS 3 アニメーションの例 - タブの背景切り替えの動的効果、具体的なコードは次のとおりです。 ...

デザイン参考 WordPressウェブサイト構築成功事例

これら 16 のサイトはそれぞれ注意深く読む価値があり、どのサイトでも推奨されている Web サイト...

VueプロジェクトにPWAを導入する手順

目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...

Vue は動的な円形のパーセンテージ進捗バーを実装します

最近、小さなプログラムを開発しているときに、次の設計図のような円形のパーセンテージ進捗状況バーを実装...

Vue で Excel インポート機能を実装する詳細な手順

1. フロントエンド主導の実装手順最初のステップは、ページのインポートボタンをクリックしてExcel...

血の写輪眼と輪廻眼の特殊効果コードを実現するためのHTML+CSS

結果 (完全なコードは下部にあります): 実装は難しくありませんが、繰り返しコードが多くなります。実...

JavaScript シミュレーション計算機

この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...

Ubuntu インストール cuda10.1 ドライバ実装手順

1. cuda10.1をダウンロードします。 NVIDIA 公式ウェブサイト リンク: https:...

CSS 3.0 テキストホバージャンプ特殊効果コード

これは、CSS 3.0 で実装されたテキストのホバーとジャンプ効果です。効果は次のとおりです。 以下...

Dockerfile を使用して nginx イメージを構築する例

Dockerfile の紹介Docker は、Dockerfile の内容を読み取ってイメージを自動...

HTML ウェブページのメタビューポート属性の説明

HTML メタビューポート属性の説明ビューポートとはモバイル ブラウザは、Web ページを仮想の「ウ...

Docker で FastDFS をデプロイする方法

Dockerにfastdfsをインストールするディレクトリをマウント-v /e/fdfs/トラッカー...