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

推薦する

WindowsでMysql5.7.17のインストールと起動に失敗する問題を解決する

マシンに初めて MySQL をインストールします。オペレーティングシステムはwin7ですmysqlの...

WindowsでcmdからDOSウィンドウに入り、MySQLデータベースにアクセスします。

1. win + R を押して cmd と入力し、DOS ウィンドウに入ります。 2. MySQL...

Dockerコンテナ内でホストDocker操作を呼び出して実行する

まず、この投稿は Docker 初心者向けです。もちろん、ベテランであれば記事中の分割線以降の操作方...

HTML テーブル マークアップ チュートリアル (18): テーブル ヘッダー

<br />ヘッダーはテーブルの最初の行を参照します。ヘッダー内のテキストは中央揃えで太...

MySQL はデータベースを動的に更新します スクリプト例の説明

具体的なupgradeスクリプトは次のとおりです。インデックスを動的に削除する アップグレードが存在...

emとは?emとpxの紹介と変換方法

それは何ですか? em はフォントの高さを指し、どのブラウザでもデフォルトのフォントの高さは 16 ...

React スキャフォールディングのパスエイリアスを設定する方法

この記事を書いている時点でのReactのバージョンは16.13.1です1 npm run eject...

Mybatisの特殊文字処理の詳細な説明

序文: Mybatis の特殊文字処理、Mybatis の xml ファイル内の特殊文字の処理、ここ...

MySQLインデックスを正しく作成する方法

インデックス作成は大学図書館の書誌インデックスの構築に似ており、データ検索の効率を向上させ、データベ...

Swiper.jsプラグインを使用すると、カルーセル画像を非常に簡単に実装できます。

Swiper は、携帯電話やタブレットなどのモバイル端末向けに設計された、純粋な JavaScri...

MySQL マスタースレーブレプリケーションの実装手順

目次mysql マスタースレーブレプリケーションMySQL マスタースレーブレプリケーション方式My...

ウェブ画像のホットリンクと座標値を設定するサンプルコード

時には、画像上に複数の領域を設定する必要があります。マウスで画像のさまざまな領域をクリックしてさまざ...

Ubuntu で FTP サーバーを構築する方法の詳細な説明 (成功保証)

1. 今日の午後、コースの要件により、Ubuntu で FTP サーバーを設定する実験を行う必要が...

Vue ページ内の公開マルチタイプ添付画像アップロード領域と適用可能な折りたたみパネル (サンプルコード)

フロントエンド プロジェクトでは、添付ファイルのアップロードは非常に一般的な機能であり、ほぼすべての...