๐Ÿ”’ Redisson ๋ถ„์‚ฐ๋ฝ ๋„์ž… ํ•ด๋ณด๊ธฐ

๊น€์ •๊ทœยท2025๋…„ 8์›” 4์ผ

"๋ถ„์‚ฐ๋ฝ์ด ํ•„์š”ํ•œ ์ด์œ ๊ฐ€ ๋ญ”๊ฐ€์š”? Redis์™€ Redisson์˜ ์ฐจ์ด์ ์€?"

๐ŸŽฏ ์™œ Redisson์„ ๋„์ž…ํ–ˆ์„๊นŒ?

๊ธฐ์กด ์ƒํ™ฉ

  • Redis Template: ๋‹จ์ˆœํ•œ ์บ์‹ฑ๊ณผ ์„ธ์…˜ ๊ด€๋ฆฌ์— ์‚ฌ์šฉ
  • ๋™์‹œ์„ฑ ๋ฌธ์ œ: ํฌ์ธํŠธ ์ง€๊ธ‰, ์ถœ์„์ฒดํฌ ๋“ฑ์—์„œ Race Condition ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ๊ธฐ์ˆ ๋ฉด์ ‘ ๋Œ€๋น„: ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ์˜ ๋™์‹œ์„ฑ ์ œ์–ด์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด ํ•„์š”

๐Ÿ—๏ธ ๊ตฌํ˜„ ๊ณผ์ •์—์„œ ๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค

1๋‹จ๊ณ„: ๊ธฐ๋ณธ ๊ตฌ์กฐ ์„ค๊ณ„

@Service
public class RedissonCacheService {
    private final RedissonClient redissonClient;
    
    // ๊ธฐ๋ณธ์ ์ธ ์บ์‹œ ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ์‹œ์ž‘
    public <T> void set(String key, T value, Duration ttl) {
        RBucket<T> bucket = redissonClient.getBucket(key);
        bucket.set(value, ttl.toSeconds(), TimeUnit.SECONDS);
    }
}

2๋‹จ๊ณ„: ๋ถ„์‚ฐ ๋งต ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ์ฒซ ๋ฒˆ์งธ ์‹ค์ˆ˜

// โŒ ์ฒ˜์Œ ์‹œ๋„: RMap ์‚ฌ์šฉ
public <K, V> void putToMap(String mapName, K key, V value, Duration ttl) {
    RMap<K, V> map = redissonClient.getMap(mapName);
    map.put(key, value, ttl.toSeconds(), TimeUnit.SECONDS); // ์ปดํŒŒ์ผ ์—๋Ÿฌ!
}

๋ฌธ์ œ์ : RMap์€ ๊ฐœ๋ณ„ ํ‚ค์— TTL์„ ์„ค์ •ํ•  ์ˆ˜ ์—†์Œ

3๋‹จ๊ณ„: RMapCache๋กœ ํ•ด๊ฒฐ

// โœ… ํ•ด๊ฒฐ: RMapCache ์‚ฌ์šฉ
public <K, V> void putToMap(String mapName, K key, V value, Duration ttl) {
    RMapCache<K, V> map = redissonClient.getMapCache(mapName);
    map.put(key, value, ttl.toSeconds(), TimeUnit.SECONDS); // ์„ฑ๊ณต!
}

๐Ÿค” ๊ฐœ๋ฐœ ์ค‘ ๊ณ ๋ฏผํ–ˆ๋˜ ํฌ์ธํŠธ๋“ค

1. "์ธ์ˆ˜๊ฐ€ 2๊ฐœ์—ฌ์•ผ ํ•˜๋Š”๋ฐ 4๊ฐœ๋กœ ์ž…๋ ฅ๋˜์–ด ์žˆ์–ด?"

// ๊ณ ๋ฏผ: TTL ์—†๋Š” ๋ฒ„์ „ vs TTL ์žˆ๋Š” ๋ฒ„์ „
putToMap(mapName, key, value)           // 2๊ฐœ ์ธ์ˆ˜
putToMap(mapName, key, value, ttl)      // 4๊ฐœ ์ธ์ˆ˜

๊ฒฐ๋ก : ๋ถ„์‚ฐ๋ฝ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด TTL ํฌํ•จ ๋ฒ„์ „ ์„ ํƒ

  • ์ž๋™ ๋งŒ๋ฃŒ๋กœ ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ ํ™•๋ณด
  • ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ

2. RMap vs RMapCache ์„ ํƒ

๊ตฌ๋ถ„RMapRMapCache
๊ฐœ๋ณ„ ํ‚ค TTLโŒโœ…
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ๋ณดํ†ต๋†’์Œ
๋ถ„์‚ฐ๋ฝ ์ ํ•ฉ์„ฑ๋‚ฎ์Œ๋†’์Œ

๐Ÿงน ์ฝ”๋“œ ์ •๋ฆฌ ๊ณผ์ •

๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ

// ์ œ๊ฑฐ๋œ ์ฝ”๋“œ๋“ค
- RMap import ๋ฐ getMap() ๋ฉ”์„œ๋“œ (RMapCache๋งŒ ์‚ฌ์šฉ)
- get() ๋ฉ”์„œ๋“œ์˜ Class<T> type ํŒŒ๋ผ๋ฏธํ„ฐ (๋ฏธ์‚ฌ์šฉ)

์ตœ์ข… ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • RBucket: ๋‹จ์ˆœ ํ‚ค-๊ฐ’ ์ €์žฅ (TTL ์ง€์›)
  • RMapCache: ๋ถ„์‚ฐ ๋งต ์ €์žฅ (๊ฐœ๋ณ„ ํ‚ค TTL ์ง€์›)

๐ŸŽฏ ๊ฒฐ๋ก 

Q: Redis์™€ Redisson์˜ ์ฐจ์ด์ ์€?

A: Redis๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๊ณ , Redisson์€ Redis ๊ธฐ๋ฐ˜์˜ 
   Java ๋ถ„์‚ฐ ๊ฐ์ฒด ๋ฐ ์„œ๋น„์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
   
   - Redis Template: ๋‹จ์ˆœํ•œ ํ‚ค-๊ฐ’ ์กฐ์ž‘
   - Redisson: ๋ถ„์‚ฐ๋ฝ, ๋ถ„์‚ฐ ์ปฌ๋ ‰์…˜ ๋“ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์ œ๊ณต

Q: ๋ถ„์‚ฐ๋ฝ์ด ์™œ ํ•„์š”ํ•œ๊ฐ€์š”?

A: ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
   
   ์˜ˆ์‹œ: ํฌ์ธํŠธ ์ง€๊ธ‰ ์‹œ์Šคํ…œ
   - ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ
   - ์ค‘๋ณต ์ง€๊ธ‰ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋ฝ ํ•„์š”
   - TTL๋กœ ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€

Q: RMap๊ณผ RMapCache์˜ ์ฐจ์ด์ ์€?

A: ๊ฐœ๋ณ„ ํ‚ค TTL ์ง€์› ์—ฌ๋ถ€๊ฐ€ ํ•ต์‹ฌ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.
   
   - RMap: ๋งต ์ „์ฒด์—๋งŒ TTL ์„ค์ • ๊ฐ€๋Šฅ
   - RMapCache: ๊ฐœ๋ณ„ ํ‚ค๋งˆ๋‹ค ๋‹ค๋ฅธ TTL ์„ค์ • ๊ฐ€๋Šฅ
   - ๋ถ„์‚ฐ๋ฝ์—์„œ๋Š” RMapCache๊ฐ€ ๋” ์ ํ•ฉ

๐Ÿ“ˆ ๋„์ž… ํšจ๊ณผ

๊ธฐ์ˆ ์  ํšจ๊ณผ

  • ๋™์‹œ์„ฑ ์ œ์–ด: Race Condition ๋ฐฉ์ง€
  • ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ: TTL ๊ธฐ๋ฐ˜ ์ž๋™ ์ •๋ฆฌ
  • ํ™•์žฅ์„ฑ: ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์•ˆ์ •์„ฑ ํ™•๋ณด

ํ•™์Šต ํšจ๊ณผ

  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ดํ•ด๋„ ํ–ฅ์ƒ
  • ๋™์‹œ์„ฑ ์ œ์–ด ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ•™์Šต
  • ๊ธฐ์ˆ ๋ฉด์ ‘ ๋Œ€๋น„ ์‹ค๋ฌด ๊ฒฝํ—˜ ์ถ•์ 

๐Ÿ”ฎ ํ–ฅํ›„ ํ™œ์šฉ ๊ณ„ํš

์ ์šฉ ์˜ˆ์ • ๋„๋ฉ”์ธ

  1. ํฌ์ธํŠธ ์‹œ์Šคํ…œ: ์ค‘๋ณต ์ง€๊ธ‰ ๋ฐฉ์ง€
  2. ์ถœ์„์ฒดํฌ: ๋™์‹œ ์š”์ฒญ ์ œ์–ด
  3. ๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š”: ์ค‘๋ณต ํด๋ฆญ ๋ฐฉ์ง€
  4. ์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ: ๋™์‹œ ์ ‘์† ์ œ์–ด

์ถ”๊ฐ€ ํ•™์Šต ๊ณ„ํš

  • ๋ถ„์‚ฐ๋ฝ ํŒจํ„ด ์‹ฌํ™” ํ•™์Šต
  • ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋ฐ ์ตœ์ ํ™”
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋žŒ ์‹œ์Šคํ…œ ๊ตฌ์ถ•

๐Ÿ’ก ํšŒ๊ณ 

์ž˜ํ•œ ์ 

  • ์‹ค๋ฌด ์ค‘์‹ฌ ์ ‘๊ทผ: ์™œ ๋„์ž…ํ•˜์˜€๋Š”์ง€ ๋ช…ํ™•ํ•œ ๋ชฉํ‘œ์ œ์‹œ
  • ์ ์ง„์  ๊ฐœ์„ : ๋ฌธ์ œ ๋ฐœ๊ฒฌ โ†’ ํ•ด๊ฒฐ โ†’ ์ •๋ฆฌ์˜ ์ฒด๊ณ„์  ๊ณผ์ •
  • ์ฝ”๋“œ ํ’ˆ์งˆ: ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ๋กœ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

์•„์‰ฌ์šด ์ 

  • ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋ถ€์กฑ: ์‹ค์ œ ๋ถ€ํ•˜ ์ƒํ™ฉ์—์„œ์˜ ๊ฒ€์ฆ ํ•„์š”
  • ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฏธ๋น„: ๋ถ„์‚ฐ๋ฝ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ์„ฑ๋Šฅ ์ง€ํ‘œ ์ˆ˜์ง‘ ํ•„์š”

๋‹ค์Œ ๋‹จ๊ณ„

  • ์‹ค์ œ ๋„๋ฉ”์ธ ์ ์šฉ: ํฌ์ธํŠธ ์‹œ์Šคํ…œ์— ๋ถ„์‚ฐ๋ฝ ์ ์šฉ
  • ์„ฑ๋Šฅ ์ธก์ •: ๋ฝ ํš๋“/ํ•ด์ œ ์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ์žฅ์•  ์‹œ๋‚˜๋ฆฌ์˜ค: ๋ฝ ํƒ€์ž„์•„์›ƒ, ๋„คํŠธ์›Œํฌ ๋ถ„ํ•  ๋“ฑ ๋Œ€์‘ ๋ฐฉ์•ˆ ์ˆ˜๋ฆฝ

๐ŸŽฏ ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€

๊ธฐ์ˆ ๋ฉด์ ‘ ๋Œ€๋น„๋ฅผ ์œ„ํ•ด ์‹œ์ž‘ํ•œ Redisson ๋„์ž…์ด ์‹ค์ œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๋™์‹œ์„ฑ ์ œ์–ด์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ  ์Šคํƒ ์ถ”๊ฐ€๊ฐ€ ์•„๋‹Œ, ์‹ค๋ฌด์—์„œ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋“ค์„ ๋ฏธ๋ฆฌ ๊ฒฝํ—˜ํ•˜๊ณ  ํ•ด๊ฒฐ์ฑ…์„ ์ค€๋น„ํ•˜๋Š” ๊ณผ์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค.

profile
๊ธฐํš๊ณผ ์„ค๊ณ„ ๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„๊นŒ์ง€ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€