[241129 TIL]

    프로젝트 관리 심화

    인메모리 저장소 및 캐싱

    • 캐싱

    캐싱

    • 자주 사용되는 데이터를 더 빠른 캐시(Cache)에 저장하는 기법을 부르는 용어

    캐시(Cache)

    • Cache는 본래 CPU 내부의 작은 영역으로, 정말 빈번히 접근하게 되는 데이터를 저장해두는 임시 기억 장치
    • 기본적으로 영속성을 위해 파일시스템(디스크)에 저장하고, 빠른 활용을 위해 메모리(RAM)에 저장한다면, 정말 많이 사용되는 휘발성 데이터가 캐시에 저장

    캐싱의 필요성

    • 캐시의 목적과 방식을 웹 개발에 적용해, 빈번하게 접근하게 되는 데이터베이스의 데이터를 Redis 등의 인메모리 데이터베이스에 저장을 함으로서 데이터를 조회하는데 걸리는 시간과 자원을 감소시키는 기술
    • 웹 브라우저에서는 자주 바뀌지 않는 이미지 등을 브라우저 캐시에 저장해 페이지 로드를 줄이는 것도 캐싱의 일종이며, 이는 RESTful 설계 원칙 중에서 응답이 캐싱이 가능한지 명시해야 한다는 제약사항으로도 나타남

    캐싱 전략

    • 고려 사항
      • 캐시 적중(Cache Hit): 캐시에 접근했을 때 찾고 있는 데이터가 있는 경우를 나타냄
      • 캐시 누락(Cache Miss): 캐시에 접근했을 때 찾고 있는 데이터가 없는 경우를 나타냄
      • 삭제 정책(Eviction Policy): 캐시에 공간이 부족할때 어떻게 공간을 확보하는지에 대한 정책
    • Cache-Aside
      • Lazy Loading이라고도 하며, 데이터를 조회할 때 항상 캐시를 먼저 확인하는 전략
      • 캐시에 데이터가 있으면 캐시에서 데이터를, 없으면 원본에서 데이터를 가져온 뒤 캐시에 저장
      • 필요한 데이터만 캐시에 보관
      • 최초로 조회할 때 캐시를 확인하기 때문에 최초의 요청은 상대적으로 오래 걸림
      • 반드시 원본을 확인하지 않기 때문에, 데이터가 최신이라는 보장이 없음
    • Write-Through
      • 데이터를 작성할때 항상 캐시에 작성하고, 원본에도 작성하는 전략
      • 캐시의 데이터 상태는 항상 최신 데이터임이 보장
      • 자주 사용하지 않는 데이터도 캐시에 중복해서 작성하기 때문에, 시간이 오래 걸림
    • Write-Behind
      • 캐시에만 데이터를 작성하고, 일정 주기로 원본을 갱신하는 방식
      • 쓰기가 잦은 상황에 데이터베이스의 부하를 줄일 수 있음
      • 캐시의 데이터가 원본에 적용되기 전 문제가 발생하면 데이터 소실의 위험성이 존재

    캐싱 전략(Cache-Aside, Write-Through, Write-Behind)


    '[내일배움캠프] AI 를 활용한 백엔드 아카데미 심화 과정 > TIL' 카테고리의 다른 글

    MSA 개인 프로젝트 (2)  (0) 2024.12.06
    MSA 개인 프로젝트 (1)  (1) 2024.12.06
    Redis 명령어  (2) 2024.11.28
    Docker  (0) 2024.11.27
    QueryDSL  (0) 2024.11.26

    [241128 TIL]

    프로젝트 관리 심화

    인메모리 저장소 및 캐싱

    • Redis

    Redis 명령어

     

    String

    • 가장 기본적인 자료형, Redis가 Java의 Map<String, String>처럼 동작한다고 생각하면서 접근하면 편함
    • 저장할 수 있는 최대 크기는 512MB
    • GET, SET
      • SET <key> <value>: key에 value 문자열 데이터를 저장, "으로 공백 구분
      • GET <key>: key에 저장된 문자열 반환
    • INCR, DECR
      • INCR key: key에 저장된 데이터를 1 증가
      • DECR key: key에 저장된 데이터를 1 감소
    • MSET, MGET
      • MSET key value [key value …]: key value의 형태로 주어진 인자들을 각 key에 value를 저장
      • MGET key [key]: 주어진 모든 key에 해당하는 데이터를 반환.

    List

    • 여러 문자열 데이터를 Linked List의 형태로 보관하는 자료형
    • 스택 또는 큐 처럼 사용
    • Java의 Map<String, List<String>> 형태
    • LPUSH, RPUSH, LPOP, RPOP
      • LPUSH key value: key에 저장된 리스트의 앞쪽에 value를 저장
      • RPUSH key value: key에 저장된 리스트의 뒤쪽에 value를 저장
      • LPOP key: key에 저장된 리스트의 앞쪽에서 값을 반환 및 제거
      • RPOP key: key에 저장된 리스트의 뒤쪽에서 값을 반환 및 제거
    • LLEN, LRANGE
      • LLEN key: key에 저장된 리스트의 길이를 반환
        • 없는 Key를 대상으로 하면 0
        • 다른 자료형을 저장한 Key를 대상으로 하면 오류 발생
      • LRANGE key start end: key의 start부터 end까지 원소들을 반환
        • end가 실제 길이를 벗어나도 오류가 발생 X
        • start > end일 경우 빈 결과 반환
        • 음수의 경우 리스트의 뒤에서부터 데이터를 가져옴

    Set

    • 문자열의 집합
    • 중복값 X, 순서 X
    • SADD, SREM, SMEMBERS, SISMEMBER, SCARD
      • SADD key value: key에 저장된 집합에 value를 추가
      • SREM key value: key에 저장된 집합의 value를 제거
      • SMEMBERS key: key에 저장된 집합의 모든 원소를 반환
      • SISMEMBER key value: key에 저장된 집합에 value가 존재하는지 반환
      • SCARD key: key에 저장된 집합의 크기를 반환
    • SINTER, SUNION, SINTERCARD
      • SINTER key1 key2: key1과 key2에 저장된 집합들의 교집합의 원소들을 반환
      • SUNION key1 key2: key1과 key2에 저장된 집합들의 합집합의 원소들을 반환
      • SINTERCARD number key1 [key2 ...]: number개의 key에 저장된 집합들의 교집합의 크기를 반환

    Hash

    • Field - Value 쌍으로 이뤄진 자료형
    • Hash 데이터를 가져오기 위해 Key를 사용, 이후 다시 Key에 저장된 Hash 데이터에 Field - Value 쌍을 넣어주는 형식으로 동작
    • Redis 전체가 Map 이라면 Hash는 Map<String, Map<String, String>>의 형식
    • HSET, HGET, HMGET, HGETALL, HKEYS, HLEN
      • HSET key field value [field value]: key의 Hash에 field에 value를 넣음. 한번에 여러 field - value 쌍을 넣어줄 수 있음
      • HGET key field: key에 저장된 Hash의 field에 저장된 value를 반환. 없는 field의 경우 null.
      • HMGET key field [field]: key에 저장된 Hash에서 복수의 field에 저장된 value를 반환.
      • HGETALL key: key에 저장된 Hash에 저장된 field - value를 전부 반환.
      • HKEYS key: key에 저장된 Hash에 저장된 field를 전부 반환
      • HLEN key: key에 저장된 Hash에 저장된 field의 갯수를 반환

    Sorted Set

    • 이름처럼 정렬된 집합
    • 기본적으로 Set과 동일하게, 유일한 값들만 유지하지만 여기에 더해 각 값들에 score라고하는 실수를 함께 보관
    • 데이터를 가져올 때, score를 바탕으로 정렬하여 값들을 가져올 수 있음
    • ZADD, ZINCRBY, ZRANK, ZRANGE, ZREVRANK, ZREVRANGE
      • ZADD key score member [score member ...]: key의 Sorted Set에 score를 점수로 가진 member를 추가, 이미 있는 member의 경우 새로운 score를 설정
      • ZRANK key member: key의 Sorted Set의 member의 순위를 오름차순 기준으로 0에서 부터 세서 반환
      • ZRANGE key start stop: key의 Sorted Set의 member들을 start 부터 stop 순위까지 오름차순 기준으로 반환
      • ZREVRANK key member: key의 Sorted Set의 member의 순위를 내림차순 기준으로 0에서 부터 세서 반환
      • ZREVRANGE key start stop: key의 Sorted Set의 member들을 start 부터 stop 순위까지 내림차순 기준으로 반환
      • ZINCRBY key increment member: key의 Sorted Set의 member의 score를 increment 만큼 증가 (음수를 전달하면 감소)

    그 외 공용 명령

    • DEL, EXPIRE, EXPIRETIME
      • DEL key: key(와 저장된 데이터)를 제거
      • EXPIRE key seconds: key의 TTL(유효시각)을 seconds로 설정, seconds초가 지나면 key 제거
      • EXPIRETIME key: key가 만료되는 시각을 Unix Timestamp로 반환
    • KEYS *: 저장된 모든 Key 확인
    • FLUSHDB: 모든 Key 제거

    '[내일배움캠프] AI 를 활용한 백엔드 아카데미 심화 과정 > TIL' 카테고리의 다른 글

    MSA 개인 프로젝트 (1)  (1) 2024.12.06
    캐싱(Caching), 캐싱의 필요성, 캐싱 전략  (1) 2024.11.29
    Docker  (0) 2024.11.27
    QueryDSL  (0) 2024.11.26
    MSA 프로젝트  (0) 2024.11.25

    + Recent posts