RESP ਨੂੰ ਸਮਝਣਾ: Redis ਦੇ ਪਿੱਛੇ ਦਾ ਪ੍ਰੋਟੋਕੋਲ

ਆਪਣੀ ਪਿਛਲੀ ਪੋਸਟ ਵਿੱਚ, ਮੈਂ Node.js ਨਾਲ ਬਣਾਏ ਗਏ ਆਪਣੇ Redis ਕਲੋਨ (clone) ਦਾ ਇੱਕ ਵੇਰਵਾ ਸਾਂਝਾ ਕੀਤਾ ਸੀ। ਹੁਣ, ਮੈਂ ਇਸ ਪ੍ਰੋਜੈਕਟ ਦੇ ਇੱਕ ਮਹੱਤਵਪੂਰਨ ਹਿੱਸੇ ਦੀ ਵਿਆਖਿਆ ਕਰਨਾ ਚਾਹੁੰਦਾ ਹਾਂ: RESP, ਜਾਂ Redis Serialization Protocol।

Redis ਨੂੰ ਸੁੰਦਰ JavaScript arrays ਨਹੀਂ ਮਿਲਦੇ। ਇਸਨੂੰ TCP socket ਰਾਹੀਂ raw bytes ਮਿਲਦੇ ਹਨ। ਕੰਮ ਕਰਨ ਲਈ, ਇਹਨਾਂ bytes ਨੂੰ ਇੱਕ structure ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਸਰਵਰ ਨੂੰ ਪਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ command ਕਿੱਥੋਂ ਸ਼ੁਰੂ ਹੁੰਦੀ ਹੈ ਅਤੇ ਕਿੱਥੇ ਖਤਮ ਹੁੰਦੀ ਹੈ। ਇਸਨੂੰ ਇਹ ਵੀ ਪਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਕਿੰਨੇ arguments ਹਨ ਅਤੇ ਹਰੇਕ ਦੀ ਲੰਬਾਈ ਕਿੰਨੀ ਹੈ।

RESP ਇਹ structure ਪ੍ਰਦਾਨ ਕਰਦਾ ਹੈ। ਇਹ ਉਹ ਭਾਸ਼ਾ ਹੈ ਜਿਸਦੀ ਵਰਤੋਂ clients ਅਤੇ servers ਗੱਲਬਾਤ ਕਰਨ ਲਈ ਕਰਦੇ ਹਨ।

ਉਦਾਹਰਣ ਵਜੋਂ, RESP ਵਿੱਚ GET name command ਇਸ ਤਰ੍ਹਾਂ ਦਿਖਾਈ ਦਿੰਦੀ ਹੈ: *2\r\n$3\r\nGET\r\n$4\r\nname\r\n

ਇੱਥੇ ਇਸਦਾ ਵੇਰਵਾ ਦਿੱਤਾ ਗਿਆ ਹੈ:

  • *2 ਦਾ ਮਤਲਬ ਹੈ 2 elements ਵਾਲਾ ਇੱਕ array।
  • $3 ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਅਗਲਾ ਹਿੱਸਾ 3 bytes ਲੰਬਾ ਹੈ: GET।
  • $4 ਦਾ ਮਤਲਬ ਹੈ ਕਿ ਅਗਲਾ ਹਿੱਸਾ 4 bytes ਲੰਬਾ ਹੈ: name।

Parser ਇਹਨਾਂ bytes ਨੂੰ ["GET", "name"] ਵਿੱਚ ਬਦਲ ਦਿੰਦਾ ਹੈ। ਹੁਣ engine command ਨੂੰ ਚਲਾ ਸਕਦਾ ਹੈ।

ਸਿਰਫ਼ spaces ਰਾਹੀਂ strings ਨੂੰ ਕਿਉਂ ਨਹੀਂ ਵੰਡਿਆ ਜਾਂਦਾ? ਸਧਾਰਨ splitting ਉੱਥੇ ਫੇਲ੍ਹ ਹੋ ਜਾਂਦੀ ਹੈ ਜਿੱਥੇ values ਵਿੱਚ spaces ਹੋਣ, ਜਿਵੇਂ ਕਿ SET message "hello world"। ਇਹ binary data ਦੇ ਨਾਲ ਵੀ ਫੇਲ੍ਹ ਹੋ ਜਾਂਦੀ ਹੈ। RESP ਹਰ value ਦੀ ਲੰਬਾਈ ਸ਼ਾਮਲ ਕਰਕੇ ਇਸ ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰਦਾ ਹੈ। ਸਰਵਰ ਬਿਲਕੁਲ ਉੰਨੇ ਹੀ bytes ਪੜ੍ਹਦਾ ਹੈ ਜਿੰਨੇ ਦੱਸੇ ਗਏ ਹਨ। ਇਹ ਇਸਨੂੰ binary-safe ਅਤੇ ਭਰੋਸੇਯੋਗ ਬਣਾਉਂਦਾ ਹੈ।

ਸਭ ਤੋਂ ਔਖਾ ਸਬਕ ਇਹ ਸਿੱਖਣਾ ਸੀ ਕਿ TCP stream-based ਹੁੰਦਾ ਹੈ, message-based ਨਹੀਂ। ਇੱਕ ਸਰਵਰ ਨੂੰ ਹਮੇਸ਼ਾ ਇੱਕ ਸਮੇਂ ਵਿੱਚ ਇੱਕ ਪੂਰੀ command ਨਹੀਂ ਮਿਲਦੀ। ਇੱਕ command ਦੋ ਵੱਖ-ਵੱਖ chunks ਵਿੱਚ ਆ ਸਕਦੀ ਹੈ। ਜਾਂ, ਇੱਕੋ chunk ਵਿੱਚ ਕਈ commands ਆ ਸਕਦੀਆਂ ਹਨ।

ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ parser ਇਹ ਨਹੀਂ ਮੰਨ ਸਕਦਾ ਕਿ ਇੱਕ data event ਦਾ ਮਤਲਬ ਇੱਕ command ਹੈ। Parser ਨੂੰ ਇੱਕ internal buffer ਦੀ ਵਰਤੋਂ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ।

ਮੇਰਾ RESP parser ਇਸ ਤਰ੍ਹਾਂ ਕੰਮ ਕਰਦਾ ਹੈ:

  1. Socket ਤੋਂ bytes ਪ੍ਰਾਪਤ ਕਰੋ।
  2. Bytes ਨੂੰ buffer ਵਿੱਚ ਜੋੜੋ।
  3. ਇੱਕ ਪੂਰੀ command ਨੂੰ parse ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।
  4. ਜੇਕਰ command ਅਧੂਰੀ ਹੈ, ਤਾਂ ਹੋਰ data ਦੀ ਉਡੀਕ ਕਰੋ।
  5. ਜੇਕਰ command ਪੂਰੀ ਹੈ, ਤਾਂ ਇਸਨੂੰ return ਕਰੋ।
  6. ਜੇਕਰ ਵਾਧੂ data ਬਚਦਾ ਹੈ, ਤਾਂ ਅਗਲੇ parse ਲਈ ਇਸਨੂੰ buffer ਵਿੱਚ ਰੱਖੋ।

ਇੱਕ database protocol layer ਤੋਂ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ। Redis ਦੁਆਰਾ data ਸਟੋਰ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ, ਇਸਨੂੰ command ਨੂੰ ਸਮਝਣਾ ਚਾਹੀਦਾ ਹੈ। Value return ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ, ਇਸਨੂੰ response ਨੂੰ encode ਕਰਨਾ ਚਾਹੀਦਾ ਹੈ।

RESP ਨੂੰ ਲਾਗੂ ਕਰਨ ਨਾਲ ਇੱਕ ਸਧਾਰਨ TCP server ਇੱਕ ਅਸਲੀ Redis-compatible system ਵਿੱਚ ਬਦਲ ਗਿਆ। ਇਸਨੇ backend systems ਨੂੰ ਦੇਖਣ ਦੇ ਮੇਰੇ ਨਜ਼ਰੀਏ ਨੂੰ ਬਦਲ ਦਿੱਤਾ। ਇੱਕ protocol ਸਿਰਫ਼ ਇੱਕ format ਤੋਂ ਵੱਧ ਹੈ। ਇਹ ਦੋ systems ਵਿਚਕਾਰ ਇੱਕ ਸਮਝੌਤਾ ਹੈ।

ਆਪਣੀ ਅਗਲੀ ਪੋਸ

ਰੈਪੋ: https://github.com/Abhinov007/redis_clone ਲਾਈਵ ਸੈਂਡਬਾਕਸ: https://abhinov007.github.io/Redis_Clone/ ਸਰੋਤ: https://dev.to/abhinov007/understanding-resp-the-protocol-behind-redis-50p4