기술/Redis

Redis protocol file 생성 (python)

anywon 2019. 2. 28. 05:27

* Redis protocol 이란 Redis client 와 Redis server 간 통신을 할때 사용되는 protocol 이다.
줄여서 RESP (Redis Serialization Protocol) 라고 부른다.


* 위 프로토콜의 장점은 무엇일까?

  • 구현이 쉽다.
  • 파싱이 빠르다.
  • 인간이 읽기 쉽다.

위의 장점으로만 보면 엄청 좋아보인다. 그래서 얼마나 좋은지 직접 확인을 하였다.

일단 RESP 의 마지막은 \r\n (CRLF)  로 끝난다.


아래의 sample 을 확인 하겠다. 일단 string 로 변수 를 초기화 한다음. 변수에 값을 넣고 그 값을 file 로 write 한다. 이 부분에서 확인해야 하는부분은 바로 변수에 들어가는 값이다.

str_buf = str()
str_buf = '*3\r\n$3\r\nset\r\n$2\r\nab\r\n$2\r\n11\r\n'

with open('resp.fmt', 'w') as fp:
    fp.write(str_buf)

해당 값은 \r\n 으로 구분되며 각각의 설명은 아래와 같다.

*3 : 전체 명령 LINE 수 이다.

여기서는 set {command} / ab {key_name} / 11 {value} 의 개수가 3개 이므로 3 으로 표시

$3 : 다음 라인의 size 이다. set 이므로 숫자는 3 이다.

$2 : ab 이므로 2


위의 파일을 실행 후 생성된 resp.fmt 를 아래와 같이 실행 한다.

$ cat resp.fmt | redis-cli -h 127.0.0.1 --pipe

All data transferred. Waiting for the last reply...

Last reply received from server.

errors: 0, replies: 1


$ redis-cli get ab "11"

redis-cli --pipe 명령어를 사용하여 replies: 1 이 표시되면 정상적으로 들어간것이다.


* 어떻게 사용할수 있을까?

나의 사용경험은 이렇다. 빠른 속도로 data 를 처리해야하는 웹서버 에서 redis 에 data 를 load 후 사용한 경험이 있었다.

이때, 기존은 data 들이 json 으로 되어 있어 json parsing 후 일일이 data 를 insert 하였는데 data 를 json file 로 생성하지 않고 resp format 형식으로 생성 후 필요할때마다 load 하고, load 된 key 를 expire 를 넣어 key 를  persistent 하게 보관하지 않아 memory over 가 발생되지 않게 한다. 이런식으로 사용을 하니 json load 및 parsing resource 를 감소할수 있었으며 client 가 redis command 를 resp 로 변환하는 resource 또한 줄일수 있다.