引言
让我们看一个简单的键/值存储的示例,例如memcache。 它的排列很简单-数据以哈希图结构存储在内存中。 通过tcp套接字访问它们。 在python中,hashmap是常规字典。 对于访问,我们将使用zeromq。
客制化
要在debian / ubuntu中安装此软件包,只需在控制台中输入
sudo apt-get install libzmq-dev
sudo pip install zmq
代号
让我们编写一个用于处理服务器的类:
使用的zmq套接字的类型是REQ(REQuest,请求),发送请求,然后等待响应。
要通过网络存储和传输任何类型的数据,我们使用标准的pickle模块。 工作的“协议”-三个值的元组:(命令,键,数据)
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'
使用方法
缓存= SuperCacher()
cache.set('key','value')
cache.get('key')
作为一项家庭作业,通过在创建类的实例时添加指定地址/端口的功能来改进实现。
现在我们将编写服务器本身。
这次,使用了REP插座(REPly,响应)-我们正在等待请求,头盔就是答案。 我们解析该请求,如果是写则回答“ ok”,如果是读则回答“数据/无”。
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()
要一起测试所有内容,请使用以下命令启动服务器
python daemon.py
在下一个标签中,以交互方式启动python。
>>> from lib import SuperCacher >>> cache=SuperCacher() >>> cache.set('key', 'value') True >>> cache.get('key') 'value'
哦,奇迹,行得通! 现在,您可以安全地在简历中写“使用zmq协议开发键值存储”