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

推薦する

VueでTypeScriptを使用する方法

導入近年、TypeScript を求める声がますます高まり、TypeScript はフロントエンドに...

React.Childrenの詳しい使い方

目次1. React.Children.map 2. React.Children.forEach ...

html の img src="" で js 関数または js 変数を呼び出して、画像パスを動的に指定します。

この問題に関して、オンライン リソースをたくさん見つけました。ここにいくつかの方法を示します。コード...

動的テーブルを実装するための要素サンプルコード

目次【コード背景】 【コード実装】 #1# -> コード再利用の基本は、再利用可能なコンポーネ...

koa2 サービスに SSL を設定する方法

I. はじめに1: SSL証明書私のドメイン名は Tencent Cloud にあります。第 3 レ...

MySQL 8.0 の新機能 - 管理ポートの使用の概要

目次序文接続管理追加の接続管理ポート要約する序文皆さんの多くは、次のようなエラー メッセージに遭遇し...

Node はあいまい検索用の検索ボックスを実装します

この記事の例では、検索ボックスでファジークエリを実装するためのNodeの具体的なコードを参考までに共...

Dockerコンテナのネットワーク管理とネットワーク分離の実装

1. Dockerネットワーク管理1. Dockerコンテナ方式1) Dockerが外部ネットワーク...

DockerにFastDFSをインストールする方法

画像をプルする docker pull season/fastdfs:1.2トラッカーを開始 doc...

JavaScript - Vue でのスロットの使用: スロット

目次Vue でのスロットの使用: slotスコープ付きスロット: テンプレートタグで囲む要約するVu...

Win10 での MySQL 5.7 の詳細なインストールと設定のチュートリアル

1. MySQL 5.7を解凍する2. 新しい設定ファイルmy.iniを作成し、 D:\Free\m...

MySQL の concat 関数についての簡単な説明。MySQL でフィールドの前または後に文字列を追加する方法

MySQL で concat 関数を使用する方法: CONCAT(文字列1、文字列2、…)戻り値は、...

均一なアニメーション効果を実現するJavaScript

この記事の例では、JavaScriptで等速アニメーションを実装するための具体的なコードを参考までに...

Linuxカーネルをコンパイルする方法

1. 必要なカーネルバージョンをダウンロードする2. オペレーティングシステムにアップロードする3....