Pythonを使用したMemcachedの概要

Memcachedは、パフォーマンスの高い分散キャッシングシステムです。これはメモリ内のKey-Valueデータストアであり、NoSQLデータベースの一種になります。Memcachedは、Facebook、Twitter、Instagram、Netflixなどの大手テクノロジー企業によって使用されています。前回の記事では、キャッシュの目的で使用できるもう1つのメモリ内Key-ValueデータストアであるRedisについて説明しました。この記事では、PythonでMemcachedに接続して使用する方法について説明します。

WindowsへのMemcachedのインストール

MemcachedはWindowsでは公式にはサポートされていません。ただし、Linux 2用のWindowsサブシステムをセットアップして構成することで、インストールできます。または、Dockerを使用してコンテナーでMemcachedを実行することもできます。これについては、この記事で説明します。最初のステップは、WindowsマシンにDockerをインストールすることです。ここからDockerDesktopをダウンロードできます。インストールプロセスはかなり単純で直接的なものです。マシンにDockerがインストールされたので、コマンドプロンプトで次のコマンドを入力して、DockerHubからRedisイメージをフェッチします。これを使用してコンテナーを構築および実行できます。

docker pull memcached

これが完了したら、3番目のステップは、前にダウンロードしたMemcachedイメージを使用してコンテナーを起動することです。

Memcached

ここで、「実行」ボタンをクリックします。

Memcachedコンテナ

データサイエンスイマーシブブートキャンプ

240日以内に業界ですぐに使えるデータサイエンティストになるようにトレーニングするプログラムBookYourSeats!

Memcached

おめでとうございます。これで、マシンでRedisサーバーが正常に起動しました。

Pymemcacheのインストール

PythonでMemcachedに接続して使用するには、pymemcacheというPythonモジュールを使用します。コマンドプロンプトで次のコマンドを実行することでインストールできます。

pip install pymemcache

すべての準備が整ったので、手を汚してプログラミングの部分に飛び込みましょう。

Pymemcacheの使用

CRUD操作を実行する前に、まずMemcachedサーバーに接続する必要があります。先に進んで、Memcachedサーバーに接続しましょう。

from pymemcache.client import base
client = base.Client(('localhost', 11211))

Memcachedサーバーへの接続に成功したので、簡単なCRUD操作の実行を開始しましょう。

キーと値のペアを設定するには、キーと値をパラメーターとして受け入れる「set」関数または「add」関数のいずれかを使用できます。キーは常に文字列データ型またはバイトのいずれかである必要があることに注意してください。

client.set('hello', 'world')

Memcachedサーバーに保存されているキーの値を取得するには、キー名をパラメーターとして受け入れる「get」関数を使用できます。応答は常にバイト単位であるため、応答は手動で文字列にデコードする必要があります。これはかなり簡単です。

client.get('hello') # this always returns bytes
b'world'

バイトを文字列に変換するには、バイトを「UTF-8」形式でデコードするだけです。

client.get('hello').decode("utf-8") # convert bytes to string
'world'

デフォルトでは、保存されているデータは期限切れになりません。Memcachedはメモリ内のデータストアであるため、ストレージが制限され、メモリ不足のためにデータがフラッシュされる可能性があります。「add」関数を使用して時間を秒単位で指定することにより、キーと値のペアの有効期限を設定できます。有効期限は、作成するアプリケーションの種類に基づいて慎重に決定する必要があります。

client.add(key="lorem", value="ipsum", expire=10) # expire after 10 seconds
client.get('lorem')
'ipsum'

10秒後にキーにアクセスしようとすると、キーがデータベースから削除されているため、応答がありません。

複数のキーと値のペアを辞書データセットとして受け入れる「set_multi」関数を使用して、複数のキーと値のペアを設定できます。また、キーと値のペアが期限切れになる「expire」パラメーターを受け入れ、Memcachedサーバーに新しいデータ用のスペースを作成します。

client.set_multi({"Ram": 22, "Vishnu": 21, "Sanjay": 17},expire=200)
client.get('Ram')
b'22'

それでは、キー「Ram」の値を増やしてみましょう。「incr」関数を使用して、Memcachedの数値に加算演算を実行できます。

client.incr('Ram', value=5)
client.get('Ram')
b'27'

同様に、「decr」関数を使用して、Memcachedの数値への減算演算を実行できます。

client.decr('Ram', value=2)
client.get('Ram')
b'25'

キーと値のペアの数値以外のすべての値は、格納する前に文字列バイトに変換されるため、応答として文字列のみを取得し、元のデータ構造自体は取得しないため、問題が発生する可能性があります。

client.add(key="languages", value=['python', 'C++', 'C'])
client.get('languages').decode('utf-8')
"['python', 'C++', 'C']"

ここでは、Memcachedサーバーにリストを保存したことがわかりますが、このデータをフェッチしようとすると、リストではなく応答として文字列が取得されます。文字列だけでなく、データ型も確実に保存するために、JSONやpickleなどのモジュールを使用したシリアル化および逆シリアル化の手法を利用できます。JSONを使用して、シリアル化と逆シリアル化の手法を使用して、同じデータ型のデータを格納および抽出する方法を説明します。

まず、ネストされたオブジェクトをMemcachedサーバーに保存して、JSONを使用してシリアル化と逆シリアル化を実行した後に取得する応答と比較できるように、取得する応答を確認してみましょう。

personal_data = {
    'name': 'Prakash',
    'age': 34,
    'programming_languages': ['python', 'C#', 'java'],
    'address':{
        'flat_no': 177,
        'area': 'Velachery',
        'pincode': 600042
    }
}
client.set('prakask_personal_data', personal_data)
client.get('prakask_personal_data').decode("utf-8")
"{'name': 'Prakash', 'age': 34, 'programming_languages': ['python', 'C#', 'java'], 'address': {'flat_no': 177, 'area': 'Velachery', 'pincode': 600042}}"

nameプロパティにアクセスしようとすると、応答が辞書ではなく文字列であるため、エラーが発生します。次に、JSONを使用してデータを文字列化し、それをMemcachedに保存し、同じJSONを使用して抽出および逆シリアル化します。

import json
personal_data = {
    'name': 'Prakash',
    'age': 34,
    'programming_languages': ['python', 'C#', 'java'],
    'address':{
        'flat_no': 177,
        'area': 'Velachery',
        'pincode': 600042
    }
}
client.set('prakask_personal_data', json.dumps(personal_data))
data = json.loads(client.get('prakask_personal_data').decode("utf-8"))
print(data){'name': 'Prakash',
 'age': 34,
 'programming_languages': ['python', 'C#', 'java'],
 'address': {'flat_no': 177, 'area': 'Velachery', 'pincode': 600042}}

それでは、addressプロパティ内にあるareaプロパティにアクセスして、エラーが発生していないかどうかを確認してみましょう。

data['address']['area']
'Velachery'

正しい応答が得られたことがわかります。

キャッシングシステムは、アプリケーションを高速化するための単なる方法です。MySQL、Oracleなどの従来のSQLデータベース、およびMongoDBなどの新しいNoSQLデータベースは、データをディスクに保存します。ディスクで実行される操作は、メモリまたはRAMで実行される操作と比較すると、一般的に低速です。RedisやMemcachedなどのテクノロジーはインメモリデータストアであるため、操作は非常に高速ですが、これらのテクノロジーの欠点は、RAMが制限されており、すべての情報を格納するために使用できないことです。アプリケーションを高速化するために、RedisやMemcachedなどのテクノロジーが、MySQL、MongoDBなどの適切な本格的なデータベースと一緒に使用されます。アプリケーションでMemcachedを別のデータベースと一緒に使用する方法を見てみましょう。

Memcachedサーバーにキーと値のペアを設定し、しばらくしてアクセスしようとしているとします。キーがMemcachedサーバーから期限切れになっていると想定します。このような場合、MySQLなどの従来のデータベースのデータにアクセスしようとします。Memcachedとは異なり、すべてのデータは永続的であり、有効期限はありません。

client.add('analytics', 'vidhya', expire=15)
def fetch_from_mysql(key= ''): 
	data = ...  # fetch from MySQL server
	return data
data = client.get('analytics')
if not data
	# fetch from MySQL as the key is not found in the Memcached server
	data = fetch_from_mysql('analytics')
	print(data)
else: print(data)

これは、アプリケーションで本格的なデータベースと連携して動作するようにキャッシングシステムを設計する方法を示す簡単な例です。

結論

この記事では、次のことについて説明しました。

  • Memcachedとは何ですか?
  • WindowsへのDockerのインストール
  • DockerコンテナでMemcachedを実行する
  • Pymemcacheを使用してMemcachedに接続する
  • Pymemcacheを使用した簡単なCRUD操作の実行
  • アプリケーションでMemcachedを使用したキャッシュメカニズム

この記事で説明する関数は、Memcachedでの基本的なCRUD操作を理解して実行するために必要ですが、すぐに利用できるさまざまな関数がたくさんあります。キャッシングメカニズムはほとんどすべてのアプリケーションに存在し、本番環境に対応したアプリケーションを構築するには、キャッシングの基本を理解して学習する必要があります。Memcachedはキャッシングサーバーとしてのみ機能するように設計されていますが、競合他社のRedisは複数のユースケースを解決するように構築されています。Redisはシングルスレッドですが、Memcachedはマルチスレッドであるため、データサイズが大きい場合、MemcachedのパフォーマンスはRedisよりも優れています。Redisの詳細については、この記事をお読みください。

この記事は以上です。この記事を読んで楽しんで、何か新しいことを学んだことを願っています。読んでくれてありがとう! 

 ソース:https ://www.analyticsvidhya.com/blog/2022/06/introduction-to-memcached-using-python/

#python 

What is GEEK

Buddha Community

Pythonを使用したMemcachedの概要

Pythonを使用したMemcachedの概要

Memcachedは、パフォーマンスの高い分散キャッシングシステムです。これはメモリ内のKey-Valueデータストアであり、NoSQLデータベースの一種になります。Memcachedは、Facebook、Twitter、Instagram、Netflixなどの大手テクノロジー企業によって使用されています。前回の記事では、キャッシュの目的で使用できるもう1つのメモリ内Key-ValueデータストアであるRedisについて説明しました。この記事では、PythonでMemcachedに接続して使用する方法について説明します。

WindowsへのMemcachedのインストール

MemcachedはWindowsでは公式にはサポートされていません。ただし、Linux 2用のWindowsサブシステムをセットアップして構成することで、インストールできます。または、Dockerを使用してコンテナーでMemcachedを実行することもできます。これについては、この記事で説明します。最初のステップは、WindowsマシンにDockerをインストールすることです。ここからDockerDesktopをダウンロードできます。インストールプロセスはかなり単純で直接的なものです。マシンにDockerがインストールされたので、コマンドプロンプトで次のコマンドを入力して、DockerHubからRedisイメージをフェッチします。これを使用してコンテナーを構築および実行できます。

docker pull memcached

これが完了したら、3番目のステップは、前にダウンロードしたMemcachedイメージを使用してコンテナーを起動することです。

Memcached

ここで、「実行」ボタンをクリックします。

Memcachedコンテナ

データサイエンスイマーシブブートキャンプ

240日以内に業界ですぐに使えるデータサイエンティストになるようにトレーニングするプログラムBookYourSeats!

Memcached

おめでとうございます。これで、マシンでRedisサーバーが正常に起動しました。

Pymemcacheのインストール

PythonでMemcachedに接続して使用するには、pymemcacheというPythonモジュールを使用します。コマンドプロンプトで次のコマンドを実行することでインストールできます。

pip install pymemcache

すべての準備が整ったので、手を汚してプログラミングの部分に飛び込みましょう。

Pymemcacheの使用

CRUD操作を実行する前に、まずMemcachedサーバーに接続する必要があります。先に進んで、Memcachedサーバーに接続しましょう。

from pymemcache.client import base
client = base.Client(('localhost', 11211))

Memcachedサーバーへの接続に成功したので、簡単なCRUD操作の実行を開始しましょう。

キーと値のペアを設定するには、キーと値をパラメーターとして受け入れる「set」関数または「add」関数のいずれかを使用できます。キーは常に文字列データ型またはバイトのいずれかである必要があることに注意してください。

client.set('hello', 'world')

Memcachedサーバーに保存されているキーの値を取得するには、キー名をパラメーターとして受け入れる「get」関数を使用できます。応答は常にバイト単位であるため、応答は手動で文字列にデコードする必要があります。これはかなり簡単です。

client.get('hello') # this always returns bytes
b'world'

バイトを文字列に変換するには、バイトを「UTF-8」形式でデコードするだけです。

client.get('hello').decode("utf-8") # convert bytes to string
'world'

デフォルトでは、保存されているデータは期限切れになりません。Memcachedはメモリ内のデータストアであるため、ストレージが制限され、メモリ不足のためにデータがフラッシュされる可能性があります。「add」関数を使用して時間を秒単位で指定することにより、キーと値のペアの有効期限を設定できます。有効期限は、作成するアプリケーションの種類に基づいて慎重に決定する必要があります。

client.add(key="lorem", value="ipsum", expire=10) # expire after 10 seconds
client.get('lorem')
'ipsum'

10秒後にキーにアクセスしようとすると、キーがデータベースから削除されているため、応答がありません。

複数のキーと値のペアを辞書データセットとして受け入れる「set_multi」関数を使用して、複数のキーと値のペアを設定できます。また、キーと値のペアが期限切れになる「expire」パラメーターを受け入れ、Memcachedサーバーに新しいデータ用のスペースを作成します。

client.set_multi({"Ram": 22, "Vishnu": 21, "Sanjay": 17},expire=200)
client.get('Ram')
b'22'

それでは、キー「Ram」の値を増やしてみましょう。「incr」関数を使用して、Memcachedの数値に加算演算を実行できます。

client.incr('Ram', value=5)
client.get('Ram')
b'27'

同様に、「decr」関数を使用して、Memcachedの数値への減算演算を実行できます。

client.decr('Ram', value=2)
client.get('Ram')
b'25'

キーと値のペアの数値以外のすべての値は、格納する前に文字列バイトに変換されるため、応答として文字列のみを取得し、元のデータ構造自体は取得しないため、問題が発生する可能性があります。

client.add(key="languages", value=['python', 'C++', 'C'])
client.get('languages').decode('utf-8')
"['python', 'C++', 'C']"

ここでは、Memcachedサーバーにリストを保存したことがわかりますが、このデータをフェッチしようとすると、リストではなく応答として文字列が取得されます。文字列だけでなく、データ型も確実に保存するために、JSONやpickleなどのモジュールを使用したシリアル化および逆シリアル化の手法を利用できます。JSONを使用して、シリアル化と逆シリアル化の手法を使用して、同じデータ型のデータを格納および抽出する方法を説明します。

まず、ネストされたオブジェクトをMemcachedサーバーに保存して、JSONを使用してシリアル化と逆シリアル化を実行した後に取得する応答と比較できるように、取得する応答を確認してみましょう。

personal_data = {
    'name': 'Prakash',
    'age': 34,
    'programming_languages': ['python', 'C#', 'java'],
    'address':{
        'flat_no': 177,
        'area': 'Velachery',
        'pincode': 600042
    }
}
client.set('prakask_personal_data', personal_data)
client.get('prakask_personal_data').decode("utf-8")
"{'name': 'Prakash', 'age': 34, 'programming_languages': ['python', 'C#', 'java'], 'address': {'flat_no': 177, 'area': 'Velachery', 'pincode': 600042}}"

nameプロパティにアクセスしようとすると、応答が辞書ではなく文字列であるため、エラーが発生します。次に、JSONを使用してデータを文字列化し、それをMemcachedに保存し、同じJSONを使用して抽出および逆シリアル化します。

import json
personal_data = {
    'name': 'Prakash',
    'age': 34,
    'programming_languages': ['python', 'C#', 'java'],
    'address':{
        'flat_no': 177,
        'area': 'Velachery',
        'pincode': 600042
    }
}
client.set('prakask_personal_data', json.dumps(personal_data))
data = json.loads(client.get('prakask_personal_data').decode("utf-8"))
print(data){'name': 'Prakash',
 'age': 34,
 'programming_languages': ['python', 'C#', 'java'],
 'address': {'flat_no': 177, 'area': 'Velachery', 'pincode': 600042}}

それでは、addressプロパティ内にあるareaプロパティにアクセスして、エラーが発生していないかどうかを確認してみましょう。

data['address']['area']
'Velachery'

正しい応答が得られたことがわかります。

キャッシングシステムは、アプリケーションを高速化するための単なる方法です。MySQL、Oracleなどの従来のSQLデータベース、およびMongoDBなどの新しいNoSQLデータベースは、データをディスクに保存します。ディスクで実行される操作は、メモリまたはRAMで実行される操作と比較すると、一般的に低速です。RedisやMemcachedなどのテクノロジーはインメモリデータストアであるため、操作は非常に高速ですが、これらのテクノロジーの欠点は、RAMが制限されており、すべての情報を格納するために使用できないことです。アプリケーションを高速化するために、RedisやMemcachedなどのテクノロジーが、MySQL、MongoDBなどの適切な本格的なデータベースと一緒に使用されます。アプリケーションでMemcachedを別のデータベースと一緒に使用する方法を見てみましょう。

Memcachedサーバーにキーと値のペアを設定し、しばらくしてアクセスしようとしているとします。キーがMemcachedサーバーから期限切れになっていると想定します。このような場合、MySQLなどの従来のデータベースのデータにアクセスしようとします。Memcachedとは異なり、すべてのデータは永続的であり、有効期限はありません。

client.add('analytics', 'vidhya', expire=15)
def fetch_from_mysql(key= ''): 
	data = ...  # fetch from MySQL server
	return data
data = client.get('analytics')
if not data
	# fetch from MySQL as the key is not found in the Memcached server
	data = fetch_from_mysql('analytics')
	print(data)
else: print(data)

これは、アプリケーションで本格的なデータベースと連携して動作するようにキャッシングシステムを設計する方法を示す簡単な例です。

結論

この記事では、次のことについて説明しました。

  • Memcachedとは何ですか?
  • WindowsへのDockerのインストール
  • DockerコンテナでMemcachedを実行する
  • Pymemcacheを使用してMemcachedに接続する
  • Pymemcacheを使用した簡単なCRUD操作の実行
  • アプリケーションでMemcachedを使用したキャッシュメカニズム

この記事で説明する関数は、Memcachedでの基本的なCRUD操作を理解して実行するために必要ですが、すぐに利用できるさまざまな関数がたくさんあります。キャッシングメカニズムはほとんどすべてのアプリケーションに存在し、本番環境に対応したアプリケーションを構築するには、キャッシングの基本を理解して学習する必要があります。Memcachedはキャッシングサーバーとしてのみ機能するように設計されていますが、競合他社のRedisは複数のユースケースを解決するように構築されています。Redisはシングルスレッドですが、Memcachedはマルチスレッドであるため、データサイズが大きい場合、MemcachedのパフォーマンスはRedisよりも優れています。Redisの詳細については、この記事をお読みください。

この記事は以上です。この記事を読んで楽しんで、何か新しいことを学んだことを願っています。読んでくれてありがとう! 

 ソース:https ://www.analyticsvidhya.com/blog/2022/06/introduction-to-memcached-using-python/

#python