Innledning
La oss se på et eksempel på en enkel nøkkel/verdilagring, for eksempel memcache. Den er utformet enkelt - dataene lagres i minnet, i en hashmap-struktur. De nås via en tcp-kontakt. I Python er hashmap en vanlig dict. For tilgang vil vi bruke zeromq.
justering
For å installere denne pakken i debian/ubuntu, skriv inn i konsollen
sudo apt-get install libzmq-dev
sudo pip install zmq
Kode
La oss skrive en klasse for å jobbe med serveren vår:
Typen zmq-socket som brukes er REQ(REQuest, request), vi sender en forespørsel og venter på svar.
For å lagre og overføre alle typer data over nettverket bruker vi standard pickle-modulen. Arbeidsprotokollen er en tuppel med tre verdier: (kommando, nøkkel, data)
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'
Bruk
cache = SuperCacher()
cache.set('nøkkel', 'verdi')
cache.get('nøkkel')
Som hjemmelekse, forbedre implementeringen ved å legge til muligheten til å spesifisere en adresse/port når du oppretter en forekomst av en klasse.
La oss nå skrive selve serveren.
Denne gangen brukes kontakten REP(REPly, response) - vi venter på forespørselen og sender et svar. Vi analyserer forespørselen og svarer enten med "ok" ved skriving, eller med data / Ingen ved lesing.
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()
For å teste alt sammen starter vi serveren med kommandoen
python daemon.py
I neste fane, start python i interaktiv modus.
>>> from lib import SuperCacher
>>> cache=SuperCacher()
>>> cache.set('key', 'value')
True
>>> cache.get('key')
'value'
Å mirakel, det fungerer! Nå kan du trygt skrive i CV-en din "utvikling av nøkkelverdilagring ved å bruke zmq-protokollen"
Kilde: www.habr.com