프로젝트/redis
-
Redis Cluster + Spring Boot + Lettuce client 이론과 세팅프로젝트/redis 2024. 8. 5. 00:00
Redis Sentinel이란? Redis Cluster를 알아보기 전에 간략하게 Redis Sentinel에 대해서도 알아보겠습니다.만약 Redis Cluster를 활용하지 않는다면 대안으로 자동으로 failover를 지원하는 Redis Sentinel을 활용해 볼 수 있습니다.마스터가 더 이상 사용할 수 없다는 사실에 여러 Sentinel이 합의하여 Slave 중 하나를 Master로 승격시키고 기존의 Master는 Slave로 강등시킵니다. 단순히 하나의 Sentinel에서 네트워크 문제로 Master와 연결되지 않을 수 있으므로 특정 quorum 이상에서 다운되었다고 인지한 경우 장애 조치를 진행합니다. Redis Cluster란 무엇일까?Redis Cluster는 N개의 마스터 노드를 활용하여 ..
-
분산락을 위한 Redis RedLock 톺아보기프로젝트/redis 2024. 7. 20. 20:42
분산락이란?분산락은 여러 개의 분산된 서버가 존재할 때 동일한 데이터에 대한 동기화를 보장하기 위해 사용하는 락의 종류 중 하나입니다. 분산락을 활용하면 서로 다른 서버들이 critical section 실행을 동시에 하지 못하도록 방지할 수 있습니다. 이때 MySQL의 네임드락, Zookeeper 등을 활용해서 분산락을 구현할 수 있는데 Redis의 RedLock 알고리즘을 활용하여 분산락을 구현할 수 있습니다. Redis가 다운되는 경우?단일 인스턴스를 활용하여 분산락을 구현할 수 있지만 이는 단일 실패점이 될 수 있습니다. 단일 실패점을 극복하기 위해서는 Master - Slave구조를 선택할 수 있습니다. 하지만 Slave로의 복제는 비동기이므로 아래와 같은 상황에서 race condition이..
-
[Spring Boot + Kotlin] Redis Luascript 적용프로젝트/redis 2023. 11. 8. 00:01
개요 luascript에 대한 간단한 개념을 학습 Kotlin + Spring Boot Application 환경에서 LuaScript 적용 동시성제어를 테스트코드를 통해 확인 luascript 실행 중 예외가 발생하면 어떻게 처리되는지 확인 Redis Luascript란? LuaScript란 Lua 프로그래밍 언어로 작성된 사용자 지정 스크립트를 Redis 서버 내에서 직접 실행할 수 있는 기능입니다. Atomic 한 작업으로 Redis 데이터에 대한 복잡한 작업을 수행할 수 있는 강력한 방법입니다. Transaction, Pipeline 과는 다르게 중간 결과를 조작할 수 있습니다. 예를 들어 Transaction 내부에서는 데이터를 GET해오면 null이 반환됩니다. 중간 결과인 데이터를 통해 조건..
-
[Spring Boot + Kotlin] Redis Transaction 실습프로젝트/redis 2023. 11. 7. 00:01
개요 공식문서로 알아보는 Redis Transaction에 이어 Spring Boot+ Kotlin을 활용하여 Redis Transaction 실습을 진행해보려 합니다. 테스트를 위한 데이터 세팅 @Component class LocalRedisDateSetter( private val stringRedisTemplate: StringRedisTemplate, ) { @PostConstruct fun localDataSet() { stringRedisTemplate.opsForHash().put("productItem", "104", "30") val valueOperation = stringRedisTemplate.opsForValue() valueOperation.set("test","test") }..
-
Redis Pipeline, Transaction, Lua script 차이프로젝트/redis 2023. 11. 6. 00:01
Redis Transaction이란? 여러 가지 명령어들을 처리하는 하나의 단위로 multi로 트랜잭션을 시작하고 exec를 통해 명령어들을 수행시켜 결괏값을 반환받습니다. 기존 RDB의 트랜잭션과는 조금 다른 의미를 가지고 있습니다. Redis pipeline이란? 명령어들을 모아서 한번에 서버로 전송시켜 네트워크 오버헤드를 줄이는 방안입니다. Transaction과 Pipeline 두 방법 모두 서버에 명령을 한 번만 보내는데 차이에 대해 조금 불확실하게 느껴집니다. transaction을 활용하면 모든 명령은 pipelining 되고 EXEC가 실행되면 모든 명령이 함께 실행되므로 항상 여러 명령의 원자성을 유지합니다. transaction과 pipelining은 어떻게 다를까요? Pipeline을..
-
공식문서로 알아보는 Redis pipeline프로젝트/redis 2023. 11. 5. 00:01
Redis pipeline이란? redis의 명령어들을 일괄로 처리하여 RTT(rount-trip-time)를 최적화하는 방법입니다. 개별 명령에 대해 응답을 기다리지 않고 한 번에 여러 명령을 실행하여 성능을 개선할 수 있습니다. RTT란? redis는 client-server 구조를 사용하는 TCP 서버입니다. 한마디로 클라이언트와 서버는 네트워크로 연결되고 네트워크는 매우 빠를 수도 느릴 수도 있습니다. 네트워크 지연 시간에 상관없이 패킷이 클라이언트에서 서버로 이동하고 서버에서 클라이언트로 다시 돌아와 응답을 전달하는 데는 시간이 걸립니다. 이런 시간을 RTT라고 부릅니다 만약 RTT 시간이 250ms인 경우 서버가 초당 10만개의 요청을 처리할 수 있더라도 초당 최대 4개의 요청만 처리할 수 있..
-
Redis를 통해 분산락 구현하기 - 실전편프로젝트/redis 2023. 10. 27. 00:01
Redis를 통해 분산락 구현하기 - 이론 편에 이어 실제로 구현을 해봅니다. 100장의 티켓을 구매하는 여러 스레드의 요청에도 분산락을 통해 예상한 대로 매진 시 0건 이하가 발생하지 않거나 50건의 요청이 있었다면 티켓 50장이 남아있는지 시나리오를 통해 동시성이 잘 제어되는지 확인해보려 합니다. 개발 환경 Spring Boot 3.1 Java 17 Redisson 의존성 추가 implementation ("org.redisson:redisson-spring-boot-starter:3.18.0") RedissonConfig 설정 @Configuration class RedissonConfig { @Value("\${spring.data.redis.host}") private val redisHost:..
-
Redis를 통해 분산락 구현하기 - 이론편프로젝트/redis 2023. 10. 25. 00:01
분산락이란 무엇일까? 여러 개의 분산된 서버가 존재할 때 동일한 데이터에 대한 동기화를 보장하기 위해 사용하는 락의 종류 중 하나입니다. 분산락은 어떤 상황에서 필요할까? Java Spring 기반의 웹 애플리케이션은 기본적으로 멀티 스레드 환경에서 기동 됩니다. 이에 따라 여러 스레드가 함께 접근할 수 있는 공유자원에 대해 race condition이 발생하지 않도록 별도의 처리가 필요합니다. Java의 synchonized라는 키워드를 통해 해결할 수 있지만, 서버를 여러 대 사용하여 분산되어 있는 상황에서는 사용하기 어렵습니다. 이런 상황일 때 분산락을 활용하여 해결할 수 있습니다. MySQL의 네임드락 대신에 SELECT FOR UPDATE을 활용할 수도 있습니다. 하지만 그런경우 timeout ..