Pengenalan
Mari lihat contoh storan kunci/nilai mudah, seperti memcache. Ia direka secara ringkas - data disimpan dalam ingatan, dalam struktur peta hash. Mereka diakses melalui soket tcp. Dalam Python, hashmap ialah dict biasa. Untuk akses kami akan menggunakan zeromq.
pelarasan
Untuk memasang pakej ini dalam debian/ubuntu, hanya masukkan dalam konsol
sudo apt-get install libzmq-dev
sudo pip install zmq
Kod
Mari kita tulis kelas untuk bekerja dengan pelayan kami:
Jenis soket zmq yang digunakan ialah REQ(REQuest, request), kami menghantar permintaan dan menunggu jawapan.
Untuk menyimpan dan menghantar sebarang jenis data melalui rangkaian, kami menggunakan modul jeruk standard. "Protokol" kerja ialah gabungan tiga nilai: (perintah, kunci, 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'
Gunakan
cache = SuperCacher()
cache.set('kunci', 'nilai')
cache.get('key')
Sebagai kerja rumah, perbaiki pelaksanaan dengan menambahkan keupayaan untuk menentukan alamat/port semasa membuat contoh kelas.
Sekarang mari kita tulis pelayan itu sendiri.
Kali ini soket REP(REPly, response) digunakan - kami sedang menunggu permintaan, menghantar jawapan. Kami menghuraikan permintaan dan membalas sama ada dengan 'ok' dalam kes penulisan, atau dengan data / Tiada dalam kes membaca.
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()
Untuk menguji semuanya bersama-sama, kami memulakan pelayan dengan arahan
python daemon.py
Dalam tab seterusnya, lancarkan python dalam mod interaktif.
>>> from lib import SuperCacher
>>> cache=SuperCacher()
>>> cache.set('key', 'value')
True
>>> cache.get('key')
'value'
Oh keajaiban, ia berkesan! Kini anda boleh menulis dengan selamat dalam resume anda "pembangunan storan nilai kunci menggunakan protokol zmq"
Sumber: www.habr.com