目的:
(1)学习各种数据库客户端的原理:
连接数据库服务器的端口,发送协议,受到应答
(2)redis协议
Redis 的通信协议是基于文本的,且以行为划分,每行以 \r\n 结束。每一行都有一个消息头,消息头共分为5种分别如下:
+
表示一个正确的状态信息,具体信息是当前行 + 后面的字符;
-
表示一个错误信息,具体信息是当前行-后面的字符;
*
表示消息体总共有多少行,不包括当前行,* 后面是具体的行数;
$
表示下一行数据长度,不包括换行符长度 \r\n, $ 后面则是对应的长度的数据;
:
表示返回一个数值,:后面是相应的数字节符;
让我们举一个例子,通过命令SET key value,设置 key 的值为 value。该命令对应的协议内容为:
*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$4\r\nvalue\r\n
当 Redis 服务器收到以上协议内容并执行成功后,则会返回如下协议
+OK\r\n
到当我们解析以上协议时,只需要根据不同的消息头做不同的解析就可以了。
from socket import *
class RedisClient:
def __init__(self):
self.client=socket(AF_INET, SOCK_STREAM)
def connect(self):
self.client.connect(('127.0.0.1',6379))
def set(self,key,value):
lenk=len(key)
lenv=len(value)
data='*3\r\n$3\r\nSET\r\n${0}\r\n{1}\r\n${2}\r\n{3}\r\n'.format(lenk,key,lenv,value)
print data
self.client.send(data.encode('utf8'))
data=self.client.recv(1024)
print(data.decode('utf8'))
def get(self,key):
lenk=len(key)
data='*2\r\n$3\r\nGET\r\n${0}\r\n{1}\r\n'.format(lenk,key)
print data
self.client.send(data.encode('utf8'))
data=self.client.recv(1024)
print(data.decode('utf8'))
if __name__ == '__main__':
client=RedisClient()
client.connect()
client.set('dog','1')
client.get('dog')
支持py2.7
效果截图: