본문 바로가기
Database

[Reddis] Embedeed Redis

by sangyunpark 2023. 8. 14.

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";
    }
}

 

'Database' 카테고리의 다른 글

ORM이란?  (0) 2023.08.31