์Šคํ”„๋ง

Redis ZSet(Sorted Set)

KIMHYEYUN 2025. 3. 16. 17:22
๋ฐ˜์‘ํ˜•

ZSet์€ ์ •๋ ฌ๋œ ์ˆœ์„œ๋กœ ์ €์žฅ๋˜๋Š” ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ
๊ฐ ์›์†Œ๋Š” ์ ์ˆ˜(Score) ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ์ •๋ ฌ

1. Redis Sorted Set(ZSet) ์ด๋ž€?

  • Key-Value ์ €์žฅ ๊ตฌ์กฐ์ง€๋งŒ, ๊ฐ Value์— Score(์ˆซ์ž)๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.
  • ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž๋™ ์ •๋ ฌ๋จ
  • ์ค‘๋ณต๋œ ๊ฐ’์€ ์ €์žฅ๋˜์ง€ ์•Š์œผ๋ฉฐ(Unique), Score๋Š” ์ค‘๋ณต ๊ฐ€๋Šฅ
  • ๋น ๋ฅธ ์กฐํšŒ ์†๋„(O(log N))๋กœ ๋žญํ‚น, ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ, TTL ๊ธฐ๋ฐ˜ ์บ์‹ฑ ๋“ฑ์— ์œ ์šฉํ•˜๋‹ค.

์ฃผ์š” ๋ช…๋ น์–ด

1. ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€(ZADD)

ZADD key score1 member1 [score2 member2 ... ]

2. ๋ฐ์ดํ„ฐ ์กฐํšŒ(ZRANGE, ZREVRANGE)

  • ์˜ค๋ฆ„์ฐจ์ˆœ ์กฐํšŒ(ZRANGE)
  • ๋‚ด๋ฆผ์ฐจ์ˆœ ์กฐํšŒ(ZREVRANGE)

3. ํŠน์ • ๊ฐ’์˜ ์ˆœ์œ„ ์กฐํšŒ

  • ์˜ค๋ฆ„์ฐจ์ˆœ ์ˆœ์œ„ ์กฐํšŒ(ZRANK)
  • ๋‚ด๋ฆผ์ฐจ์ˆœ ์ˆœ์œ„ ์กฐํšŒ(ZREVRANK)

4. ํŠน์ • ๊ฐ’์˜ ์ ์ˆ˜ ์กฐํšŒ

  • ZSCORE

๋‚ด ์‚ฌ๋ก€...

๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๊ฐ€ ๊ณ„์† ์•ˆ๋ผ์„œ.. ๋ญ๊ฐ€ ๋ฌธ์ œ์ง€.... ํ˜น์‹œ ttl์„ 3์ดˆ๋กœ ๋’€๋Š”๋ฐ ์ปดํ“จํ„ฐ๊ฐ€ ์„ฑ๋Šฅ์ด ์•ˆ์ข‹์•„์„œ ๋Œ์•„๊ฐ€๋Š”๋™์•ˆ ์ง€์›Œ์กŒ๋‚˜...
๊นŒ์ง€ ์ƒ๊ฐํ•จ ใ…‹ใ„ทใ…‹ใ„ท

public void add(Long articleId, LocalDateTime time, Long score, Long limit, Duration ttl) {
        redisTemplate.executePipelined((RedisCallback<?>)action -> {
            StringRedisConnection conn = (StringRedisConnection)action;
            String key = generateKey(time);
            conn.zAdd(key, score, String.valueOf(articleId));
            conn.zRemRange(key, 0, limit - 1);
            conn.expire(key, ttl.toSeconds());

            return null;
        });
    }

์ด ์ฝ”๋“œ์—์„œ ๋ด์•ผํ•˜๋Š” ๋ถ€๋ถ„์€ conn.zRemRange(key, 0, limit - 1);
์ด ๋ถ€๋ถ„์ด๋‹ค.

zRemRange๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ๋ฒ”์œ„์˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
์—ฌ๊ธฐ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” zRemRange(key, start, end) ์ด๋‹ค.

ZSet์€ ์˜ค๋ฆ„์ฐจ์ˆœ(๋‚ฎ์€ ์ ์ˆ˜ -> ๋†’์€ ์ ์ˆ˜)์œผ๋กœ ์ •๋ ฌ๋˜๋ฉฐ, ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

์ด ์ฝ”๋“œ์—์„œ ๋‚ด๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๊ฑฐ๋Š” ์ถ”๊ฐ€๋ฅผ ๋‹คํ•˜๊ณ ๋‚˜์„œ ์ ์ˆ˜๊ฐ€ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ limit ๊ฐœ๋งŒ ๋‚จ๊ธฐ๊ณ  ๋‚˜๋ฉฐ์ง€๋Š” ์‚ญ์ œํ•˜๋Š” ๊ฑฐ๋‹ค.
์ฆ‰, ๊ธฐ๋ณธ ์ •๋ ฌ ์ˆœ์„œ์™€ ๋ฐ˜๋Œ€๋กœ ๊ฐ„๋‹ค๋Š” ๊ฒƒ!! ๐Ÿ™

๊ทธ๋ž˜์„œ zRemRange(key, 0, limit-1)์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๊ทธ๋ƒฅ 0๋ถ€ํ„ฐ limit-1๋ฒˆ๊นŒ์ง€ ์‚ญ์ œํ•˜๊ฒŒ ๋˜๋Š”๊ฑฐ๋‹ค.
์—ญ์ˆœ์œผ๋กœ ๋’ค์—์„œ ๋ถ€ํ„ฐ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด end ๊ฐ’์„ ์Œ์ˆ˜(-limit-1)๋กœ ๋‘ฌ์•ผ ๋’ค์—์„œ ๋ถ€ํ„ฐ ์‚ญ์ œ๊ฐ€ ๋˜๋Š”๊ฒƒ

728x90
๋ฐ˜์‘ํ˜•