본문 바로가기

SpringFramework/Spring

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<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

 

Redis Cluster를 사용한 다중 Node 접속정보 설정방법

=> 단일 노드 접근방법과는 달리, RedisConnectionFactory가 아닌, LettuceConnectionFactory(RedisConnectionFactory의 구현체)를 사용하여 RedisTemplate에 설정한다.

 

<application.yml>

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

<RedisConfig.java>

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<String> 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<String, Object> redisTemplate() {
        RedisTemplate<String, Object> 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
 

- 더 자세히 알아보기

 

STRINGS Introduction Redis

strings_intro STRINGS Intro key-value Strings는 key와 value가 일 대 일 관계입니다. 반면 Lists, Sets, Sorted Sets, Hashes는 일 대 다 관계입니다. Key/Value Data type: Binary-safe strings 바이너리-안전 문자열은 알파벳, 숫

redisgate.kr

 

RedisTemplate Method 문서 링크

 

RedisTemplate (Spring Data Redis 2.5.6 API)

Helper class that simplifies Redis data access code. Performs automatic serialization/deserialization between the given objects and the underlying binary data in the Redis store. By default, it uses Java serialization for its objects (through JdkSerializat

docs.spring.io

 

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 Persistence

redis_persistence Redis Persistence Introduction Persistence Introduction 두 가지 방식 디스크 쓰기는 AOF와 RDB 두 가지 방식을 제공합니다. AOF는 Append Only File로 명령이 실행될때 마다 기록되는 파일입니다. 그러

www.redisgate.com

 

redis.conf 설정

# SECURITY
requirepass 1234

# PORTS
port 6379

# CLIENTS
maxclients 1000

# Persistence(지속성)
dbfilename dump.rdb
dir ./

(!) redis.conf 관련 참고링크

 

[Redis] redis.conf 설정 파일

1. 기본 설정 항목 설명 daemonize [yes/no] Redis 서버를 데몬으로 실행하려면 yes로 변경해주어야 한다. no로 설정되었을 경우, Redis 서버 실행 시 서버 메시지가 화면에 표시되고 리눅스 프롬프트가 떨

ozofweird.tistory.com

 

Redis Tool UI

- https://www.electronjs.org/apps/p3x-redis-ui

'SpringFramework > Spring' 카테고리의 다른 글

Spring - Mybatis FrameWork 여러 스키마 적용하기  (0) 2022.02.08
Spring - 인스턴스 변수 참조  (0) 2021.10.20
Spring - Validation  (0) 2021.10.20
Spring - ErrorController  (0) 2021.10.15
Spring - Filter, InterCeptor, AOP  (0) 2021.10.13