introduction
Regardons un exemple de stockage clé/valeur simple, tel que Memcache. Sa conception est simple : les données sont stockées en mémoire, dans une structure hashmap. Ils sont accessibles via un socket TCP. En Python, hashmap est un dict classique. Pour l'accès, nous utiliserons zeromq.
réglage
Pour installer ce paquet dans debian/ubuntu, entrez simplement dans la console
sudo apt-get install libzmq-dev
sudo pip install zmq
Code
Écrivons une classe pour travailler avec notre serveur :
Le type de socket zmq utilisé est REQ(REQuest, request), nous envoyons une requête et attendons une réponse.
Pour stocker et transmettre tout type de données sur le réseau, nous utilisons le module pickle standard. Le « protocole » de travail est un tuple de trois valeurs : (commande, clé, données)
import zmq
import pickle
class SuperCacher:
def __init__(self):
context = zmq.Context()
self.socket = context.socket(zmq.REQ)
self.socket.connect('tcp://127.0.0.1:43000')
def get(self, key):
self.socket.send(pickle.dumps(('get', key, None)))
return pickle.loads(self.socket.recv())
def set(self, key, data):
self.socket.send(pickle.dumps(('set', key, data)))
return self.socket.recv() == b'ok'
l'utilisation de
cache = SuperCacher()
cache.set('clé', 'valeur')
cache.get('clé')
En guise de devoir, améliorez l'implémentation en ajoutant la possibilité de spécifier une adresse/un port lors de la création d'une instance d'une classe.
Écrivons maintenant le serveur lui-même.
Cette fois, le socket REP(REPly, réponse) est utilisé - nous attendons la demande et envoyons une réponse. Nous analysons la requête et répondons soit par 'ok' en cas d'écriture, soit par data / None en cas de lecture.
import pickle
import json
import zmq
def run_daemon():
memory = {}
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind('tcp://127.0.0.1:43000')
while True:
try:
command, key, data = pickle.loads(socket.recv())
if command == 'set':
memory[key] = data
socket.send(b'ok')
elif command == 'get':
result = memory.get(key, None)
socket.send(pickle.dumps(result))
except Exception as e:
print(e)
if __name__ == '__main__':
run_daemon()
Pour tout tester ensemble, on démarre le serveur avec la commande
python daemon.py
Dans l'onglet suivant, lancez python en mode interactif.
>>> from lib import SuperCacher
>>> cache=SuperCacher()
>>> cache.set('key', 'value')
True
>>> cache.get('key')
'value'
Oh miracle, ça marche ! Vous pouvez désormais écrire en toute sécurité dans votre CV « développement du stockage clé-valeur à l'aide du protocole zmq »
Source: habr.com