1. Introdução
Vejamos um exemplo de um armazenamento simples de chave / valor, como o memcache. É simplesmente organizado - os dados são armazenados na memória, na estrutura de hashmap. O acesso a eles é feito através de um soquete TCP. Em python, o hashmap é um ditado regular. Para acessar, usaremos o zeromq.
Personalização
Para instalar este pacote no debian / ubuntu, basta entrar no console
sudo apt-get install libzmq-dev
sudo pip install zmq
Código
Vamos escrever uma classe para trabalhar com nosso servidor:
O tipo de soquete zmq usado é REQ (REQuest, solicitação), envia a solicitação e aguarda uma resposta.
Para armazenar e transferir qualquer tipo de dados pela rede, usamos o módulo pickle padrão. "Protocolo" do trabalho - uma tupla de três valores: (comando, chave, dados)
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'
Use
cache = SuperCacher ()
cache.set ('chave', 'valor')
cache.get ('chave')
Como lição de casa, melhore a implementação adicionando a capacidade de especificar um endereço / porta ao criar uma instância da classe.
Agora vamos escrever o próprio servidor.
Desta vez, o soquete REP é usado (REPly, resposta) - estamos aguardando a solicitação, o capacete é a resposta. Analisamos a solicitação, respondemos 'ok' no caso de gravação ou dados / Nenhum no caso de leitura.
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()
Para testar tudo junto, inicie o servidor com o comando
python daemon.py
Na próxima guia, inicie o python interativamente.
>>> from lib import SuperCacher >>> cache=SuperCacher() >>> cache.set('key', 'value') True >>> cache.get('key') 'value'
Oh milagre, funciona! Agora você pode escrever com segurança em seu currículo “desenvolvendo armazenamento de valores-chave usando o protocolo zmq”