1. Docker 설치하기
1) 작업 관리자 > 성능 > CPU 가상화 : 사용 설정 확인
- 설정이 안되어 있다면 페이지 하단의 참조를 확인하거나 아래와 같이 설정
- 제어판 > 프로그램 설치 및 제거 > Window 기능 켜기/끄기 클릭 > Hyper-V 체크 확인 후 리부팅
2) Docker 설치
- 링크 접속 후 window des
- https://hub.docker.com/editions/community/docker-ce-desktop-windows/
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
2)spring boot와 redis 연결 : https://sol-devlog.tistory.com/7