Nginx Lua Module, Shared Memory set 할 때, 순서 바뀌는 문제

Apr 1, 2017

Nginx Lua Module을 개발할 때 Shared Memory를 사용했다. 다음과 같은 함수로 Shared Memory를 다룰 수 있다.

  • ngx.shared.DICT:get
  • ngx.shared.DICT:set
  • ngx.shared.DICT:add

그런데 한 가지 문제가 생겼다. 예를 들어

ngx.shared.DICT:add("1", 1)
ngx.shared.DICT:add("2", 1)
ngx.shared.DICT:add("3", 1)
ngx.shared.DICT:set("2", 2)

ngx.shared.DICT:get_keys()

이런 결과가 나타나길 기대했지만,

1 : 1
2 : 2
3 : 1

실제로 이런 결과가 나타났다.

1 : 1
3 : 1
2 : 2

순서는 그대로 두고, Shared Memory의 값이나 expires를 변경하고 싶었는데, 그렇게 되지 않았다.

replace 메소드를 확인했다.

set과 비슷하지만, 키가 존재할 때 ngx.shared.DICT 딕셔너리에 key-value 쌍을 보관한다. 이미 만료되었거나 딕셔너리에 키가 존재하지 않으면 success 리턴 값은 false가 되고, err 리턴 값은 “not found”가 된다고 했다. 따라서 replace는 해결 방법은 아니다.

모든 메소드를 확인해봤는데, 결국 해결 방법을 찾을 수 없었다. 그래서 구조를 다음과 같이 바꿨다.

  • DICT : 만료 시간도 주고, 값을 set 할 수 있는 공유 메모리
  • DICT_IDX : add만 하는 공유 메모리. 오직 delete만 할 수 있다.

이렇게 DICT_IDX라고, 새로운 공유 메모리를 추가하는 방식으로 해결했다.

See Also