Redis에 관하여

진영민·2022년 9월 20일
0

잡다한 상식

목록 보기
2/22
post-custom-banner

IMDB / MMDB

IMDB : In-Memory Database
MMDB : Main Memory DBMS
디스크가 아닌 주 메모리에 모든 데이터를 보유하고 있는 데이터베이스
디스크 검색 보다 자료 접근이 훨씬 빠르다.

전형적인 방식은 디스크에 저장된 데이터를 대상으로 쿼리를 수행하지만, 인 메모리 방식은 메모리상에 색인(index)을 넣어 필요한 모든 정보를 메모리상의 색인을 통해 빠르게 검색할 수 있다.

단점은 휘발성이다. DB서버 전원이 갑자기 꺼져버리면 안에 있는 자료들이 모두 삭제된다.
그래서 보통은 로그인세션 같은 날아가도 상관 없는 임시 데이터에 주로 사용한다.
압축은 사용하지 않으며, RAM 용량이 넉넉하지 않을 경우 가상메모리를 사용하여 역효과가 일어난다.

가상메모리

OS측에서 자동으로 작동한다.
기능은 다음과 같다.

  1. 주기억장치의 효율적 관리 : 하드디스크를 주기억장치(RAM)에 대한 캐시로 설정, 쓰지 않는 데이터는 하드디스크로 옮긴 뒤, 필요할 때만 램에 데이터를 불러와 올리고 다시 사용하지 않으면 하드디스크로 내린다.
  2. 메모리 관리의 단순화 : 각 프로세스마다 가상메모리의 통일된 주소 공간을 배정할 수 있다. 메모리가 단순해진다.
  3. 메모리 용량 및 안정성 보장 : 한정된 공간이 아닌 거의 무한한 가상메모리 공간을 배정, 프로세스들 끼리 메모리 침범이 일어날 여지를 줄인다.

전원이 꺼져도 데이터를 유지하기 위해 INSERT/UPDATE/DELETE된 값들은 모두 디스크에 로그로 기록하며, DBMS가 재구동될때 디스크로부터 로그 파일을 불러와 DBMS구조를 모두 재구축하기도 한다.

기존 DBMS제품도 인 메모리 데이터베이스를 사용할 수 있는 옵션을 제공하기도 하는데 MEMORY엔진이 있다.

Redis

많이 사용되는 In-memory database.
database, cache, message broker로 사용할 수 있다.
NoSQL-base이기 때문에 키 값과 value값이 있어 string, hash, list, set, sorted set, bit map 등이 가능하다.
transaction도 지원한다.
In-memory 구조기 때문에 용량 제한이 있다.

비동기식 복제도 지원한다. 주 서버에 장애가 발생하는 경우 없이 요청이 여러 서버로 분산될 수 있다.

캐싱, 채팅, 메시징 및 대기열, 게임 순위표, 세션, 지리 공간, ML, 실시간 분석 등에서 사용할 수 있다.


Redis VS MySQL Memory Engine

MySQL은 만료 기간을 지원하지 않아 데이터가 계속 쌓일 수 있다.
MySQL Memory Engine은 테이블을 만들어야 한다. 형식이 없거나 정해지지 않은 경우 사용이 불가능하다.
MySQL Memory Engine은 Locking범위가 Table이다.

Redis는 JSON object형태로 저장하기 때문에 table들을 연결해 줄 필요가 없다.

만약 NoSQL database를 저장한다면 Redis가 좋고, schema-structured database가 필요하다면 MySQL을 사용하는 것을 권장한다.


Redis 사용하기(호스팅)

여기서는 Node.js의 프로젝트에 Redis를 사용할 것입니다.
Node.js에 관한 내용은 Node.js 교과서 정리를 읽으세요!
redis를 호스팅해주는 서비스가 있습니다. redislab
회원가입 후 데이터베이스를 생성하면 됩니다.

무료로 30MB의 클라우드를 생성할 수 있습니다.
public endpoint, port, password의 정보를 저장해둡니다.

const redis = require('redis');
const RedisStore = require('connect-redis')(session);

const redisClient = redis.createClient({
	url: `redis://${process.env.REDIS_HOST}:${process.env.REDIS_PORT}`,
    password: process.env.REDIS_PASSWORD,
});

Redis 사용하기(로컬)

redis

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list

sudo apt-get update
sudo apt-get install redis

sudo service redis-server start
redis-cli
이러한 방식으로 로컬에 Redis를 설치할 수 있다.

Redis 사용하기 (Spring boot)

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

//application.yaml
spring:
  redis:
    host: localhost
    port: 6379
//Configuration
@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }
}
//객체 만드는 법
@Getter
@RedisHash(value = "people", timeToLive = 30)
public class Person {

    @Id
    private String id;
    private String name;
    private Integer age;
    private LocalDateTime createdAt;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
        this.createdAt = LocalDateTime.now();
    }
}
	@Autowired
    private PersonRedisRepository repo;

    @Test
    void test() {
        Person person = new Person("Park", 20);

        // 저장
        repo.save(person);

        // `keyspace:id` 값을 가져옴
        repo.findById(person.getId());

        // Person Entity 의 @RedisHash 에 정의되어 있는 keyspace (people) 에 속한 키의 갯수를 구함
        repo.count();

        // 삭제
        repo.delete(person);
    }

이러한 방법으로 redis를 사용할 수 있다.

profile
코린이
post-custom-banner

0개의 댓글