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

推薦する

フロントエンドJavaScriptは関数のカリー化を完全に理解している

目次1. カレーとは何か2. カレーの用途3. カリー化ユーティリティ関数をカプセル化する方法 1....

MySQLは複数テーブル関連統計(サブクエリ統計)の例を実装します

この記事では、例を使用して、MySQL で複数テーブルの関連統計を実装する方法について説明します。ご...

Linux 向けの強化されたスクリーンショットと共有ツール: ScreenCloud

ScreenCloud は、必要だとは思わなかった素晴らしい小さなアプリです。デスクトップ Lin...

VMware vSphere 6.7 (ESXI 6.7) のグラフィック インストール手順

環境: VMware VCSA 6.7 (VMware-VCSA-all-6.7.0-8169922...

JSコードコンパイラMonacoの使い方

序文私が必要としているのは、構文の強調表示、関数プロンプト、自動行折り返し、およびコードの折りたたみ...

Linux で MySQL データベースのインポートおよびエクスポート コマンドを実装する方法

1. mysqldump コマンドを使用してデータベースをエクスポートします (このコマンドのパスで...

Vueで複数の添付ファイルをアップロードする実装例

目次序文コアコードコードのファイル表示部分序文この記事では主に、Vue プロジェクトでの添付ファイル...

mysql 5.6.23 winx64.zip インストール詳細チュートリアル

WindowsにMySQLの圧縮バージョンをインストールする方法の詳細については、以下を参照してくだ...

JavaScript が重複したネットワークリクエストを防ぐ方法の例

序文開発中は、インターフェース要求の繰り返しによってさまざまな問題が発生することがよくあります。ネッ...

Nginxはドメイン名のアクセス方法を定義しています

最近Nginxを構築しているのですが、ドメイン名でアクセスできません。 nginx 構成ファイル n...

JavaScript でエラーが発生しやすい演算子操作の概要

目次算術演算子異常状況1: 特殊値リテラルを含む操作異常な状況 2: 他の種類のデータが数学演算に関...

ローカル yum ソースの設定、国内 yum ソースの設定、epel ソースの設定を行う Linux の手順

1. ローカルyumソースを設定する1. ISOイメージをマウントする マウント -o loop /...

MySQL で結合を使用して SQL を最適化する方法の詳細な説明

0. 以下のテストに関連する表を準備する関連するテーブル作成ステートメントについては、https:/...

ReactプロジェクトにSCSSを導入する方法

まず依存関係をダウンロードします yarn sass-loader ノード sass を追加します次...