on
Spring - Redis 연동
Spring - Redis 연동
Redis Java Client중 " Lettuce "를 사용하여 진행한다.
의존성 추가
compile 'org.springframework.boot:spring-boot-starter-data-redis:2.3.1.RELEASE' // Redis
Redis 외부설정 Properties (application.yml)
변수 기본값 설명 spring.redis.database 0 커넥션 팩토리에 사용되는 데이터베이스 인덱스 spring.redis.host localhost 레디스 서버 호스트 spring.redis.password 레디스 서버 로그인 패스워드 spring.redis.pool.max-active 8 pool에 할당될 수 있는 커넥션 최대수 (음수로 하면 무제한) spring.redis.pool.max-idle 8 pool의 "idle(유휴)"커넥션 최대수 (음수로 하면 무제한) spring.redis.pool.max-wait -1 pool이 바닥났을 때 예외발생 전에 커넥션 할당 차단의 최대시간
(단위: 밀리세컨드, 음수는 무제한 차단) spring.redis.port.min-idle 0 pool에서 관리하는 idle 커넥션의 최소 수 대상 (양수일 때만 유효) spring.redis.port 6379 레디스 서버 포트 spring.redis.sentinel.master 레디스 서버 이름 spring.redis.sentinel.nodes 호스트:포트 쌍 목록 (콤마로 구분) spring.redis.timeout 0 커넥션 타임아웃 (단위: 밀리세컨드)
Redis 설정값 Bean에 등록
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Value("${spring.redis.host}") private String redisHost; @Value("${spring.redis.port}") private int redisPort; @Value("${spring.redis.password}") private String redisPassword; @Bean public RedisConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); redisStandaloneConfiguration.setHostName(redisHost); redisStandaloneConfiguration.setPort(redisPort); redisStandaloneConfiguration.setPassword(redisPassword); LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration); return lettuceConnectionFactory; } @Bean public RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(redisConnectionFactory()); return redisTemplate; } }
Redis Cluster를 사용한 다중 Node 접속정보 설정방법
=> 단일 노드 접근방법과는 달리, RedisConnectionFactory가 아닌, LettuceConnectionFactory(RedisConnectionFactory의 구현체)를 사용하여 RedisTemplate에 설정한다.
spring: redis: cluster: nodes: 192.168.0.1:6379, 192.168.0.2:6379, 192.168.0.3:6379, 192.168.0.4:6379, 192.168.0.5:6379, 192.168.0.6:6379 max-redirects: 5 # 클러스터 노드간의 리다이렉션 숫자를 제한 password: 1234
package com.test.config; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @Configuration public class RedisConfig { @Value("${spring.redis.cluster.nodes}") private String clusterNodes; @Value("${spring.redis.cluster.max-redirects}") private int maxRedirects; @Value("${spring.redis.password}") private String password; @Bean public LettuceConnectionFactory lettuceConnectionFactory() { List clusterNodeList = Arrays.asList(StringUtils.split(clusterNodes, ',')) .stream() .map(m -> m.trim()) .collect(Collectors.toList()); RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(clusterNodeList); redisClusterConfiguration.setMaxRedirects(maxRedirects); redisClusterConfiguration.setPassword(password); return new LettuceConnectionFactory(redisClusterConfiguration); } @Bean @Primary public RedisTemplate redisTemplate() { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(lettuceConnectionFactory()); return redisTemplate; } }
Redis 자료구조 및 get/set 관련 메소드
자료구조 설명 get set del Strings 문자(String), Binary 유형 데이터를 저장 get
mget set
mset del Lists 하나의 Key에 여러 개의 배열 값을 저장 lrange lpush (왼쪽)
rpush (오른쪽) lpop (왼쪽)
rpop (오른쪽) Sets 정렬순서가 없는 String타입 smembers sadd srem Hashes 하나의 Key에 여러 개의 Field와 Value로 구성된 테이블을 저장 hget
hmget hset
hmset hdel Sorte Sets Set과 Hash가 결합 zrange zdd zrem Bitmaps 0과 1로 표현하는 데이터 타입 getbit setbit HyperLogLogs Element 중에서 Unique한 개수의 Element만 계산 pfcount pfadd Geospatial 좌표 데이터를 저장 및 관리하는 데이터 타입 geoadd geopos
geodist
georadius
georadiusbymember
- 더 자세히 알아보기
RedisTemplate Method 문서 링크
Docker를 통한 Redis Container 생성을 통한 연동
# docker image 다운로드 => docker image pull redis:5.0 (상황에 맞게 버전선택가능) # docker 컨테이너 생성 # -v [redis.conf local저장경로:/usr/local/etc/redis/redis.conf]를 통해 AUTH 설정 # --appendonly yes : AOF 디스크 쓰기 방식 적용 # 아래 명령어 실행전, redis.conf파일을 생성해야함. => docker run --name test-redis -d -p 6379:6379 -v /Users/we/redis/redis.conf:/usr/local/etc/redis/redis.conf -v /Users/we/wemakeprice/data/ep-redis:/data redis:5.0 redis-server /usr/local/etc/redis/redis.conf --appendonly yes # (!) local저장경로는 개인의 PC에 맞게 설정해주어야 함. 이렇게 설정하게되면, 컨테이너가 종료 & 삭제되어도 데이터가 지속적으로 남게되며, Spring Boot에서 발생하는 AUTH 오류를 해결한 상태에서 진행이 가능하다. # bash를 통한 redis-cli 접속 => docker exec -it test-redis bash 컨테이너 안에서 => redis-cli 입력하면 redis command line을 입력할 수 있다.
(!) AOF 디스크 쓰기 관련 참고링크
redis.conf 설정
# SECURITY requirepass 1234 # PORTS port 6379 # CLIENTS maxclients 1000 # Persistence(지속성) dbfilename dump.rdb dir ./
(!) redis.conf 관련 참고링크
Redis Tool UI
- https://www.electronjs.org/apps/p3x-redis-ui
from http://xggames.tistory.com/35 by ccl(A) rewrite - 2021-10-20 11:27:16