새소식

Database

[Database] Redis란 ?

  • -
728x90
Redis란 ?

 

선착순 이벤트를 진행하는데 선착순의 기준을 무엇으로 잡을 것이냐 라는 질문을 받았다. 이러한 이벤트를 진행할 때 당연히 의도한 무언가가 생성된 시간을 기준으로 하면 되지 않냐는 대답에 시간까지 동일하고, 그 과정에서 트랜잭션 처리는 어떻게 할 것이냐는 질문이 돌아왔을 때 아무 대답도 하지 못했다. 알아보니 이러한 시스템 설계엔  Redis  의 Sorted Set 자료구조를 사용하여 차례대로 일정 범위만큼 처리를 한다고 한다. 추후에 Redis 를 활용한 선착순 서비스를 생성해보고 싶은 욕심에 Redis 에 대해 정리해보려고 한다.

Redis란?

Redis ( Remote Dictionary Server) 는 메모리 기반의 "키-값" 구조 데이터 관리 시스템이며, 모든 데이터를 메모리에 저장하고 조회하기에 빠른 Read, Write 속도를 보장하는 비 관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)이다.

 

Redis 의 특징 및 장단점

1. 성능

모든 Redis 데이터는 메모리에 저장되어 대기 시간을 낮추고 처리량을 높인다.

평균적으로 읽기 및 쓰기의 작업 속도가 1ms 로 디스크 기반 데이터베이스보다 빠르다.

 

2. 유연한 데이터 구조

Redis 의 데이터 형식은 크게 5가지 형식을 지원한다. (String, Set, Sorted Set, Hash, List .. Bitmap, JSON 등 다양한 데이터 타입도 지원) 따라서, 애플리케이션 요구 사항에 알맞은 다양한 데이터 타입을 활용할 수 있다.

 

3. 개발 용이성

Redis 는 쿼리문이 필요하지 않으며, 단순한 명령 구조로 데이터의 저장 & 조회 등이 가능하다. 또한 Java, Python, JavaScript, PHP 등을 비롯한 다수의 언어를 지원한다.

 

4. 영속성

Redis 는 영속성을 보장하기 위해 데이터를 디스크에 저장할 수 있다. 정리하면 영속성을 지원하는 인메모리 데이터 저장소이다.

Redis 는 읽기 성능 증대를 위해 서버 측 복제(마스터-슬레이브)를 지원한다. Redis 가 실행중인 서버가 충돌하는 경우 장애 조치 처리와 함께 더 높은 읽기 성능을 지원하기 위해 슬레이브가 마스터에 연결하고 관계가 성립되면 전체 데이터베이스의 초기 복사본을 받는 마스터 / 슬레이브 복제를 지원한다.  마스터에서 쓰기가 수행되면 슬레이브 데이터 세트를 실시간으로 업데이트 하기 위해 연결된 모든 슬레이브로 전송되고, 이 후의 마스터에 대한 모든 변경 사항이 슬레이브에 복제된다. 즉, 서버에 치명적인 문제가 발생하더라도 디스크에 저장된 데이터를 통해 복구가 가능하다. 

또한 쓰기 성능 증대를 위한 클라이언트 측 샤딩(Sharding)을 지원한다. 여기서 샤딩은 파티셔닝 (Partioning) 과 동일하다. 같은 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방법이다.

 

5. 싱글 스레드 방식

Redis 는 싱글 스레드 방식을 사용하여 한 번에 하나의 명령어만을 처리한다. 따라서 연산을 원자적으로 처리하여 Race Condition(경쟁 사태) 가 거의 발생하지 않는다. 하지만, 멀티 스레드를 지원하지 않기 때문에 시간 복잡도가 O(n)인 명령어의 사용은 주의해서 사용해야 한다.

 

 

Redis 설치 및 설정

Redis 에 대한 개념을 정리했으니 실제로 동작시켜보자!

설치환경 : Window 10 (추후 Mac에서도 설치하고 정리할 예정)

 

설치

https://github.com/microsoftarchive/redis/releases

 

Releases · microsoftarchive/redis

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis

github.com

윈도우 기준으로 위의 git 에서 Redis-x64-3.0.504.msi  를 설치하였다. Redis 의 기본포트는 6379이다.

 

설치가 완료되면 작업관리자 서비스 탭에서 확인이 가능하다. 만일 윈도우 서비스를 사용하지 않는다고 하면 직접 redis-server.exe 파일을 실행해 수동으로 레디스 서버를 실행 시킬 수 있다. 

파일은 설치경로 C:\Program Files\Redis 에 들어있다.

 

레디스 서버를 싱행시켰다면, 레디스 명령어를 사용할 수 있는 redis-cli.exe 를 실행시킨다.

 

Redis 서비스 설정하기

redis.windows-service.conf 파일을 수정하여 다양한 설정을 할 수 있다.

 

⭐ redis conf 설정 파일 차이점

redis.windows-service.conf : 서비스/데몬으로 실행될 때 실행되도록 되어 있다. 백그라운드에서 실행되고 OS에 의해 관리된다.

redis.windows.conf : 명령줄이나 스크립트에서 실행되고 사용자 공간에서 관리된다.

 

Redis 포트 변경

redis.window.conf 파일을 열어서 'port'라고 검색해보면 아래와 같이 기본 포트 6379로 설정되어 있는 것을 확인할 수 있다. 6379 부분을 원하는 포트 번호로 변경해주면 된다.

# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

 

비밀번호 변경

비밀번호는 redis.window.conf 파일에서 'requiredpass' 를 검색하면 주석 처리가 되어있다.

################################## SECURITY ###################################

# Require clients to issue AUTH <PASSWORD> before processing any other
# commands.  This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
#
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
# 
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
# requirepass foobared

처음 redis 를 사용하면 기본 비밀번호가 설정되지 않은 상태이고, 이 주석 부분을 풀어서 'foobared' 부분을 원하는 비밀번호로 설정하면 된다.

auth [패스워드]

 

외부 접근 허용 IP 설정

# By default Redis listens for connections from all the network interfaces
# available on the server. It is possible to listen to just one or multiple
# interfaces using the "bind" configuration directive, followed by one or
# more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1

bind 부분을 주석해제하고 허용 아이피를 정해주면 된다.

 

메모리 최대 크기 설정

# NOTE: since Redis uses the system paging file to allocate the heap memory,
# the Working Set memory usage showed by the Windows Task Manager or by other
# tools such as ProcessExplorer will not always be accurate. For example, right
# after a background save of the RDB or the AOF files, the working set value
# may drop significantly. In order to check the correct amount of memory used
# by the redis-server to store the data, use the INFO client command. The INFO
# command shows only the memory used to store the redis data, not the extra
# memory used by the Windows process for its own requirements. Th3 extra amount
# of memory not reported by the INFO command can be calculated subtracting the
# Peak Working Set reported by the Windows Task Manager and the used_memory_peak
# reported by the INFO command.
#
# maxmemory <bytes>

redis 데이터베이스 자체 메모리를 차지하는 것이므로 maxmemory를 설정할 수 있다.

redis.windows.conf 파일을 열어서 'maxmemory'라고 검색하면 주석을 확인할 수 있다.

Log 파일 설정

기본으로 redis.windows.conf 파일에 log 파일이 생기지 않도록 logfile 값이 "" 인 빈 문자열로 되어 있다. 이것을 찾아서 아래와 같이 어떤 파일로 log를 기록할 것인지 작성하고 실행하면 redis가 실행된 것에 대한 log 파일이 생성된다.

 

# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice

# Specify the log file name. Also 'stdout' can be used to force
# Redis to log on the standard output. 
logfile "log.txt"

 

설정을 맞췄으면 작업관리자 -> 서비스 탭에서 레디스 (Redis) 재시작을 하면 자동으로 window-service.conf 파일 설정대로 초기화된다.

 

 

간략한 개념에 대해서 알아보았다. 다음에는 실제로 Spring 에 연결하여 사용하는 방법에 대해 정리해 보자!

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.