Redis 通讯协议的疑问
怪我咯
怪我咯 2017-04-21 10:57:48
0
3
618

关于通讯协议,见https://redis.readthedocs.org/en/latest/topic/protocol.html

1)命令 set mykey myvalue 对应 要发送到Redis的字符串(要转化为二进制数据)是

"*3\r\n$3\r\nset\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n"

2)命令 get mykey 对应字符串是 "*2\r\n$3\r\nget\r\n$5\r\nmykey\r\n"

3)最后得到Redis发回的响应是 "+OK\r\n$7\r\nmyvalue\r\n"

我的问题是,Redis这样的响应格式,是否意味者 客户端发完命令(需要得到返回

值的命令如get)后,必须要等待回应到达之后才能发送下一个命令? 这样对客户端来说 效率是否低了点?

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(3)
左手右手慢动作

Il s'agit de la méthode de streaming TCP normale.

阿神

Votre « faible efficacité pour le client » n'est que votre fantasme, n'est-ce pas ? Existe-t-il des données pour étayer cela ? Sans aucune donnée pour l’étayer, peut-il être jugé correctement sur la base de sentiments subjectifs ?

Il y a aussi la relation entre l'efficacité et les affaires. D'une manière générale, ce n'est que lorsque l'efficacité ne soutient pas les affaires que vous commencerez à considérer les questions d'efficacité avant d'avoir fait quoi que ce soit. ? Déjà?

Un dernier ajout. . Il s'agit de la définition du protocole TCP. Si quelque chose n'est pas clair, http://en.wikipedia.org/wiki/Transmission_Control_Protocol allez ici pour en savoir plus sur la spécification TCP. .

迷茫

Peut-être que cette question devient : Redis ne peut-il envoyer qu'une seule commande dans une seule requête ? Ce sera mieux

Conclusion : Quel que soit le protocole de requête Redis utilisé, l'envoi de plusieurs commandes en une seule requête est pris en charge


Protocole de requête Redis

Format de protocole de requête Redis non standard (également appelé Inline) :

Nom de la commande Paramètre 1 Paramètre 2 ... Paramètre N

définir le nom diaocow

Format standard du protocole de requête Redis :

*<Nombre de paramètres>CR LF
$<Nombre d'octets du paramètre 1>CR LF <Données du paramètre 1>CR LF
...
$<Nombre d'octets du paramètre N>CR LF
<Données du paramètre N>CR LF

*3rn$3rnsetrn$4rnnamern$7rndiaocowrn

Ainsi, lorsque nous devons définir la valeur du nom de clé sur diaocow, nous pouvons utiliser les deux formats de protocole ci-dessus (les lecteurs intéressés peuvent utiliser la commande telnet ou nc pour le tester eux-mêmes)

Comment le protocole de requête Redis prend-il en charge l'exécution par lots ? (C'est ce que tout le monde appelle souvent le mode pipeline)

Par exemple, je dois exécuter les deux commandes suivantes par lots :

  1. définir le nom diaocow

  2. définir le pays Chine

Ensuite, les données d'une requête ressembleront à ceci (en supposant que nous utilisons le protocole standard) : *3rn$3rnsetrn$4rnnamern$7rndiaocowrn*3rn$3rnsetrn$7rncountryrn$5rnchinarn

Ensuite, dans Redis, il sera analysé comme ceci, pseudo-code :

def processInputBuffer(client): 
    while (len(client.querybuf) > 0): 
        # 获取命令名,参数个数,参数数组以及当前读取到querybuf位置 
        cmd, argc, argv, pos = parseCommandInfo(client.querybuf) 
        # 执行命令 
        processCommand(cmd, argc, argv) 
        # 切换到下一个命令 
        client.querybuf = client.querybuf[pos:-1] 

parseCommandInfo sera analysé selon différents protocoles : si le premier octet est '*', le protocole standard sera utilisé

Remarques : Tous les clients Redis implémentent la fonction d'envoi de commandes par lots, ce qui n'est rien de plus que l'envoi de plusieurs commandes à Redis selon le format que nous venons de mentionner. Les lecteurs intéressés peuvent se référer à la langue que vous utilisez. familier avec le Client

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal