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 の高同時実行最適化の実践

推薦する

Ubuntu 20.04は静的IPアドレスを設定します(異なるバージョンを含む)

Ubuntu 20.04はnetplanを通じてネットワークを管理するため、以前のバージョンとは少...

Ubuntu 20.04 デスクトップのインストールとルート権限の有効化および SSH インストールの詳細

記事は主にUbuntu 20.04の簡単なインストールプロセスを記録し、インストール後に国内ソースを...

Dockerfile を使用して Docker イメージをカスタマイズする方法

Dockerfile を使用したイメージのカスタマイズイメージのカスタマイズとは、実際には各レイヤー...

Vue はモバイル端末にマルチグリッド入力ボックスを実装

最近、同社は、下図に示すように、h5 ページ操作を完了するという要件を提示しました。 ネットで入手で...

Ubuntu 16.04 カーネルのアップグレード手順

1. 環境仮想マシン上で実行されているUbuntu 16.04では、コマンドuname -rを使用し...

vue3+ts+EsLint+Prettier 標準コード実装

目次使用EsLintの使用プロフィールを追加するPrettierの使用huskyとlint-stag...

React+TS を使用したシンプルな Jira プロジェクトを実装するためのベスト プラクティス

トレーニングのための一連のプロジェクト反応+ts内容は少ないですが、フックのカプセル化、ts ジェネ...

Nginx リバース プロキシ springboot jar パッケージ プロセス分析

Springboot プロジェクトをサーバーにデプロイする方法としては、war パッケージにパッケー...

MySQL で中国語を入力するときに発生するエラー 1366 の解決方法

MySQL で中国語を入力すると、次のエラーが発生します。エラー 1366: 1366: 行 1 の...

プロキシはVue3データの双方向バインディングの原理を実現します

目次1. proxy と Object.defineProperty の利点2. プロキシ監視オブジ...

nginx 設定ファイルで環境変数を使用する方法

序文Nginx はパフォーマンスを重視して設計された HTTP サーバーです。Apache や li...

Tomcat CentOS インストールプロセス図

Tomcat CentOS インストールこのインストール チュートリアルでは、次の内容について説明し...

Nginxのアクセス制限設定の詳細な説明

Nginxのアクセス制限設定とはNginx のアクセス制限は、IP ベースのアクセス制御とユーザーベ...

ストアド プロシージャでエラー状態をトリガーする mysql ストアド プロシージャの分析例 (SIGNAL および RESIGNAL ステートメント)

この記事では、例を使用して、MySQL がストアド プロシージャで引き起こすエラー状態 (SIGNA...

Vue el-date-picker 動的制限時間範囲ケースの詳細な説明

2つの状況がある1. 開始時間と終了時間が同じボックス内にあります(今月のみ限定) 2. 開始時間と...