Redis란 무엇일까요?
Redis는 인메모리(in-memory) 방식으로 동작하는 데이터베이스로, 다양한 데이터 구조를 제공합니다.
대표적인 데이터 구조는 다음과 같습니다:
- 키/값(Key/Value) 저장소
- 리스트(List)
- 셋(Set)
Redis는 Postgres와 같은 전통적인 SQL 데이터베이스와는 완전히 다른 성격을 지니고 있습니다.
Redis의 대표적인 활용 분야:
- 캐싱(Caching)
- 리더보드(순위표) 구현
- 방문자 수 집계
- 빠른 자동완성 추천
- 활성 사용자 세션 관리
- 작업 및 메시지 큐
지금부터 Ruby 애플리케이션에서 Redis를 활용하는 방법을 하나씩 살펴보겠습니다!
로컬 환경에 Redis 설치하기
가장 먼저 할 일은 Redis 서버를 설치하는 것입니다. 다른 데이터베이스를 설치하듯 진행하면 됩니다.
운영체제별 설치 방법은 다음과 같습니다:
- Ubuntu:
apt install redis-server - macOS:
brew install redis - Windows 10: "Windows Subsystem for Linux"(WSL) 환경 필요
서버가 정상적으로 실행되면 redis-cli 명령어로 서버에 접속할 수 있습니다.
참고: 서버에 접속하기 전에 별도의 터미널에서
redis-server명령어를 실행해 서버를 먼저 시작해야 할 수 있습니다.
이제 Redis를 사용할 준비가 끝났습니다!
Redis 젬(Gem) 사용하기
redis-cli로 직접 Redis와 상호작용할 수도 있지만, Ruby 코드 안에서 Redis를 다루려면 젬(gem)을 사용하는 것이 좋습니다.
선택할 수 있는 젬은 여러 가지가 있습니다:
- oxblood
- redic
- redis-rb
하지만 Redis 공식 개발팀이 권장하는 젬은 오직 redis-rb 하나뿐입니다.
설치 방법:
gem install redis
젬 설치가 완료되면 Redis 서버에 연결해 바로 작업을 시작할 수 있습니다.
먼저 키 a에 값 1을 저장해 보겠습니다.
코드는 다음과 같습니다:
require 'redis'
redis = Redis.new(host: "localhost")
redis.set("a", 1)
# "OK"
redis.get("a")
# "1"
이 젬은 Ruby 메서드를 Redis 명령어로 깔끔하게 매핑해 줍니다. 따라서 사용 가능한 명령어를 알고 싶다면 Redis 공식 문서나 젬 문서를 참고하면 됩니다.
공식 문서 활용하기
Redis 공식 문서에서는 특정 명령어 이름을 직접 입력하거나, 데이터 구조별로 검색할 수 있습니다.
"Filter by group" 메뉴에서 "Strings"를 선택한 뒤, 원하는 명령어를 골라 직접 테스트해 보세요.
예를 들어 incr 명령어를 사용하면 값을 1씩 증가시킬 수 있습니다:
redis.incr("a")
# "2"
또는 setex를 사용해 자동으로 만료되는 키를 설정할 수도 있습니다:
redis.setex("bacon", 10, 100)
여기서 두 번째 인자는 키가 만료되기까지의 시간(초)이고, 마지막 인자는 해당 키에 저장할 값입니다.
예제:
redis.get("bacon")
# "100"
10초가 지난 후에는…
redis.get("bacon")
# nil
다양한 명령어를 직접 실행해 보면서 Redis의 기능을 탐색해 보세요!
정렬된 셋(Sorted Set) 활용하기
Redis의 기능은 단순한 키/값 저장소에 그치지 않습니다. 훨씬 강력한 데이터 구조들을 제공하는데, 그중 하나가 바로 정렬된 셋(Sorted Set)입니다.
정렬된 셋을 사용하면 주어진 값 기준으로 정렬된 고유 항목 목록을 만들 수 있습니다. 이 정렬 기준 값은 Redis 문서에서 "score(점수)"라고 부릅니다.
셋에서 상위 N개 항목을 조회할 수 있기 때문에, 리더보드 구현에 완벽하게 어울립니다!
예제:
redis.zadd("popular_fruit", 10, "apple")
# true
redis.zadd("popular_fruit", 20, "banana")
# true
redis.zadd("popular_fruit", 30, "orange")
# true
셋이 준비되었으니 이제 최상위 항목을 조회해 보겠습니다:
r.zrevrange("popular_fruit", 0, 0)
# ["orange"]
이 명령어의 의미는 다음과 같습니다:
"가장 높은 순위(0)부터 시작해서 첫 번째 항목을 가져와라."
전체 항목을 순서대로 조회하고 싶다면:
r.zrevrange("popular_fruit", 0, -1)
# ["orange", "banana", "apple"]
zrevrange에 포함된 "rev"는 reverse(역순)를 뜻하며, 항목을 내림차순으로 반환합니다.
반대로 zrange를 사용하면 항목이 오름차순으로 반환됩니다.
정렬된 셋은 리더보드 외에도 다양하게 활용할 수 있습니다. 예를 들어 ZRANGEBYLEX 명령어를 사용하면 빠른 자동완성 엔진을 구축할 수도 있습니다.
그 밖의 셋 연산은 공식 문서를 참고해 보세요.
키, 값 그리고 네임스페이스 이해하기
Redis에는 컬럼도 없고 테이블도 없습니다. 모든 데이터가 하나의 평면적인(flat) 네임스페이스에 저장됩니다.
그렇다면 데이터는 어떻게 체계적으로 관리할 수 있을까요?
바로 키 이름 자체를 활용하면 됩니다. 널리 쓰이는 관례는 콜론(:)으로 일반적인 이름과 세부 구분자를 나누는 방식입니다.
예시:
redis.set("fruit:1", "apple")
# OK
redis.set("fruit:2", "banana")
# OK
Redis 소프트웨어 입장에서는 콜론이 있는 키와 없는 키에 전혀 차이가 없습니다. 하지만 개발자인 여러분에게는 데이터를 체계적으로 조직화하는 데 큰 도움이 되는 규칙입니다.
Redis의 데이터 영속성(Persistence)
기본적으로 Redis는 일반 데이터베이스처럼 모든 연산을 즉시 저장하지 않습니다.
디스크에 데이터를 저장하는 시점은 서버를 종료할 때이거나, 다음 조건에 해당할 때입니다:
- 15분 후, 1개 이상의 키가 변경된 경우
- 5분 후, 10개 이상의 키가 변경된 경우
- 1분 후, 10,000개 이상의 키가 변경된 경우
이때 현재 디렉터리에 dump.rdb 파일이 생성됩니다.
만약 Redis의 영속성 동작을 SQL 데이터베이스처럼 만들고 싶다면 "Append Only Mode(AOF)"를 활성화하면 됩니다. 이 모드에서는 매초 변경 사항이 저장됩니다.
Redis 설정 파일에 다음 줄을 추가(또는 주석 해제)하면 활성화됩니다:
appendonly yes
Rails 캐시 스토어로 Redis 사용하기
Rails 5.2부터는 Redis를 캐시 스토어로 사용할 수 있습니다. 필요한 것은 redis 젬과 서버뿐입니다.
활성화 방법:
# config/environments/production.rb
Rails.application.configure do
config.cache_store = :redis_cache_store, { url: "redis://localhost:6379/0" }
end
이렇게 설정하면 Rails의 모든 캐싱 작업이 Redis를 통해 처리됩니다.
직접 캐시에 데이터를 저장할 수도 있습니다:
Rails.cache.write("a", 1)
# "OK"
Rails.cache.read("a")
# 1
Rails는 내부적으로 다음과 같은 직렬화된 형태로 값을 저장합니다:
"\u0004\bo: ActiveSupport::Cache::Entry\t:\v@valuei\u0006:\r@version0:\u0010@created_atf\u00171555005228.7954454:\u0010@expires_in0"
즉, ActiveRecord 쿼리 결과처럼 직렬화 가능한 모든 Ruby 객체를 캐시에 저장할 수 있다는 뜻입니다.
Redis 자주 묻는 질문(FAQ)
"Redis 서버의 모든 키를 나열할 수 있나요?"
keys 또는 scan 명령어로 가능하지만, 실행 속도가 매우 느려서 권장하지 않습니다. 특히 데이터베이스 규모가 커질수록 성능 저하가 심해집니다.
"언제 Redis를 사용해야 하나요?"
반드시 사용 사례에 적합할 때만 사용해야 합니다. Redis의 데이터 구조를 활용했을 때 코드가 더 명확하고 이해하기 쉬워진다면 좋은 선택입니다.
단지 유행하거나 멋져 보인다는 이유만으로 Redis를 도입하지는 마세요. 다른 솔루션보다 문제를 더 잘 해결할 때 사용하는 것이 바람직합니다.
"Redis를 더 빠르게 만들려면 어떻게 해야 하나요?"
redis-rb 위에 hiredis 젬을 함께 설치하면 최대 성능을 끌어낼 수 있습니다.
마무리
이번 글에서는 캐싱, 카운팅, 큐 처리 등 적재적소에서 큰 힘을 발휘하는 고성능 인메모리 데이터베이스, Redis에 대해 알아보았습니다.
설치 방법부터 redis-rb 젬 활용, 정렬된 셋으로 리더보드 만들기, 네임스페이스 규칙, 데이터 영속성 설정, 그리고 Rails 캐시 스토어 적용까지 실전에 바로 쓸 수 있는 내용들을 담았습니다. 이 글이 유익했다면 주변에 널리 공유해 주세요.
읽어주셔서 감사합니다!