Redis 사용 목적
SpinLock을 활용한 동시성 제어
동시성 제어를 AOP를 활용하여 실습하는데 활용되는 인프라
SingleThread기반 NoSQL 같은 개념
메모리DB를 사용하므로 빠른 성능을 갖고 있다.
주로 사용하는 경우 : 데이터가 적고, 휘발성 데이터를 사용할때, 빠른 성능을 위해
LocalRedis 실행 설정
SpringBoot가 기동하면서 Bean을 등록할 때 레디스를 실행하고, 종료되면서 Bean을 삭제할 때 레디스를 종료하도록 설정
주의점 : 해당 Bean이 Redis Repository보다 빨리 뜰 수 있도록 패키지 순서를 위쪽으로 해야 한다.
@Configuration
public class LocalRedisConfig {
@Value("${spring.redis.port}")
private int redisPort;
private RedisServer redisServer;
@PostConstruct
public void startRedis(){
redisServer = new RedisServer(redisPort);
redisServer.start();
}
@PreDestroy
public void stopRedis(){
if(redisServer != null){
redisServer.stop();
}
}
}
RedisRepository 등록
@Configuration
public class RedisRepositoryConfig{
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.post}")
private int redisPort;
@Bean
public RedissonClient redissonClient(){
Config config = new Config();
config.useSingleServer().setAddresss("redis://" + redisHost + ":" +redisPort);
return Redisson.create(config);
}
}
@PostConstruct : Bean 초기화 이후에 실행되는 메서드에 적용, Bean이 생성된 후에 초기화 작업이 필요한 경우 이 어노테이션을 사용하여 해당 작업을 자동화 할 수 있다.
@PreDestory : Bean의 인스턴스가 컨텍스트에서 제거될 때 호출, 자원의 해제 또는 종료 작업이 필요한 경우 사용하여 해당 작업을 자동화할 수 있다. 단, 빈의 범위가 "prototype"인 경우 Spring컨테이너는 완전히 관리하지 않으므로 "@PreDestory"메서드가 호출되지 않을 수 있다.
resources/application.yaml
spring:
redis:
host: 127.0.0.1
port: 6379
datasource:
url: jdbc:h2:mem:test
username: sa
password:
driverClassName: org.h2.Driver
h2:
console:
enabled: true
jpa:
defer-datasource-initialization: true
database-platform: H2
hibernate:
ddl-auto: create-drop
open-in-view: false
properties:
hibernates:
format_sql: true
show_sql: true
logging.level:
org.hibernate.SQL: debug
org.hibernate.type: trace
Reddis 실습
service/RedisTestService
package com.example.account.service;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
@RequiredArgsConstructor // final
public class RedisTestService {
private final RedissonClient redissonClient; // 생성자 자동 주입
public String getLock(){
RLock lock = this.redissonClient.getLock("sampleLock");
try { // 5초간 lock걸기
boolean isLock = lock.tryLock(1,5, TimeUnit.SECONDS);
if(!isLock) {
log.error("=====Lock acquisition failed=====");
return "Lock failed";
}
} catch (InterruptedException e) {
log.error("Redis lock failed");
}
return "Lock success";
}
}