Redis에서 TTL이 expired(만료)되면 메모리에 데이터는 아직 있다? 없다?
동료들과 커피마시면서 이야기가 나온 내용인데 궁금해서 찾아보았습니다.
정답은?!
TTL 만료 != 즉시 메모리 해제
Redis 메모리에는 존재하지 않는것 처럼 취급되지만 사실상 실제 메모리에서 삭제되는 것은 아니다!
Redis는 TTL이 지난 키를 두 가지 방식으로 제거!
1) Active Expiration(주기적으로 스캔) : Redis가 주기적으로 메모리를 스캔해서 만료된 키들을 삭제
serverCon이라는 내부에서 돌아가는 타이머 루프를 통해 스캔하고 제거하여 메모리를 관리 합니다.

2) Lazy Delete(게으른 만료) : 클라이언트가 GET/SET 등 키를 조회/갱신하려고 할 때 즉, 직접 접근 할 때
내부에서 만료체크를 하고 삭제를 진행 합니다.
TTL이 만료된 key가 바로 삭제 되지 않으면 OOM(Out Of Memory) 상황이 발생 할수도 있지 않나?
바로 안지워지는 레디스!
삭제지연으로 계속 쌓이면??
max memory 설정같은게 있나?
있다면 메모리 사용량이 limit 초과 시 정책에 따라 처리 합니다.
설정이 없다면 OOM 발생 가능
아래처럼 설정이 있으며 maxmemory, maxmemory-policy 등을 설정할 수 있습니다.
# 메모리 제한
maxmemory 4gb
# 메모리 부족 시 삭제 정책
maxmemory-policy allkeys-lru
# expire key 정리 강도
hz 10 # 기본: 10 (10번/sec)
active-expire-effort 1 ~ 10
Redis 메모리 삭제 정책(Eviction Policy)
Redis에서 메모리가 부족하면, 설정된 정책(maxmemory-policy)에 따라 어떤 키를 메모리에서 삭제할지 판단 합니다.

설정은 redis.conf에서 확인할 수 있습니다.
The default is: no eviction - 안 지웁니다. (=OOM! 성시경이 부릅니다. 장애로 가는 길! )

volatile-xxx : TTL(만료시간 지정된 Key 대상으로 삭제)
allkeys-xxx : TTL 상관없이 전체 Key에서 삭제 대상을 뽑습니다.
| 정책 | 동작방식 | 비유 |
| noeviction | 메모리 꽉 차면 새로운 write 요청 거부(error) -> OOM | 냉장고 꽉 참 -> 안 넣음! |
| volatile-lru | TTL 있는 키 중 LRU(가장 오랫동안 사용/참조 되지 않은 값) 한 키부터 삭제 |
유통기한 남은 음식 중 오래 안 꺼낸 것부터 버림 |
| volatile-ttl | TTL 있는 키 중 만료가 가장 얼마 안 남은 키 삭제 | 곧 상할 음식부터 치우자! |
| volatile-random | TTL 있는 키 중 랜덤 삭제 | 냉장고 음식 아무거나 뽑아서 버림 |
| allkeys-lru (가장 많이 씀) | 전체 Key 중 LRU(가장 오랫동안 사용/참조 되지 않은 값) 된 것부터 삭제 |
냉장고 전체 중 안 먹은 지 오래된 것부터 버림 |
| allkeys-random | 전체 Key 중 랜덤 삭제 | 아무거나 꺼내서 버린다 |
| allkeys-lfu | 전체 Key 중 가장 사용 빈도가 낮은 것부터 삭제 | 냉장고 전체 중 먹은 빈도가 적은 것부터 버림 |
LRU : Least Recently Used
LFU : Low Frequency Used

엄격한? 빡센? LRU는 모든 key에 대해서 사용시점(timestamp)을 저장하고
가장 오래전에 사용된 key를 정확하게 알기위해 우선순위 큐나 Tree같은 자료구조로
데이터 삽입/갱신 시에 정렬을 유지(=시간/메모리 비용 UP!) 합니다.
Redis는 추구하는 철학(빠른속도, 낮은 메모리 사용, 단순한 구조 유지)때문인지 빡센 LRU를 하지 않고
디폴트로 5개정도 샘플링해서 처리하는 구조 입니다.
- 메모리부족 -> 삭제가 요구 됨(Eviction)
- Redis all keys중에서 일부만 랜덤하게 샘플링(default 5개)
- 그 중 LRU(가장 오랫동안 사용/참조 되지 않은 값)를 삭제
- 삭제했는데도 메모리가 부족하면 다시 샘플링 반복!
정확도는 빡센 LRU와 비슷하게 동작한다고 합니다.
정확도를 높이려면 디폴트5개에서 10개등으로 샘플 수를 증가 시키면 됩니다.
단, 수만개의 키같은 극단적인 상황에서는 간혹 빡센 LRU와 약간 다른 키가 삭제 될수도 있습니다.