개발/nodejs

Javascript LRU Cache

kwony 2023. 10. 11. 11:54

Javascript 언어에서는 메모리 애플리케이션 메모리 공간을 캐시처럼 사용할 수 있는 기능을 제공한다. Redis처럼  key - value 로 사용하면 되는 줄 알았는데 사용방법이 약간 다르다.

 

설명에 앞서 아래 코드의 결과 값을 예상해보자

import LRU from 'lru-cache';

const cache = new LRU<number, any>({ max: 3 });

const props = new Set();
cache.set(1, props);
props.add('1');
props.add('2');

const result1 = cache.get(1);

console.log('Result 1:', result1);

set 함수가 실행된 후 props 에 ‘1’, ‘2’가 들어갔으므로 결과값이 빈 집합으로 예상할 수도 있다. 그런데 실제 결과 값은 아래와 같다.

 

Result 1: Set(2) { '1', '2' }

왜 그럴까? LRU 캐시는 값이 아니라 오브젝트에 대한 참조를 저장하고 있기 때문이다. 즉 props 라는 객체가 저장하는 값을 바라보고 있기 때문에 set 함수 실행이후 오브젝트의 변화값을 동시에 추적할 수 있게 된다. 

 

마찬가지로 result 값을 참조한 후에 데이터 값을 변환해도 변경 사항을 참조할 수 있다

 

import LRU from 'lru-cache';

const cache = new LRU<number, any>({ max: 3 });

const props = new Set();
cache.set(1, props);
props.add('1');
props.add('2');

const result1 = cache.get(1);
props.add('3');

console.log('Result 1:', result1);

 

실행 결과 get 함수 실행 이후에 추가한 '3'까지 동시에 출력되는 것을 확인 할 수 있다. 

 

Result 1: Set(3) { '1', '2', '3' }