IMDB : In-Memory Database
MMDB : Main Memory DBMS
디스크가 아닌 주 메모리에 모든 데이터를 보유하고 있는 데이터베이스
디스크 검색 보다 자료 접근이 훨씬 빠르다.
전형적인 방식은 디스크에 저장된 데이터를 대상으로 쿼리를 수행하지만, 인 메모리 방식은 메모리상에 색인(index)을 넣어 필요한 모든 정보를 메모리상의 색인을 통해 빠르게 검색할 수 있다.
단점은 휘발성이다. DB서버 전원이 갑자기 꺼져버리면 안에 있는 자료들이 모두 삭제된다.
그래서 보통은 로그인세션 같은 날아가도 상관 없는 임시 데이터에 주로 사용한다.
압축은 사용하지 않으며, RAM 용량이 넉넉하지 않을 경우 가상메모리를 사용하여 역효과가 일어난다.
OS측에서 자동으로 작동한다.
기능은 다음과 같다.
전원이 꺼져도 데이터를 유지하기 위해 INSERT/UPDATE/DELETE된 값들은 모두 디스크에 로그로 기록하며, DBMS가 재구동될때 디스크로부터 로그 파일을 불러와 DBMS구조를 모두 재구축하기도 한다.
기존 DBMS제품도 인 메모리 데이터베이스를 사용할 수 있는 옵션을 제공하기도 하는데 MEMORY엔진이 있다.
많이 사용되는 In-memory database.
database, cache, message broker로 사용할 수 있다.
NoSQL-base이기 때문에 키 값과 value값이 있어 string, hash, list, set, sorted set, bit map 등이 가능하다.
transaction도 지원한다.
In-memory 구조기 때문에 용량 제한이 있다.
비동기식 복제도 지원한다. 주 서버에 장애가 발생하는 경우 없이 요청이 여러 서버로 분산될 수 있다.
캐싱, 채팅, 메시징 및 대기열, 게임 순위표, 세션, 지리 공간, ML, 실시간 분석 등에서 사용할 수 있다.
MySQL은 만료 기간을 지원하지 않아 데이터가 계속 쌓일 수 있다.
MySQL Memory Engine은 테이블을 만들어야 한다. 형식이 없거나 정해지지 않은 경우 사용이 불가능하다.
MySQL Memory Engine은 Locking범위가 Table이다.
Redis는 JSON object형태로 저장하기 때문에 table들을 연결해 줄 필요가 없다.
만약 NoSQL database를 저장한다면 Redis가 좋고, schema-structured database가 필요하다면 MySQL을 사용하는 것을 권장한다.
여기서는 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,
});
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를 설치할 수 있다.
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를 사용할 수 있다.