redis incr 명령어를 알아봅시다.

REDIS 2023. 1. 4. 23:30

 안녕하세요. 이번 시간에는 redis의 incr 명령어를 알아봅시다.

 


 먼저 key test를 조회해 봅시다. 그랬더니 nil이 떴습니다. 키가 없어서 그런 것일 겁니다.

 

 

 이제 incr test 명령어를 입력해 봅시다. 그러면, 1이 리턴됩니다. test가 없는 상태에서 incr test를 하니, 1이 나왔습니다.

 

 

 그런데, ttl을 따로 설정하지 않았습니다. 그렇기 때문에 ttl test를 입력하면 -1이 나오게 됩니다.

 

 

 이제 expire test 300을 입력해 보겠습니다. 그 다음에 다시 ttl test를 입력해 보면 아까와는 다르게 297이라는 수가 뜨게 됩니다. 이것은 297초 후에 test라는 키가 사라진다는 것을 의미합니다.

 

 

 이제 incr test와 ttl test를 순서대로 실행해 보겠습니다. incr의 결과값이 2, 3이 되었는데 ttl 값은 계속 감소함을 알 수 있습니다. 이를 이용하면 카운터로 써먹기 좋을 듯 싶습니다. 일정 시간이 경과되면 사라지는 카운터 등으로요. 여기까지 정리하면 키 key가 없는 경우 incr key의 리턴값은 1입니다. 만약에 키가 있는 경우, 해당 키에 저장된 수를 하나 증가시킵니다. 그러니 counter로 쓰면 안성맞춤이겠군요.

 


 아래와 같은 알고리즘이 있다고 해 봅시다.

 

 키 값을 증가시키는데요. value 값이 1이면 ttl을 설정합니다. 사실 incr은 ttl이 없어서, 명령어가 2개 이상 나오게 됩니다. 세션이 두 개가 있을 때, 아래와 같이 실행되면 별 문제가 없습니다.

 

 

 이 경우, incr key가 호출된 다음에 바로 value가 1인지를 검사해서 만약에 그렇다면 ttl을 설정합니다. 그런데, 세션 2개가 아래와 같이 실행되는 경우에는 어떨까요?

 

 세션 1이 incr key를 하고 value가 1인지 검사하기 전까지의 그 찰나의 순간에 세션 2가 inc key를 하면 어떻게 될까요? 이 경우, 세션 1이 value == 1을 하려는 순간 False가 떨어질 겁니다. 왜냐하면, 세션 1이 incr key를 수행하고 value가 1인지 체크하기도 전에, 다른 세션에 의해 incr key가 실행되었기 때문입니다.

 

 

 두 개의 세션에 redis client를 띄워 놓았습니다. 먼저 세션 1에 incr test 명령어를 수행했어요. 그랬더니, 1이 떨어졌습니다. 그 다음에 세션 2에 incr test를 수행했는데요. 이 때가 중요합니다. test 값이 2가 되었어요.

 

 이제 세션 1에서 test의 값을 얻어봅시다. 1의 입장에서는 1이 얻어질 줄 알았는데요. 그 찰나의 순간에 1이 더 증가하였습니다. 이는 세션 2에서 incr을 수행했기 때문입니다. 이 에서 언급한 내용과도 관련이 있어 보입니다. 물론 문서에도 나와 있습니다. 원자성을 만족하는 메서드 n개를 독립적으로 실행하면 atomic하지 않다. 이 문제를 해결하기 위한 방법으로 공식 문서에 몇 가지를 언급하고 있습니다. eval이라던지, multi exec를 사용해서 해결할 수 있다.