๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Redis

RedisTemplate ๋‚ด๋ถ€ ํƒ๊ตฌ: Spring Data Redis๋Š” Lettuce๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”์ƒํ™”ํ–ˆ๋Š”๊ฐ€?

Lettuce ๊ฐ€ ๋ฌด์—‡์ธ์ง€, Spring Data Redis์˜ RedisTemplate ์€ Lettuce ๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”์ƒํ™”ํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

๋จผ์ €, Spring Data Redis ๋Š” Lettuce์™€ Jedis ๋ผ๋Š” 2๊ฐœ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ์™€ ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Spring Data Redis integrates with Lettuce and Jedis, two popular open-source Java libraries for Redis.

 

Lettuce์™€ Jedis๋Š” "Java์—์„œ Redis์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ๊ฐ ๋ฌด์—‡์ธ์ง€ Lettuce๋ถ€ํ„ฐ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Lettuce ๋ž€?

Lettuce is a scalable thread-safe Redis client for synchronous, asynchronous and reactive usage. Multiple threads may share one connection if they avoid blocking and transactional operations such as BLPOP and MULTI/EXEC. Lettuce is built with netty. 
  • Lettuce ๋Š” ๋™๊ธฐ(Synchronous), ๋น„๋™๊ธฐ(Asynchronous), ๋ฆฌ์•กํ‹ฐ๋ธŒ(Reactive) ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋ฉฐ, Thread-Safe ํ•ฉ๋‹ˆ๋‹ค.
  • BLPOP, MULTI/EXEC๊ณผ ๊ฐ™์€ ๋ธ”๋กœํ‚น(Blocking) ๋ฐ ํŠธ๋žœ์žญ์…˜ ๋ช…๋ น์–ด๋ฅผ ํ”ผํ•˜๋Š” ๊ฒฝ์šฐ, 1๊ฐœ์˜ Native Connection(StatefulRedisConnection)์„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Lettuce ๋Š” Netty (๋น„๋™๊ธฐ I/O ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.

Spring Data Redis ์—์„œ Lettuce ์‚ฌ์šฉ ๋ฐฉ์‹

Spring Boot์—์„œ Spring Data Redis ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ Jedis๊ฐ€ ์•„๋‹Œ Lettuce๊ฐ€ ์ž๋™ ๊ตฌ์„ฑ(auto configuration)๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

auto configure๋œ Lettuce ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 

์ด ์˜์กด์„ฑ์ด ์ถ”๊ฐ€๋˜๋ฉด Lettuce ๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Spring Data Redis๊ฐ€ LettuceConnectionFactory์™€ LettuceConnection์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.(Redis Config ํ•  ๋•Œ, ์ž์ฃผ ๋ณด๋˜ ์• ๋“ค์ž…๋‹ˆ๋‹ค)

Spring Data Redis์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ์—์„œ๋Š” RedisConnection ์˜ ๊ตฌํ˜„์ฒด๋Š” LettuceConnection ์ด๋ฉฐ, ํŽธ์˜์ƒ LettuceConnection ์ด๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด Spring ์€ LettuceConnectionFactory ์™€ LettuceConnection, Lettuce ๋Š” Native Connection ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์ฃผ์„ธ์š”.

 

LettuceConnectionFactory์˜ ๊ธฐ๋ณธ ๋™์ž‘

LettuceConnectionFactory์˜ Javadoc์„ ๋ณด๋ฉด, ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ LettuceConnection์€ ํ•˜๋‚˜์˜ Native Connection์„ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, Blocking ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋ฉด Native Connection์ด ๋ง‰ํžˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.  

While multiple LettuceConnections share a single thread-safe native connection by default

 

๋งŒ์•ฝ BLPOP๊ณผ ๊ฐ™์€ Blocking ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋ฉด, LettuceConnectionFactory.setShareNativeConnection(false)๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ, LettuceConnection ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๋•Œ๋งˆ๋‹ค TCP ์†Œ์ผ“์ด ์—ด๋ฆฌ๊ณ  ๋‹ซํžˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

LettuceConnectionFactory.setShareNativeConnection( ) ์˜ Javadoc

LettuceConnection ์ƒ์„ฑ ๋ฐฉ์‹๊ณผ RedisTemplate ์˜ ์—ญํ• 

LettuceConnection(RedisConnection) ๋Š” Thread-safe ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰, LettuceConnection์„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•˜๋ฉด ์•ˆ ๋˜๋ฏ€๋กœ, ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

RedisConnection classes are not Thread-safe. Spring Data Redis’s LettuceConnection class itself is not. Therefore, you should not share instances of a RedisConnection across multiple Threads.

 

์ด ์—ญํ• ์„ RedisTemplate์ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

RedisTemplate์€ Redis๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ๋งˆ๋‹ค ์ƒˆ๋กœ์šด LettuceConnection์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

RedisTemplate์˜ Connection ํš๋“ ๊ณผ์ •

RedisTemplate์€ execute() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Redis์™€ ํ†ต์‹ ํ•˜๋ฉฐ, ์ด๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ RedisConnectionUtils.getConnection()์„ ํ˜ธ์ถœํ•˜์—ฌ Connection์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

RedisTemplate.execute( ) → getConnection( )

 

RedisConnectionUtils.getConnection ์„ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋‹ค ๋ณด๋ฉด doGetConnection ๋ฉ”์„œ๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , doGetConnection ์˜ fetchConnection ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

RedisConnectionUtils.doGetConnection( ) → fetchConnection( )

 

fetchConnection ์—๋Š” factory.getConnection( )์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” RedisConnectionFactory์˜ getConnection() ๋กœ, ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค LettuceConnection ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

RedisConnectionUtils.fetchConnection( ) → RedisConnectionFactory.getConnection()

 

์ด๋Ÿฌํ•œ ๋™์ž‘ ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด RedisTemplate์€ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด LettuceConnection์„ ํš๋“ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, RedisTemplate์€ Bean์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด LettuceConnection ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ , ์ƒ์„ฑ๋œ LettuceConnection๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” Native Connection์€ ์žฌํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์‹คํ—˜ 1. LettuceConnection์€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ

@DataRedisTest
public class RedisConnectionTest {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @DisplayName("RedisTemplate์—์„œ Lettuce Connection์€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.")
    @Test
    void test() {
        // given
        RedisConnectionFactory connectionFactory = redisTemplate.getConnectionFactory();

        RedisConnection connection1 = connectionFactory.getConnection();
        System.out.println("์ฒซ ๋ฒˆ์งธ Connection: " + connection1);

        RedisConnection connection2 = connectionFactory.getConnection();
        System.out.println("๋‘ ๋ฒˆ์งธ Connection: " + connection2);

        // when then
        System.out.println("๊ฐ™์€ LettuceConnection์ธ๊ฐ€? " + (connection1 == connection2));
        Assertions.assertThat(connection1).isNotSameAs(connection2);
    }
}

 

์‹คํ—˜ ๊ฒฐ๊ณผ - false

์ฒซ ๋ฒˆ์งธ Connection: org.springframework.data.redis.connection.lettuce.LettuceConnection@37fca349
๋‘ ๋ฒˆ์งธ Connection: org.springframework.data.redis.connection.lettuce.LettuceConnection@86377d5
๊ฐ™์€ LettuceConnection์ธ๊ฐ€? false

 

์‹คํ—˜ 2. Native Connection์€ ์žฌ์‚ฌ์šฉ๋จ

 

@DisplayName("RedisTemplate์—์„œ Native Connection์€ ์žฌ์‚ฌ์šฉ๋œ๋‹ค.")
@Test
void test1() {
    // given
    RedisConnectionFactory connectionFactory = redisTemplate.getConnectionFactory();

    Object nativeConnection1 = connectionFactory.getConnection().getNativeConnection();
    System.out.println("์ฒซ ๋ฒˆ์งธ Native Connection: " + nativeConnection1);

    Object nativeConnection2 = connectionFactory.getConnection().getNativeConnection();
    System.out.println("๋‘ ๋ฒˆ์งธ Native Connection: " + nativeConnection2);

    // when then
    System.out.println("๊ฐ™์€ Native Connection์ธ๊ฐ€? " + (nativeConnection1 == nativeConnection2));
    Assertions.assertThat(nativeConnection1).isSameAs(nativeConnection2);
}

 

์‹คํ—˜ ๊ฒฐ๊ณผ - true

 

์ฒซ ๋ฒˆ์งธ Native Connection: io.lettuce.core.RedisAsyncCommandsImpl@37fca349
๋‘ ๋ฒˆ์งธ Native Connection: io.lettuce.core.RedisAsyncCommandsImpl@37fca349
๊ฐ™์€ Native Connection์ธ๊ฐ€? true

 

Lettuce ๋Š” ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค

Lettuce์—์„œ ๋‹จ์ผ Native Connection์„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค์—์„œ ๊ณต์œ ํ•˜๋ฉด,

  • Spring์—์„œ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ LettuceConnection์ด ํ•˜๋‚˜์˜ Native Connection์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค

ํŠธ๋žœ์žญ์…˜ ์—ฐ์‚ฐ ์‹œ ์™ธ๋ถ€์—์„œ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Spring ์—์„œ ํŠธ๋žœ์žญ์…˜ ๋ช…๋ น์–ด์ธ MULTI ๋ฅผ Redis์—๊ฒŒ ๋ณด๋‚ผ ๊ฒฝ์šฐ, Spring์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์œ„ํ•ด ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
Transactional use requires external synchronization when a single connection is used by multiple threads/processes.
์ถœ์ฒ˜ - https://github.com/redis/lettuce/wiki/Transactions

 

Spring์˜ Redis ํŠธ๋žœ์žญ์…˜ ์ง€์›

RedisTemplate์˜ setEnableTransactionSupport(true) ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, Spring์˜ ํŠธ๋žœ์žญ์…˜์— RedisTemplate์ด ์ฐธ์—ฌํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RedisTemplate ์— setEnableTransactionSupport ๋ฉ”์„œ๋“œ

 

ํŠธ๋žœ์žญ์…˜ ์ง€์›์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด, ํ•˜๋‚˜์˜ LettuceConnection๋งŒ ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์— ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ,
์ด๋Š” ThreadLocal์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ฆฌ๋˜์–ด ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋™์ผํ•œ LettuceConnection์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

"Enabling transaction support binds RedisConnection to the current transaction backed by a ThreadLocal"

 

๊ทธ๋ฆฌ๊ณ , Spring์—์„œ Redis ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ 3๊ฐ€์ง€๋ฅผ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Spring ์ปจํ…์ŠคํŠธ์—์„œ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ํ™œ์„ฑํ™” (@EnableTransactionManagement ์ถ”๊ฐ€)
  • RedisTemplate์ด ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•˜๋„๋ก ์„ค์ • (setEnableTransactionSupport(true))
  • ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ PlatformTransactionManager ๋“ฑ๋ก
    • Spring Data Redis ์ž์ฒด์ ์œผ๋กœ PlatformTransactionManager ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Œ
    • JDBC ๊ธฐ๋ฐ˜์˜ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ Redis ํŠธ๋žœ์žญ์…˜์„ ํ•จ๊ป˜ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

ํ•˜์ง€๋งŒ, Spring Boot ์—์„œ๋Š” RedisTemplate ์— setEnableTransactionSupport(true) ์„ค์ •๋งŒ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

@EnableTransactionManagement ์™€ PlatformTransactionManager ๋“ฑ๋ก์€ spring-data* ์˜์กด์„ฑ์ด ์žˆ๋‹ค๋ฉด(redis ์ œ์™ธ), 'TransactionAutoConfiguration.class' ์— ์˜ํ•ด Spring Boot์—์„œ ์ž๋™ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ - @EnableTransactionManagement in Spring Boot ์˜ 3๋ฒˆ์งธ ๋‹ต๋ณ€์„ ๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

Spring Data Redis์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ช…๋ น ๊ตฌ๋ถ„

Spring Data Redis๋Š” ์ง„ํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์ฝ๊ธฐ(Read) ๋ช…๋ น๊ณผ ์“ฐ๊ธฐ(Write) ๋ช…๋ น์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ๊ธฐ ๋ช…๋ น(์˜ˆ: KEYS)์€ ์ƒˆ๋กœ์šด(non-thread-bound) RedisConnection์„ ํ†ตํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ์—๋„ ์ฝ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
  • ์“ฐ๊ธฐ ๋ช…๋ น(์˜ˆ: SET)์€ RedisTemplate์—์„œ ํ์— ์ €์žฅ๋˜์—ˆ๋‹ค๊ฐ€ ํŠธ๋žœ์žญ์…˜์ด ์ปค๋ฐ‹๋  ๋•Œ ํ•œ๊บผ๋ฒˆ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Transaction ๊ด€๋ จ Code ๋Š” Spring Data Redis - Redis Transactions ์ฐธ๊ณ  ํ•ด์ฃผ์„ธ์š”.

 

Lettuce์™€ Jedis ๋น„๊ต

Lettuce๋Š” ์ด์™ธ์—๋„ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” Pub/Sub ๊ธฐ๋Šฅ, Reactive API, ๋น„๋™๊ธฐ API๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, Redis Replication, Sentinel, Cluster ๊ธฐ๋Šฅ๋“ค๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

* replication, sentinel, cluster ๋Š” Redis ์•„ํ‚คํ…์ฒ˜์ด๋ฉฐ, ์ €๋„ ํ•™์Šตํ•ด์•ผํ•  ๋‚ด์šฉ์ด๋ผ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆด ์ˆ˜ ์—†์ง€๋งŒ, ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด '[Youtube] Redis ์•ผ๋ฌด์ง€๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ' ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ฐ˜๋ฉด Jedis๋Š” ๋™๊ธฐI/O ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๋™๊ธฐ I/O์ธ Lettuce๋ณด๋‹ค ๋Š๋ฆฌ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ์š”. ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ„์˜ ์„ฑ๋Šฅ์„ ์‹คํ—˜ํ•œ ๊ธ€์ธ 'Jedis ๋ณด๋‹ค Lettuce ๋ฅผ ์“ฐ์ž' ์—์„œ๋„ ๋งŽ์€ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋ณด์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, Lettuce๋Š” ๋น„๋™๊ธฐI/O์ธ ๋งŒํผ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๋””๋ฒ„๊น…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ , Jedis๋ณด๋‹ค ์ฝ์–ด์•ผ ํ•œ ๋‚ด๋ถ€ ์ฝ”๋“œ๋„ ๋” ๋งŽ์„ ๊ฒƒ์ด๊ตฌ์š”.

๊ฒฐ๋ก 

    • Spring Boot ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ LettuceConnectionFactory๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ LettuceConnection์ด ํ•˜๋‚˜์˜ Native Connection์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์ด ๊ธฐ๋ณธ ์„ค์ •
    • Lettuce๋Š”  Pub/Sub ๊ธฐ๋Šฅ, Reactive API, ๋น„๋™๊ธฐ API, ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•œ Redis Replication, Sentinel, Cluster ๊ธฐ๋Šฅ๋“ค๋„ ์ง€์›
    • ์„ค์ •์„ ํ†ตํ•ด Redis์˜ ๋ช…๋ น์–ด๋“ค์„ Spring Boot์—์„œ ์›์ž์ ์ด๊ฒŒ ์‹คํ–‰๋˜๋„๋ก ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • RedisTemplate์€ Bean์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ๋กœ์šด LettuceConnection ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ƒ์„ฑ๋œ LettuceConnection๋“ค์ด ์‚ฌ์šฉํ•˜๋Š” Native Connection์€ ์žฌํ™œ์šฉ๋œ๋‹ค.

๋งˆ์น˜๋ฉฐ

์บ์‹ฑ ์ „๋žต์„ ๊ณต๋ถ€ํ•˜๋ ค๋‹ค Redis ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ดํŽด๋ณด๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๋•๋ถ„์— RedisTemplate์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๊ทธ ๋™์ž‘ ๋ฐฉ์‹๊นŒ์ง€ ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ณผ๊ฑฐ์— Spring Data JPA๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ JPA ์ž์ฒด๋ฅผ ๋จผ์ € ์ดํ•ดํ•ด์•ผ Data JPA๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ์ด๋ฒˆ์—๋„ Spring Data Redis๊ฐ€ Lettuce๋ฅผ ์–ผ๋งˆ๋‚˜ ์ถ”์ƒํ™”ํ–ˆ๋Š”์ง€, RedisTemplate ์„ ํ†ตํ•ด ์•Œ๊ฒŒ ๋˜๋Š” ์ข‹์€ ๊ธฐํšŒ์˜€์Šต๋‹ˆ๋‹ค.

 


์ฐธ๊ณ  ๋ฌธ์„œ

Spring Data Redis - RedisTemplate

Spring Data Redis - Drivers

Jedis vs. Lettuce: An Exploration

Spring Data Redis - Redis Transactions

Jedis Github

Lettuce Github 

Spring data redis(lettuce connector) ์“ฐ๊ธฐ ์ „์— ์•Œ์•˜๋‹ค๋ฉด ์ข‹์•˜์„ ๊ฒƒ๋“ค

Redis Docs - Transactions