MySQL は redis+canal を使用してキャッシュの一貫性を実現します

目次

1. binlog ログを有効にする

1. まず、binlog が有効になっているかどうかを確認します

2. binlog を有効にして、mysql サービスを再起動します。

2. canal に MySQL へのリンクを許可する アカウントには、MySQL スレーブとして機能する権限があります。

3. canal をダウンロードして設定する

1. canal をダウンロードし、リリース ページにアクセスし、ダウンロードする必要なパッケージを選択します。例としてバージョン 1.0.17 を取り上げます。

2. conf\example フォルダー内の instance.properties 構成ファイルを変更します。

3. Canal サービスを開始します (Windows では Bat、Linux では sh)

4.運河届出原則に基づく

5. プロジェクトの統合

1.pom依存性

2. 依存関係を記述する

3.Itemエンティティクラスを変更する

4. リスナーを作成する (Redis/jvm キャッシュ同期) 

6. テスト

1. データベーステーブルデータとRedisデータ

2. データを追加する

3. データを変更する

編集 4. データの削除


1. binlog ログを有効にする

1. まず、binlog が有効になっているかどうかを確認します

「%log_bin%」のような変数を表示します。

OFFの場合、命令ビットがONになります。

2. binlog を有効にして、mysqlサービスを再起動します。

「マイコンピュータ」を右クリック - 「管理」 - 「サービス」 - 「MYSQL」 - 「プロパティ」

これが私の.iniアドレスです

[mysqld] の下に追加します

log-bin= mysqlbinlog

binlog-format=ROW

ここに画像の説明を挿入します

構成後、 mysql サービスを再起動する必要があります

ステータスの表示 

「%log_bin%」のような変数を表示します。

正常に開きました 

2. canal に MySQL へのリンクを許可する アカウントには、MySQL スレーブとして機能する権限があります。

CREATE USER canal IDENTIFIED BY 'canal';  
*.* の SELECT、レプリケーション スレーブ、レプリケーション クライアントを 'canal'@'%' に許可します。
-- *.* のすべての権限を 'canal'@'%' に付与します。
フラッシュ特権;

3. canal をダウンロードして設定する

1. canal をダウンロードし、 リリース ページにアクセスし、ダウンロードする必要なパッケージを選択します。例としてバージョン 1.0.17 を取り上げます。

または、私のファイルを使用します: Alibaba Cloud ディスク共有

減圧後

2. conf\example フォルダー内の instance.properties 構成ファイルを変更します。

最終的な設定ファイル

#################################################

## mysql serverId 、v1.0.26 以降は自動生成されます

# canal.instance.mysql.slaveId=0

# gtid の使用を有効にする true/false

canal.instance.gtidon=false

# 位置情報

canal.instance.master.address=127.0.0.1:3306

canal.instance.master.journal.name=

canal.instance.master.position=

canal.instance.master.timestamp=

canal.instance.master.gtid=

# rds oss バイナリログ

canal.instance.rds.accesskey=

canal.instance.rds.secretkey=

canal.instance.rds.instanceId=

# テーブルのメタ TSDB 情報

canal.instance.tsdb.enable=true

#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb

#canal.instance.tsdb.dbUsername=canal

#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =

#canal.instance.standby.journal.name =

#canal.instance.standby.position =

#canal.instance.standby.timestamp =

#canal.instance.standby.gtid=

# ユーザー名パスワード

canal.instance.dbユーザー名=root

canal.instance.dbPassword=msir1234

canal.instance.connectionCharset = UTF-8

# druid を有効にする データベースのパスワードを復号化する

canal.instance.enableDruid=false

#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# テーブル正規表現

canal.instance.filter.regex=.*\\..*

# テーブルブラック正規表現

canal.instance.filter.black.regex=mysql\\.slave_.*

# テーブルフィールドフィルター(形式: スキーマ1.テーブル名1:フィールド1/フィールド2,スキーマ2.テーブル名2:フィールド1/フィールド2)

#canal.instance.filter.field=test1.t_product:id/件名/キーワード,test2.t_company:id/名前/連絡先/ch

# テーブルフィールドブラックフィルター(形式: スキーマ1.テーブル名1:フィールド1/フィールド2,スキーマ2.テーブル名2:フィールド1/フィールド2)

#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

# mq 構成

canal.mq.topic=例

# スキーマまたはテーブル正規表現による動的トピックルート

#canal.mq.dynamicTopic=mytest1.user,topic2:mytest2\\..*,.*\\..*

canal.mq.partition=0

# ハッシュパーティション構成

#canal.mq.enableDynamicQueuePartition=false

#canal.mq.partitionsNum=3

#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6

#canal.mq.partitionHash=test.table:id^name,.*\\..*

#################################################

3. Canal サービスを開始します (Windows では Bat、Linux では sh)

 「startup.bat」をクリックして開始します

ログlogs\canal\canal.logを確認し、起動に成功すると以下のようになります。

4.運河届出原則に基づく

ここに画像の説明を挿入します

解釈:

  • 製品サービスによる製品の変更が完了すると、コードの侵入は一切なく、ビジネスは直接終了します。
  • Canal は MySQL データベース内の変更を監視し、変更が検出されるとすぐにキャッシュ サービスに通知します。
  • キャッシュ サービスは運河通知を受信し、キャッシュを更新します。

5. プロジェクトの統合

1.pom依存性

GitHub 上のサードパーティのオープンソース canal-starter クライアントを使用します。アドレス: https://github.com/NormanGyllenhaal/canal-client

<依存関係>
        <groupId>top.javatool</groupId>
        <artifactId>canal-spring-boot-starter</artifactId>
        <version>1.2.1-RELEASE</version>
</dependency>

2. 依存関係を記述する

canal:
   宛先: サンプル
   サーバー: localhost:11111 #canal の IP アドレスとポート

3.Itemエンティティクラスを変更する

Canal が canal-client にプッシュするのは、変更されたデータ行 (行) であり、導入した canal-client は、行データを Item エンティティ クラスにカプセル化するのに役立ちます。このプロセスでは、データベースとエンティティの間のマッピング関係を知る必要があります。JPA アノテーションを使用する必要があります。

@Id、@Column、その他の注釈を使用して、Item フィールドとデータベース テーブル フィールドの間のマッピングを完了します。

データベース名と異なる場合は、@Column を使用する必要があることに注意してください。

package com.springboot3.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;

import javax.persistence.Column;
import javax.persistence.Id;

/**
 * 
 * @TableName course
 */
@TableName(value ="course")
@Data
public class Course implements Serializable {
    /**
     * 
     */
    @Id
    @TableId
    private String id;

    /**
     * 
     */
    private String name;

    /**
     * 
     */
    @Column(name = "teacher_id")
    private String teacherId;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

4. リスナーを作成する (Redis/jvm キャッシュ同期) 

Canal メッセージをリッスンするインターフェイスを実装してEntryHandler<T>リスナーを作成します。次の 2 つの点に注意してください。

  • 実装クラスでは@CanalTable("course")監視するテーブル情報を指定します。
  • EntryHandler のジェネリック型は、テーブルに対応するエンティティ クラスです。
package com.springboot3.handler;

import com.springboot3.domain.Course;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

@CanalTable(value = "Course")
@Component
@Slf4j
public class CourseHandler implements EntryHandler<Course> {
    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public void insert(Course course) {
        log.info("insert message  {}", course);
        redisTemplate.opsForValue().set(course.getId(),course);
    }

    @Override
    public void update(Course before, Course after) {
        log.info("update before {} ", before);
        log.info("update after {}", after);
        redisTemplate.opsForValue().set(after.getId(),after);

    }

    @Override
    public void delete(Course course) {
        log.info("delete  {}", course);
        redisTemplate.delete(course.getId());

    }
}

6. テスト

1. データベーステーブルデータとRedisデータ

データベース:

レディス:

2. データを追加する

データ物理を追加する

コンソールには以下が表示されます。

Redis データベース:

3. データを変更する

物理を化学に変える

コンソールには以下が表示されます。

Redis データベース:

4. データの削除

化学の科目を削除

コンソールデータ

 Redis データベースのデータ:

おすすめ

転載: blog.csdn.net/weixin_55127182/article/details/132280538