프로젝트/redis
-
[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 ..
-
공식문서로 알아보는 Redis persistence프로젝트/redis 2023. 9. 5. 00:01
개요 Redis는 In-memory 시스템으로 동작하지만 disk에 영구저장하는 기능도 지원합니다. 어떤 방식으로 저장하는지에 대해 Redis 공식문서를 기반으로 Redis Persistence에 대해 알아보고자 합니다. Redis는 어떻게 데이터를 disk에 저장할까? Persistence란 SSD와 같은 내구성 있는 스토리지에 데이터를 기록하는 것을 의미합니다. Redis는 이에 대해 다양한 방법론을 제시합니다. Redis DataBase(RDB) : 지정된 간격으로 데이터 집합의 특정 시점 스냅숏을 저장합니다. Append Only File(AOF) : 모든 write operation을 기록하고, 서버 시작 시 원래 데이터세트를 재구성할 수 있습니다. No Persistence : 지속성을 완전히..
-
공식문서로 알아보는 Redis Transaction프로젝트/redis 2023. 8. 30. 00:01
개요 redis에서 multi, exec, discard, watch 등의 command를 공부하다 보니 redis transaction이란 개념이 존재한다는 것을 알게 되었습니다. NoSQL은 트랜잭션이 없다고 알고 있었는데, 트랜잭션에 대한 니즈가 생기면서 RDBMS보다 약한 수준으로 지원한다고 합니다. Redis 공식문서를 기반으로 redis transaction에 대해 알아보고자 합니다. Redis Transaction이란? redis의 명령 중 MULTI, EXEC, DISCARD, WATCH를 활용하여 트랜잭션을 사용할 수 있습니다. Redis 2.2 버전 이상부터는 Redis의 트랜잭션은 2가지를 보장해 줍니다. 모든 명령이 serialized 되어 순차적으로 실행됩니다, 다른 클라이언트가 ..