본문 바로가기
카테고리 없음

230401 TIL

by hbIncoding 2023. 4. 3.

1.  Docker 설치하기

 1) 작업 관리자 > 성능 > CPU 가상화 : 사용   설정 확인

  • 설정이 안되어 있다면 페이지 하단의 참조를 확인하거나 아래와 같이 설정
    • 제어판 > 프로그램 설치 및 제거 > Window 기능 켜기/끄기 클릭 > Hyper-V 체크 확인 후 리부팅

 2) Docker 설치

 3) Docker 사용

  • 설치 완료후 Redis image 생성
  • 아래와 같이 Run 을 누른 후 이름을 지어주고 ports를 6379로 설정, 여기서는 testRedis로 명명했다.
    • Redis 기본 포트는 6379이다. 별도로 지정하지 않으면 6379로 연결을 시도한다.

 3) Docker test

  • git bash 와 같은 터미널에서 다음 명령어를 입력한다
    • docker exec -it {Redis컨테이너이름} redis-cli
    • 위 에서 'the input device is not a TTY' 에러가 날 경우 앞에 winpty를 붙여주자
    • winpty docker exec -it {Redis컨테이너이름} redis-cli
  • 아래와 같이 잘 작동하는 것을 확인 할 수 있다.

 

2.  Springboot와 Redis 연결 

 1) application.properties 작성

spring.cache.type=redis
spring.redis.host=127.0.0.1
spring.redis.port=6379

 2) mainApplication

@EnableScheduling
@EnableBatchProcessing
@SpringBootApplication
public class GodoksApplication {

	public static void main(String[] args) {
		SpringApplication.run(GodoksApplication.class, args);
	}

}

 3) RedisConfig 작성

@Profile("local")
@EnableRedisRepositories
@Configuration
public class RedisConfig {
	@Value("${spring.redis.port")
	public int port;

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

	@Bean
	public RedisConnectionFactory redisConnectionFactory() {
		return new LettuceConnectionFactory(host,port);
	}

	@Bean
	public RedisTemplate<?, ?> redisTemplate(){
		RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
		// 아래 두 라인을 작성하지 않으면, key값이 \xac\xed\x00\x05t\x00\x03sol 이렇게 조회된다.
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setValueSerializer(new StringRedisSerializer());
		redisTemplate.setConnectionFactory(redisConnectionFactory());
		return redisTemplate;
	}
}

 4) RedisService 작성

@Service
@RequiredArgsConstructor
public class RedisService {

	private final RedisTemplate redisTemplate;

	//데이터 넣기
	public void setValue(String key, String data){
		ValueOperations<String, String> values = redisTemplate.opsForValue();
		values.set(key, data);
	}

	//데이터 가져오기
	public String getValues(String key){
		ValueOperations<String, String> values = redisTemplate.opsForValue();
		return values.get(key);
	}
}

 5) RedisController 작성

@RestController
@RequiredArgsConstructor
@RequestMapping("/redis")
public class RedisController {

	private final RedisService redisService;

	@PostMapping("")
	public void startRedis(@RequestBody HashMap<String, String> body){
		redisService.setValue(body.get("key"), body.get("data"));
	}

	@GetMapping("")
	public String startRedis(@RequestParam String key){
		return redisService.getValues(key);
	}

}

 6) postman으로 가동 확인

 

 7) git bash에서 작동 확인

  • setKeySerializer, setValueSerializer 설정을 하지 않으면, 콘솔에서 key를 조회할 때 \xac\xed\x00\x05t\x00\x03sol 이렇게 조회된다.

 

3.  Springboot와 Redis 연결 

 1) key 조회할 때 발생하는 에러 해결

  • spring boot에서 다음과 같이 key를 조회하면 숫자로 시작하는 키는 조회가 되지만 글자로 시작하는 키는 조회가 안된다.
ValueOperations<String, String> values = redisTemplate.opsForValue();

//이렇게 하면 숫자로 시작하는 키만 조회한다.
List<String> keys = values.get("*")
  • 따라서 아래와 같이 scan을 이용한 조회를 한다.
    • spring에서 조회하는 경우 저장 경로까지 조회가 되기 때문에 이를 삭제해주어야 쓸 수 있다
    • byte에서 String으로 조회하면서 경로가 이상한 글자로 출력되기 때문에 잘라서 사용해주었다.
    • 이 부분은 설정이나 컴퓨터 마다 다를 수 있다.
	List<String> keys = new ArrayList();
    
    ScanOptions scanOptions = ScanOptions.scanOptions().match("*").build();
	Cursor<byte[]> keys = redisTemplate.getConnectionFactory().getConnection().scan(scanOptions);
        while (keys.hasNext()){
            String key = new String(keys.next());
            key = key.substring(7); //key를 가져올 때 경로까지 가져오고 이거를 byte에서 string으로 바꾸면서 앞에 쓸때 없는 정보가 붙는다, 이것을 제거해주어야한다
            if (key.charAt(0)==98){
                bookidkeys.add(key);
            } else if (key.equals("rank")) {
            } else {
                keys.add(key);
            }
        }

 

 

 

 

5.  참조

 1) docker와 redis : https://it-techtree.tistory.com/entry/access-to-redis-in-springboot

 

Springboot에서 Docker Redis와 연동하기

Redis는 In-Memory로 데이터를 저장하고, Key-Value 방식으로 데이터를 입출력 연산을 지원하는 데이터베이스입니다. In-memory 저장소이므로, 프로그램이 종료되면 쌓여있던 데이터는 모두 유실될 수 있

it-techtree.tistory.com

 2)spring boot와 redis 연결 : https://sol-devlog.tistory.com/7

 

[SpringBoot] Redis를 SpringBoot 프로젝트에서 사용해보자

로그인 관리를 공부하면서, 세션과 리프레시 토큰을 효율적으로 관리하는 방법 중 메모리에 저장하여 빠른 접근성과 동시에 디스크에도 저장하여 영속성까지의 이점을 갖는 Redis를 알게 되었다

sol-devlog.tistory.com