Redis: comment je communique avec les clients

Ginseng manon 2021-09-15 09:47:50
redis comment je communique avec


On dit dans le Jianghu,Arts martiaux du monde,Indestructible,Mais pas si vite.,Cette phrase est tout simplement sur mesure pour moi.

Je suis unRedisServices,Le plus fier, c'est ma vitesse,Mon QPS Peut atteindre10Niveau Wan.

Il y a d'innombrables petits frères sous mes ordres,Ils viennent ici de temps en temps pour stocker ou récupérer des données,Je les appelle clients,Je leur ai donné des noms anglais Redis-client.

Parfois, un petit frère arrive très souvent,Parfois, un tas de petits frères viennent en même temps,Mais,Même si j'avais plus de petits frères, j'aurais pu m'en occuper.

Un jour...,Les petits m'ont demandé.

Redis:Comment communiquer avec le client_Données

J'y pensais.,Pour ne pas laisser mes petits frères ralentir mon orgueil,Lors de la conception du Protocole de communication avec eux,Je me suis creusé la cervelle,Les trois principes suivants ont été élaborés:

  • Simple à réaliser
  • Pour les ordinateurs,Résolution rapide
  • Pour les humains ,Très lisible

Pourquoi ce design? ? Regardons d'abord le processus d'émission d'une instruction. , Les opérations d'instruction doivent d'abord être encapsulées sur le client. , Utiliser le Réseau pour la transmission , Enfin, effectuer l'analyse correspondante sur le serveur 、Mise en œuvre.

Redis:Comment communiquer avec le client_Données_02

Si ce processus est conçu comme un protocole très complexe, , Alors Emballez - le. 、Analyse、 Le processus de transfert prendra beaucoup de temps , Ça me ralentira sûrement. .Qu'est - ce que, Tu m'as demandé pourquoi j'avais suivi la dernière règle. ? C'est un cadeau pour les programmeurs. , Je suis si gentil. .

J'appelle ce genre d'accord créé RESP (REdis Serialization Protocol)Accord, Il fonctionne TCP Couche supérieure du Protocole , Comme forme standard de communication entre moi et le client .

En parlant de ça,, J'ai hâte que vous voyiez mon chef - d'œuvre. , Mais je suis aussi un grand frère. , Il faut mettre des étagères. , Non, je vais vous montrer. .

Donc je vous suggère d'utiliser le client directement pour envoyer une commande au serveur , Ensuite, prenez le message correspondant à cette commande et regardez - le visuellement. .Cela dit,, Mais j'ai été scellé. , Normalement, vous ne pouvez pas voir les détails de mes communications internes. ,Alors...,Tu pourraisCamouflageEn un seul.RedisServeur pour, Pour intercepter les messages de mes frères. .

C'est facile à mettre en œuvre. , Ma relation avec mon frère était basée sur Socket Communication, Alors commencez par un local ServerSocket,Pour écouterRedisServices6379Port:

public static void server() throws IOException {
ServerSocket serverSocket = new ServerSocket(6379);
Socket socket = serverSocket.accept();
byte[] bytes = new byte[1024];
InputStream input = socket.getInputStream();
while(input.read(bytes)!=0){
System.out.println(new String(bytes));
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

Puis démarrezredis-cliClient, Envoyer une commande :

set key1 value1

  • 1.

À ce moment - là,, Le serveur déguisé recevra le message , Imprimé sur la console :

*3
$3
set
$4
key1
$6
value1

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

Regarde ça., J'ai vu les mots clés que j'ai entrés. , Mais il y a d'autres caractères , Comment expliquer ça? , Il est temps que je démystifie le format du message du Protocole .

Je l'ai dit aux garçons. , Tu dois suivre les règles quand tu parles à grand frère. ,Voilà., Vous devez suivre les règles suivantes lors de la demande :

*<Nombre de paramètres> CRLF
$<Paramètres1Longueur des octets pour> CRLF
<Paramètres1Données> CRLF
$<Paramètres2Longueur des octets pour> CRLF
<Paramètres2Données> CRLF
...
$<ParamètresNLongueur des octets pour> CRLF
<ParamètresNDonnées> CRLF

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

Expliquez d'abord ce qui se passe à la fin de chaque ligne CRLF, La conversion en langage de programmation est \r\n, C'est - à - dire retour et changement de ligne .Regarde ça., Vous pouvez voir pourquoi les commandes imprimées sur la console sont disposées verticalement. .

Lors de l'analyse de la commande ,setkey1value1 Sera considéré comme 3Paramètres, Par conséquent, le nombre de paramètres est 3, Correspond à la première ligne *3.

Premier paramètreset,La longueur est3Correspondant à$3;Deuxième paramètrekey1,La longueur est4Correspondant à$4;Troisième paramètrevalue1,La longueur est6Correspondant à$6. Correspond aux données réelles du paramètre sur la ligne suivante de chaque longueur de paramètre .

Regarde ça., Le processus de conversion d'une instruction en un message de protocole est - il bien compris? ?

Redis:Comment communiquer avec le client_Serveur_03

Quand le petit frère m'a envoyé sa demande, ,En tant que grand frère, Je vais répondre à la demande de mon frère. Réponse à la directive C'est, Et je dois trier les réponses , Sinon, mon frère n'aurait pas compris mes instructions. .

Chaîne simple

Réponse à une chaîne simple avec une seule ligne de réponse , Contenu de la réponse +Comme point de départ, Nouvelle ligne non autorisée ,Et\r\nFin. Il y a beaucoup d'instructions qui ne répondent qu'une seule fois qu'elles sont exécutées avec succès. OK, C'est le format utilisé , Capable de transmettre efficacement 、 Réduire au minimum les frais généraux d'analyse .

Redis:Comment communiquer avec le client_String_04

Mauvaise réponse

InRESPDans l'Accord, La réponse d'erreur peut être utilisée comme une variante d'une réponse de chaîne simple , Le format entre eux est très similaire , La seule différence est que le premier caractère est -Comme point de départ, Le contenu de la réponse d'erreur est généralement le type d'erreur et la chaîne de description de l'erreur .

Les réponses aux erreurs se produisent dans certains scénarios d'exception , Par exemple, lorsqu'une mauvaise commande est envoyée 、 Nombre incorrect d'opérandes , Une réponse d'erreur est donnée . Après que le client a reçu une réponse d'erreur , Le différencie de la réponse simple à la chaîne , Considéré comme anormal .

Redis:Comment communiquer avec le client_Données_05

Réponse entière

L'utilisation de la réponse intégrale est également très répandue ,Il prend:Comme point de départ,Par\r\nFin, Utilisé pour renvoyer un entier . Par exemple, lors de l'exécution incr Renvoie la valeur auto - incrémentée ,Mise en œuvrellen Renvoie la longueur du tableau ,Ou utiliserexistsOrdre retourné0Ou1 En tant que juge key Base d'existence , Ceux - ci utilisent des réponses entières .

Redis:Comment communiquer avec le client_Données_06

Réponse par lots

Réponse par lots, Est la réponse à une chaîne multiligne .Il prend$Comme point de départ, Suivi de la longueur des octets envoyés ,Et puis\r\n, Et envoyer les données réelles ,En fin de compte,\r\nFin. Si les données à répondre n'existent pas , La longueur de la réponse est -1.

Redis:Comment communiquer avec le client_Client_07

Réponses par lots multiples

Lorsque le serveur retourne plusieurs valeurs , Par exemple, lorsque vous retournez une collection d'éléments , Plusieurs réponses par lots seront utilisées .Il prend*Comme point de départ, Suivi du nombre d'éléments retournés , Suivi de plusieurs réponses par lots comme indiqué ci - dessus .

Redis:Comment communiquer avec le client_Données_08

Par ici., En gros, le Protocole de communication entre mon frère et moi est terminé. . Tu as essayé de te déguiser en serveur. , Encore une fois, essayez d'écrire un client pour interagir directement avec moi. .

private static void client() throws IOException {
String CRLF="\r\n";
Socket socket=new Socket("localhost", 6379);
try (OutputStream out = socket.getOutputStream()) {
StringBuffer sb=new StringBuffer();
sb.append("*3").append(CRLF)
.append("$3").append(CRLF).append("set").append(CRLF)
.append("$4").append(CRLF).append("key1").append(CRLF)
.append("$6").append(CRLF).append("value1").append(CRLF);
out.write(sb.toString().getBytes());
out.flush();
try (InputStream inputStream = socket.getInputStream()) {
byte[] buff = new byte[1024];
int len = inputStream.read(buff);
if (len > 0) {
String ret = new String(buff, 0, len);
System.out.println("Recv:" + ret);
}
}
}
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

Exécuter le code ci - dessus,Sortie de la console:

Recv:+OK

  • 1.

Il imite l'émission du client set Procédure de commande , Et reçu une réponse .Et ainsi de suite, Vous pouvez également encapsuler d'autres commandes vous - même ,Pour réaliser unRedisClient, En tant que petit frère , Pour communiquer avec moi .

Mais souviens - toi. , Appelle - moi grand frère. .

 

Réponse de fond du numéro public

"Interview"---Obtenir les données d'entrevue de la grande usine

"Diagramme de guidage"---ColPrends - le.24Zhang.JavaDiagramme de notes d'apprentissage de l'arrière - plan

"Architecture"---ColPrends - le.29BenjavaLivres électroniques d'architectes

"Sur le terrain"---ColPrends - le.springbootProjets opérationnels

"Vidéo"---ColMise à jourjavaVidéo de l'architecte

Attention au numéro public

Intéressant.、En profondeur、Direct

Discuter de la technologie avec vous

 

 

版权声明
本文为[Ginseng manon]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210915093510847a.html

  1. The first starcoin & move hacksong source code analysis - P (a)
  2. Zhaijia 36 days Salt Fish turn into Tencent, Zookeeper Consistency level analysis,
  3. Traitement de l'interception des champs de demande communs de Spring Cloud, plus de 500 personnes interviewent Ali,
  4. About JavaScript modules
  5. Object oriented programming (2)
  6. Java日期时间API系列42-----一种高效的中文日期格式化和解析方法
  7. Java日期時間API系列42-----一種高效的中文日期格式化和解析方法
  8. 宅家36天鹹魚翻身入職騰訊,Zookeeper一致性級別分析,
  9. Java Date Time API Series 42 - - a efficient Chinese Date Format and Analysis Method
  10. 已成功拿下字节、腾讯、脉脉offer,7年老Java一次操蛋的面试经历,
  11. 小米Java社招面试,每次面试必问的二叉树的设计与编码,
  12. 小米Java校招面试,阿里、百度、美团、携程、蚂蚁面经分享,
  13. 小米Java校招面試,阿裏、百度、美團、攜程、螞蟻面經分享,
  14. Xiaomi Java School Recruitment interview, Ali, baidu, meituan, ctrip, ant Facebook Sharing,
  15. La conception et le codage de l'arbre binaire requis pour chaque entrevue d'embauche de la société Java millet;
  16. A remporté avec succès Byte, Tencent, Pulse offer, 7 ans Java une expérience d'entrevue de baise,
  17. 干货来袭,Java岗面试12家大厂成功跳槽,
  18. 常用Java框架面试题目,现在做Java开发有前途吗?
  19. 常用Java框架面試題目,現在做Java開發有前途嗎?
  20. Les questions d'entrevue couramment utilisées pour le cadre Java sont - elles prometteuses pour le développement Java?
  21. L'arrivée de marchandises sèches, l'entretien d'emploi Java 12 grandes usines ont réussi à changer d'emploi,
  22. Multiple postures for handling container time in k8s environment
  23. Echarts remove left Gap, Blank
  24. Hotspot Weekly | zoom $100 million, docker fees, $38 billion Data bricks
  25. JsonMappingException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory...
  26. Java. Security. Securerandom source code analysis Java. Security. EGD = file: / dev /. / urandom
  27. When using IntelliJ idea, jump directly and quickly from the mapper interface to mapper.xml
  28. When idea writes SQL in mybatis XML, the solution to the problems of table name, field and red reporting
  29. Spring cloud integrates Nacos
  30. 应届毕业生Java笔试题目,2021大厂Java社招最全面试题,
  31. Liver explosion! Take you to understand Hadoop serialization
  32. linux系列之:告诉他,他根本不懂kill
  33. java版gRPC实战之三:服务端流
  34. RabbitMQ核心知识总结!
  35. linux系列之:告诉他,他根本不懂kill
  36. java版gRPC实战之三:服务端流
  37. RabbitMQ核心知识总结!
  38. 10天拿到字节跳动Java岗位offer,学习Java开发的步骤
  39. 10天拿到字节跳动Java岗位offer,Java知识点思维导图
  40. Résumé des connaissances de base de rabbitmq!
  41. 10天拿到字節跳動Java崗比特offer,Java知識點思維導圖
  42. 10 jours pour obtenir un Byte Jump Java post offer, Java Knowledge point Mind Map
  43. 10 jours pour obtenir l'octet Jump Java post offer, apprendre les étapes du développement Java
  44. Java version of gppc Reality Three: server side stream
  45. Linux Series: Dites - lui qu'il ne connaît pas kill du tout
  46. "Data structure and algorithm" of front end -- binary search
  47. 2020-2021京东Java面试真题解析,如何才能通过一线互联网公司面试
  48. 13 SpringBoot整合RocketMQ实现过滤消息-根据SQL表达式过滤消息
  49. 12 SpringBoot整合RocketMQ实现过滤消息-根据TAG方式过滤消息
  50. 11 SpringBoot整合RocketMQ实现事务消息
  51. 11 springboot Consolidated rocketmq Implementation transaction message
  52. 12 springboot Consolidated rocketmq Implements Filtering messages - Filtering messages according to tag method
  53. 13 springboot Consolidated rocketmq Implementation Filtering messages - Filtering messages according to SQL expressions
  54. linux系列之:告诉他,他根本不懂kill
  55. (1)java Spring Cloud+Spring boot企业快速开发架构之微服务是什么?它的优缺点有哪些?
  56. Oracle 检查 DATE 列 RANGE 分区表已有分区的最大日期时间
  57. ConcurrentHashMap--原理
  58. 2020 - 2021 JD Java interview Real question Analysis, How can interview through First - Line Internet Company
  59. Concurrenthashmap - - Principes
  60. Oracle vérifie l'heure de date maximale d'une partition existante dans la colonne date