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
)๋ก ๋ฌ์ผ ๋ค์์ ๋ถํฐ ์ญ์ ๊ฐ ๋๋๊ฒ
'์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ (3) (0) | 2025.03.15 |
---|---|
Kafka ? ์นดํ์นด๊ฐ ๋ญ๋ฐ.... (0) | 2025.03.15 |
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ (2) (0) | 2025.01.11 |
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ ๊ฐ์ (1) (0) | 2025.01.11 |
SimpleJdbcInsert ์ฌ์ฉ ์, ์๋ ์ปฌ๋ผ ๋ฌธ์ ๋ฐ์ (0) | 2024.04.11 |
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
)๋ก ๋ฌ์ผ ๋ค์์ ๋ถํฐ ์ญ์ ๊ฐ ๋๋๊ฒ
'์คํ๋ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ (3) (0) | 2025.03.15 |
---|---|
Kafka ? ์นดํ์นด๊ฐ ๋ญ๋ฐ.... (0) | 2025.03.15 |
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ (2) (0) | 2025.01.11 |
์คํ๋ง ๋๊ท๋ชจ์์คํ ์ค๊ณ ๊ฐ์ (1) (0) | 2025.01.11 |
SimpleJdbcInsert ์ฌ์ฉ ์, ์๋ ์ปฌ๋ผ ๋ฌธ์ ๋ฐ์ (0) | 2024.04.11 |