すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:ApsaraDB for RedisとApsaraDB RDS for MySQLの組み合わせ

最終更新日:Mar 19, 2024

ApsaraDB RDS for MySQLを使用しており、データ処理を高速化し、アクセス遅延を短縮したい場合、Alibaba Cloudはキャッシュされたデータを永続化するための効率的なソリューションを提供します。 このソリューションは、ApsaraDB RDSとApsaraDB for RedisおよびApsaraDB for Memcacheを組み合わせて、高速アクセスと永続的なストレージを確保します。 このソリューションは、高スループットと低レイテンシを備えています。

背景情報

ApsaraDB for RedisおよびApsaraDB for Memcacheには、ApsaraDB RDSよりも次の利点があります。

  • ApsaraDB for RedisおよびApsaraDB for Memcacheは、クエリに高速に応答できます。 ほとんどの場合、クエリごとのレイテンシは数ミリ秒以内です。

  • ApsaraDB for RedisおよびApsaraDB for Memcacheのキャッシュは、より高い1秒あたりのクエリ数 (QPS) をサポートしています。

手順

ApsaraDB RDS for MySQLとApsaraDB for Redisの組み合わせ

前提条件

  • Elastic Compute Service (ECS) インスタンス、ApsaraDB for Redisインスタンス、およびApsaraDB RDS for MySQLインスタンスが作成されます。

    • 内部ネットワーク経由でこれらのインスタンスに接続する場合は、同じ仮想プライベートクラウド (VPC) にインスタンスを作成することを推奨します。

    • ECSインスタンス、ApsaraDB for Redisインスタンス、およびRDSインスタンスを作成したが、これらのインスタンスが異なるVPCにある場合、ApsaraDB for RedisインスタンスとRDSインスタンスのパブリックエンドポイントを有効にできます。 これにより、インターネット経由でインスタンスに接続できます。

    説明
    • この例では、ECSインスタンスのイメージバージョンはAlibaba Cloud Linux 3.2104 LTS 64ビットです。

    • この例では、プログラミング言語はPythonです。 開始する前に、ECSインスタンスにPython 3Pip 3PyMySQL、およびredis-pyをインストールします。

      次のコマンドを実行して、PyMySQLおよびredis-pyをインストールします。

      sudo pip3インストールpymysql
      sudo pip3インストールredis 
  • IPアドレスのホワイトリストが設定されています。

  • データベースアカウントのユーザー名とパスワードは、ApsaraDB for RedisインスタンスとRDSインスタンスで取得されます。 詳細については、「データベースアカウントの作成と管理」および「ApsaraDB RDS For MySQLインスタンスでのアカウントの作成」をご参照ください。

手順

  1. ECSインスタンスにログインし、ビジネスシナリオをシミュレートするPythonスクリプトを作成します。 ApsaraDB for Redisインスタンスのキャッシュにデータが見つからない場合は、RDSインスタンスからデータを照会します。 この例では、test.pyという名前のPythonスクリプトが作成されます。

    警告

    このセクションでは、デモ用のサンプルコードを示します。 実際のビジネスコードでは、userおよびpasswordパラメーターをプレーンテキストの値に設定しないでください。 外部設定ファイルや環境変数などのメソッドを使用してパラメーターを設定し、コード内のパラメーターを参照することを推奨します。

    import json
    redisのインポート
    pymysqlのインポート
    
    # RDSインスタンスへの接続に使用されるパラメーターを定義します。
    mysql_host = '<RDSインスタンスのエンドポイント>'
    mysql_user = '<ユーザー名>'
    mysql_password = '<パスワード>'
    mysql_port = 3306
    mysql_charset = 'utf8'
    
    # ApsaraDB for Redisインスタンスへの接続に使用されるパラメーターを定義します。
    redis_host = '<ApsaraDB for Redisインスタンスのエンドポイント>'
    redis_port = 6379
    # ApsaraDB for Redisインスタンスのパスワードは、Username: password形式です。 パスワードが設定されていない場合は、redis_passwordパラメーターを空の文字列に設定します。
    redis_password = '<ApsaraDB for Redisインスタンスのパスワード>'
    redis_db = 0
    
    
    def create_database_and_tables():
        db = pymysql.connect(host=mysql_host、
                             user=mysql_user,
                             password=mysql_password,
                             port=mysql_port、
                             charset=mysql_charset)
        cursor = db.cursor()
    
        # テストデータベースを作成します。
        cursor.exeかわいい ("testdbが存在しない場合はデータベースを作成する;")
    
        # データベースを選択します。
        cursor.exeかわいい ("USE testdb;")
    
        # テストテーブルを作成します。
        cursor.exeかわいい ("""
        学生がいない場合はテーブルを作成します (
            s_id INT AUTO_INCREMENT PRIMARYキー、
            s_name VARCHAR(255) NOT NULL
        ) エンジン=InnoDBデフォルト料金=utf8;
        """)
    
        # テスト用のデータを挿入します。
        cursor.exeかわいい ("""
        学生への挿入 (s_name) バリュー
        ('Zhangsan') 、
        ('Lisi') 、
        ('Wangwu')
        複製キーの更新s_name = VALUES(s_name);
        """)
    
        db.com mit()
        cursor.close()
        db.close()
    
    
    def fetch_from_mysql():
        db = pymysql.connect(host=mysql_host、
                             user=mysql_user,
                             password=mysql_password,
                             データベース="testdb" 、
                             port=mysql_port、
                             charset=mysql_charset)
        cursor = db.cursor()
        cursor.exeかわいい ("SELECT * FROM student")
        rows = cursor.fetchall()
        cursor.close()
        db.close()
        戻り行
    
    
    def cache_to_redis(redis_client, key, data):
        # データをJSON文字列にエンコードして、複雑なデータ型のデータを格納します。
        json_data = json.dumps(data)
        # ApsaraDB for Redisインスタンスにデータを保存し、有効期間を600秒 (10分に相当) に設定します。
        redis_client.setex (キー、600、json_data)
    
    
    def get_from_redis(redis_client, key):
        # ApsaraDB for Redisインスタンスからデータを照会します。
        json_data = redis_client.get (キー)
        json_dataの場合:
            # データが見つかった場合は、JSON文字列をデコードします。
            data = json.loads(json_data)
            データを返す
        else:
            リターンなし
    
    
    def main():
        # ApsaraDB for Redisインスタンスのクライアントを作成します。
        redis_client = redis.StrictRedis (
            host=redis_host,
            port=redis_port,
            password=redis_password,
            db=redis_db、
            decode_responses=True# レスポンスデータを自動的にデコードします。
        )
    
        # RDSインスタンスのテストテーブルを作成し、テストデータをテーブルに挿入します。
        create_database_and_tables()
    
        # ApsaraDB for Redisインスタンスに学生情報を格納するためのキーを定義します。
        redis_key = '学生'
    
        # ApsaraDB for Redisインスタンスからデータを照会します。
        students = get_from_redis(redis_client, redis_key)
    
        学生の場合:
            print (「ApsaraDB for Redisインスタンスからのデータのクエリ」)
            プリント (学生)
        else:
            印刷 (ApsaraDB for Redisインスタンスにデータが見つかりません。 RDSインスタンスからデータを照会します。
            # RDSインスタンスからデータを照会します。
            students = fetch_from_mysql()
            学生の場合:
                プリント (学生)
                # ApsaraDB for Redisインスタンスにデータをキャッシュします。
                cache_to_redis(redis_client, redis_key, students)
    
    
    if __name__ ='__main__':
        main()
    
  2. test.pyを実行します。

    python3テスト. py
    • test.pyを初めて実行する場合、ApsaraDB for Redisインスタンスのキャッシュにデータが見つからないため、RDSインスタンスからデータが読み取られます。 サンプル出力:

      ApsaraDB for Redisインスタンスにはデータがありませんが、RDSインスタンスにはデータがあります。
      ((1, 'Zhangsan') 、(2, 'Lisi') 、(3, 'Wangwu')) 
    • test.pyを初めて実行しない場合、前のクエリの結果がApsaraDB for Redisインスタンスにキャッシュされるため、ApsaraDB for Redisインスタンスからデータが読み取られます。 サンプル出力:

      ApsaraDB for Redisインスタンスから照会されたデータを
      します。[[1, 'Zhangsan'] 、[2, 'Lisi'] 、[3, 'Wangwu']]] 

ApsaraDB RDS for MySQLとApsaraDB for Memcacheの組み合わせ

前提条件

  • ECSインスタンス、ApsaraDB for Memcacheインスタンス、およびRDSインスタンスが作成されます。 これらのインスタンスが同じVPCに作成されていることを確認します。

    説明
    • ApsaraDB for Memcacheはインターネット経由の接続をサポートしていないため、これらのインスタンスが同じVPCに作成されていることを確認する必要があります。

    • この例では、ECSインスタンスのイメージバージョンはAlibaba Cloud Linux 3.2104 LTS 64ビットです。

    • この例では、プログラミング言語はPythonです。 開始する前に、ECSインスタンスにPython 3Pip 3PyMySQLpython-memcachedをインストールします。

      次のコマンドを実行して、PyMySQLおよびpython-memcachedをインストールします。

      sudo pip3インストールpymysql
      sudo pip3インストールpython-memcached 
  • VPCのCIDRブロックは、ApsaraDB for MemcacheインスタンスおよびRDSインスタンスのIPアドレスホワイトリストに追加されます。 詳細については、「IPアドレスホワイトリストの設定」および「IPアドレスホワイトリストの設定」をご参照ください。

  • RDSインスタンスのデータベースアカウントのユーザー名とパスワードが取得されます。 詳細については、「ApsaraDB RDS For MySQLインスタンスでのアカウントの作成」をご参照ください。

  • ApsaraDB for Memcacheインスタンスでは、パスワードなしのアクセスが有効になっています。 詳細については、「パスワードなしアクセス」をご参照ください。

手順

  1. ECSインスタンスにログインし、ビジネスシナリオをシミュレートするPythonスクリプトを作成します。 ApsaraDB for Memcacheインスタンスのキャッシュにデータが見つからない場合は、RDSインスタンスからデータを照会します。 この例では、test.pyという名前のPythonスクリプトが作成されます。

    警告

    このセクションでは、デモ用のサンプルコードを示します。 実際のビジネスコードでは、userおよびpasswordパラメーターをプレーンテキストの値に設定しないでください。 外部設定ファイルや環境変数などのメソッドを使用してパラメーターを設定し、コード内のパラメーターを参照することを推奨します。

    import json
    pymysqlのインポート
    memcacheのインポート
    
    # RDSインスタンスへの接続に使用されるパラメーターを定義します。
    mysql_host = '<RDSインスタンスのエンドポイント>'
    mysql_user = '<ユーザー名>'
    mysql_password = '<パスワード>'
    mysql_port = 3306
    mysql_charset = 'utf8'
    
    # ApsaraDB for Memcacheインスタンスへの接続に使用されるパラメーターを定義します。
    memcache_host = '<ApsaraDB for Memcacheインスタンスのエンドポイント >:< ポート>'
    
    
    def create_database_and_tables():
        db = pymysql.connect(host=mysql_host、
                             user=mysql_user,
                             password=mysql_password,
                             port=mysql_port、
                             charset=mysql_charset)
        cursor = db.cursor()
    
        # テストデータベースを作成します。
        cursor.exeかわいい ("testdbが存在しない場合はデータベースを作成する;")
    
        # データベースを選択します。
        cursor.exeかわいい ("USE testdb;")
    
        # テストテーブルを作成します。
        cursor.exeかわいい ("""
        学生がいない場合はテーブルを作成します (
            s_id INT AUTO_INCREMENT PRIMARYキー、
            s_name VARCHAR(255) NOT NULL
        ) エンジン=InnoDBデフォルト料金=utf8;
        """)
    
        # テスト用のデータを挿入します。
        cursor.exeかわいい ("""
        学生への挿入 (s_name) バリュー
        ('Zhangsan') 、
        ('Lisi') 、
        ('Wangwu')
        複製キーの更新s_name = VALUES(s_name);
        """)
    
        db.com mit()
        cursor.close()
        db.close()
    
    
    def fetch_from_mysql():
        db = pymysql.connect(host=mysql_host、
                             user=mysql_user,
                             password=mysql_password,
                             データベース="testdb" 、
                             port=mysql_port、
                             charset=mysql_charset)
        cursor = db.cursor()
        cursor.exeかわいい ("SELECT * FROM student")
        rows = cursor.fetchall()
        cursor.close()
        db.close()
        戻り行
    
    
    def cache_to_memcache(memcache_client, key, data):
        # データをJSON文字列にエンコードして、複雑なデータ型のデータを格納します。
        json_data = json.dumps(data)
        ApsaraDB for Memcacheインスタンスにデータを保存し、有効期間を600秒 (10分に相当) に設定します。
        memcache_client.set(key, json_data, time=600)
    
    
    def get_from_memcache(memcache_client, key):
        # ApsaraDB for Memcacheインスタンスからデータを照会します。
        json_data = memcache_client.get (キー)
        json_dataの場合:
            # データが見つかった場合は、JSON文字列をデコードします。
            data = json.loads(json_data)
            データを返す
        else:
            リターンなし
    
    
    def main():
        # ApsaraDB for Memcacheインスタンスのクライアントを作成します。
        memcache_client = memcache.Client([memcache_host], debug=0)
    
        # RDSインスタンスのテストテーブルを作成し、テストデータをテーブルに挿入します。
        create_database_and_tables()
    
        # ApsaraDB for Memcacheインスタンスに学生情報を格納するためのキーを定義します。
        memcache_key = '学生'
    
        # ApsaraDB for Memcacheインスタンスからデータを照会します。
        students = get_from_memcache(memcache_client, memcache_key)
    
        学生の場合:
            print (「ApsaraDB for Memcacheインスタンスからのデータのクエリ」)
            プリント (学生)
        else:
            print("ApsaraDB for Memcacheインスタンスにデータが見つかりません。 RDSインスタンスからデータを照会します。
            # RDSインスタンスからデータを照会します。
            students = fetch_from_mysql()
            学生の場合:
                プリント (学生)
                # ApsaraDB for Memcacheインスタンスにデータをキャッシュします。
                cache_to_memcache(memcache_client, memcache_key, students)
    
    
    if __name__ ='__main__':
        main()
    
  2. test.pyを実行します。

    python3テスト. py
    • test.pyを初めて実行する場合、ApsaraDB for Memcacheインスタンスのキャッシュにデータが見つからないため、RDSインスタンスからデータが読み取られます。 サンプル出力:

      ApsaraDB for Memcacheインスタンスにはデータがありませんが、RDSインスタンスにはデータがあります。
      ((1, 'Zhangsan') 、(2, 'Lisi') 、(3, 'Wangwu')) 
    • test.pyを初めて実行しない場合、前のクエリの結果がApsaraDB for Memcacheインスタンスにキャッシュされるため、ApsaraDB for Memcacheインスタンスからデータが読み取られます。 サンプル出力:

      ApsaraDB for Memcacheインスタンスから照会されたデータを
      します。[[1, 'Zhangsan'] 、[2, 'Lisi'] 、[3, 'Wangwu']]] 

参考資料