Redis eviction policy를 사용하여 효율적으로 레디스 사용하기

Hwangro Lee
4 min readAug 1, 2021

--

Redis를 캐시로 사용할 경우 새로운 데이터를 추가할 때 이전 데이터를 자동으로 제거하는 방법에 대해서 공부해보겠습니다.

저희 회사에서는 RDB의 부하를 줄이기 위해 Redis를 캐시로 사용하고 있습니다. 하지만 서비스가 커지고 사용자가 많아지면서 자연스레 캐시의 용량도 증가하게 되면서 간혹 레디스가 죽으면서 서비스도 죽는 현상이 발생하게 되었습니다.

캐시서버에 의해 서비스가 죽으면 캐시의 TTL을 조정하거나 메모리를 늘리는 식으로 관리했지만 언제까지고 이런식으로 관리할 수는 없다고 생각을 하게 되었고 레디스에 대해서 공부를 하기 시작했습니다.

캐시서버를 위한 튜닝

데이터를 찾을때 먼저 캐시에서 먼저 찾고 캐시에 없다면 디비에서 찾게 됩니다. 그래서 캐시에는 데이터가 꼭 있어도 없어도 되기 때문에 Eviction policy 만 도입해도 캐시 용량의 증가로 인한 서버다운은 발생하지 않을거라 생각합니다.

Maxmemory 지시어

redis.conf 내에 maxmemory옵션을 사용하여 maxmemory 에 설정한 용량만큼 사용했다면 Eviction policy 에 따라 데이터를 제거하여 설정한 용량이하로 유지합니다.

32비트 시스템인 경우 3GB 가 기본값이며 64비트인 경우 0이 기본값입니다. 0인 경우 Eviction policy 를 사용하지 않습니다.

Eviction Policy

  • noeviction: maxmemory에 도달하면 쓰기/삭제 작업시 오류를 반환합니다.
  • allkeys-lru: 새로 추가된 데이터의 용량을 확보하기 위해 최근에 사용하지 않은 키를 제거합니다.
  • volatile-lru: 새로 추가된 데이터의 용량을 확보하기 위해 TTL이 설정된 키들 중 최근에 사용하지 않은 키를 제거합니다.
  • allkeys-lfu: 새로 추가된 데이터의 용량을 확보하기 위해 사용빈도수가 가장 적은 키를 제거합니다.(최근 저장된 키라도 사용 빈도수가 적다면 대상이 될 수 있습니다.)
  • volatile-lfu: 새로 추가된 데이터의 용량을 확보하기 위해 TTL이 설정된 키들 중 사용빈도 수가 적은 키를 제거합니다. (최근 저장된 키라도 사용 빈도수가 적다면 대상이 될 수 있습니다.)
  • allkeys-random: 새로 추가된 데이터의 용량을 확보하기 위해 무작위로 키를 제거합니다.
  • volatile-random: 새로 추가된 데이터의 용량을 확보하기 위해 TTL이 설정된 키들 중 무작위로 키를 제거합니다.
  • volatile-ttl: 새로 추가된 데이터의 용량을 확보하기 위해 TTL이 짧은 키를 제거합니다.

volatil-lru, volatil-randon, volatil-ttl의 경우 TTL이 설정된 키 중에서 삭제할 키를 찾기 때문에 TTL이 설정된 키가 없는데 maxmemory만큼 용량이 도달했다면 noeviction처럼 오류를 반환합니다.

In general as a rule of thumb

  • 현재 사용하고 있는 레디스에 어떤 정책을 넣어야하지 잘 모르겠다면 allkeys-lru를 선택하는것이 좋습니다.
  • 모든 키들의 사용이 비슷하다고 판단된다면 allkeys-random를 사용합니다.

키에 TTL을 설정 할 경우 메모리를 더 소모하므로 allkeys-lru와 같은 정책을 사용할 경우 TTL을 설정하지 않고 메모리 부족 상태에서 키가 제거되도록하면 TTL을 설정하지 않아도 되기 때문에 효율성이 좋습니다.

마무리

캐시용도가 아닌 데이터를 보관하는 용도의 레디스라면 Eviction policy 를 적용하지 않는 것이 좋습니다. Eviction policy 는 용량이 다 찼을 때 정책에 따라 기존 데이터를 지우게 되기 때문입니다. 즉, Eviction policy 는 캐시서버를 운영하는데 있어서 상당히 유용한 옵션입니다. 이점을 참고 하시어 운영중인 서비스에 맞게 적용하시면 좋을 것 같습니다.

--

--