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 3
、Pip 3
、PyMySQL
、およびredis-py
をインストールします。次のコマンドを実行して、
PyMySQL
およびredis-py
をインストールします。sudo pip3インストールpymysql sudo pip3インストールredis
IPアドレスのホワイトリストが設定されています。
内部ネットワーク経由でインスタンスに接続する場合は、ApsaraDB for RedisインスタンスおよびRDSインスタンスのIPアドレスホワイトリストにVPCのCIDRブロックを追加します。 詳細については、「ホワイトリストの設定」および「IPアドレスホワイトリストの設定」をご参照ください。
インターネット経由でインスタンスに接続する場合は、ApsaraDB for RedisインスタンスとRDSインスタンスのパブリックエンドポイントを有効にし、ECSインスタンスのパブリックIPアドレスをApsaraDB for RedisインスタンスとRDSインスタンスのIPアドレスホワイトリストに追加します。 詳細については、「ApsaraDB For Redisインスタンスのパブリックエンドポイントの申請」および「ApsaraDB RDS for MySQLインスタンスのパブリックエンドポイントの申請またはリリース」をご参照ください。
データベースアカウントのユーザー名とパスワードは、ApsaraDB for RedisインスタンスとRDSインスタンスで取得されます。 詳細については、「データベースアカウントの作成と管理」および「ApsaraDB RDS For MySQLインスタンスでのアカウントの作成」をご参照ください。
手順
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()
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 3
、Pip 3
、PyMySQL
、python-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インスタンスでは、パスワードなしのアクセスが有効になっています。 詳細については、「パスワードなしアクセス」をご参照ください。
手順
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()
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']]]
参考資料
ApsaraDB For Redisの詳細については、「ApsaraDB for Redisの概要」をご参照ください。
ApsaraDB For Memcacheの詳細については、「ApsaraDB for Memcacheとは」をご参照ください。