2023. 6. 17. 19:27ใ๐๊ธฐ๋ก
๊ฐ์
Redis ์ฌ์ฉํ ๋ ์ฝ์งํ ์ฐ ํ์ด๋ด ๋๋ค.
์ด ์ฝ์ง์ ์์ธ์ 2๊ฐ์ง ์ ๋๋ก ์ถ์ฝํ ์ ์๋๋ฐ, 1) Redis ๋ ์ฑ๊ธ์ค๋ ๋ ๊ตฌ์กฐ๋ ๊ฑธ ๊ฐ๊ณผํ ์ , 2) Redis์ scan ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฌ๋ฉด ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๋์ง ๊ฐ๊ณผํ ์ ์ ๋๋ค.
ํ๊ฒฝ
- Java 11
- Redis Reactive 2.7
Redis ์ ํน์ง
์ฐ์ Redis ๋ ์ฑ๊ธ์ค๋ ๋ ๊ตฌ์กฐ๋ก ์๋ํฉ๋๋ค. ์ฆ ํ๋ฒ์ ํ๋์ ์์ฒญ๋ง ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ง์ฝ ํ๋์ ์์ ์์ ๊ธด ์๊ฐ์ด ์์๋๋ฉด ๊ทธ ๋ค์ ์์ ์ blocking ๋์ด ์์คํ ์ ์ฒด์ ์ผ๋ก ์ฑ๋ฅ์ด ๋๋ ค์ง ์ ์์ต๋๋ค. ๋ณ๋ชฉ์ด ๋ฐ์ํ ์ ์๋ค๋ ์๋ฏธ์ฃ .
๊ทธ๋ผ Redis ์ ์ด๋ค ์์ ์ด ๊ธด ์๊ฐ์ ์์ํ๋ ๊ฑธ๊น์? ์๋ ์ด๋ฏธ์ง๋ฅผ ๋ณด์๋ฉด ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ ์ ์ฅ์์ธ Redis ๋ ๋น๊ต์ ๋น ๋ฅธ ์๋๋ฅผ ๋ผ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋น ๋ฅธ Redis ์ ์ฑ๋ฅ์ ๋ฎ์ถ ์ ์๋ ๋ช ๋ น์ด๊ฐ ๋ช๊ฐ์ง ์๋๋ฐ, ๋ํ์ ์ผ๋ก scan ์ด ์์ต๋๋ค. scan ๋ช ๋ น์ด๋ Redis์์ ํน์ ํจํด์ ๊ฐ๋ key๋ฅผ ๊ฒ์ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ ์ฝ๋๋ scan() ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด "KEY" ๋ผ๋ ํค๋ฅผ ๊ฒ์ํ๋ ๋ช ๋ น์ด์ ๋๋ค. ํด๋น ํค์ ํด๋น๋๋ ๊ฐ์ ์กฐํํ๋ ๊ฒ์ผ๋ก ์์ํ ์ ์์ต๋๋ค.
๋ณ๋ชฉ ๋ฐ์ ์ง์
public List<Object> sample() {
return redisOperations.opsForSet()
.scan("KEY")
.collectList()
.block();
}
ํ์ง๋ง Scan ๋ช ๋ น์ด๋ Redis ์ ์ฒด์ ํค ๊ฐ์ ํ๋์ฉ ์กฐํํ๋ฏ๋ก O(N) ์ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ ์ฑ๋ฅ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
์ฆ key-value ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ Redis ์ ์๊ฐ๋ณต์ก๋ O(1)์ด ์๋ O(N) ์ ์์ ์ ์ํํ๊ฒ ๋๋ ๊ฒ์ด์ฃ . Redis ์ ์ ์ฅ๋ key ์๊ฐ ์ ์ ๋ ๊ด์ฐฎ๊ฒ ์ง๋ง, ์ ์ฅ๋๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฐจ ๋์ด๋ ์๋ก ๋ถํ๊ฐ ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
์ด๋ด ๊ฒฝ์ฐ์ scan() ์ด ์๋ members() ๋ isMember() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ๋ณต์ก๋ O(1)๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค. members ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ ๋ฒ์ ์กฐํ๋ก ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๊ณ , ๋น ๋ฅธ ์๋๋ก ์กฐํ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ค์ ๋ก ํํฌ์ธํธ์์ ๋ณ๋ชฉ์ง์ ์ ์ดํด๋ณด๋, scan() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ถ๋ถ์์ ์๋ต ์๊ฐ์ด ๋น์ฝ์ ์ผ๋ก ์ค๋๊ฑธ๋ฆฐ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค ๐ฅฒ
๊ฐ์ ๋ ์ฝ๋
์ ์ฝ๋๋ ์๋์ฒ๋ผ ๋ฐ๊พธ์ด ๊ฐ์ ํ ์ ์์ต๋๋ค.
// old
public Set<Object> sample() {
return redisOperations.opsForSet()
.scan("KEY") // ๋ณ๋ชฉ ์ง์
.collectList()
.block();
}
// improved
public Set<Object> sample() {
return redisOperations.opsForSet()
.members("KEY")
.collect(Collectors.toSet())
.block();
}
์ฝ๋์ ์๊ฐ ์ธก์ ์ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
scan() ๊ณผ members() ๋ฉ์๋์ ์๊ฐ ์ฐจ์ด๊ฐ ๋ฌด๋ ค 20๋ฐฐ ๊ฐ๊น์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
Redis ์ ์ฑ๊ธ์ค๋ ๋ ํน์ฑ๊ณผ scan ๋ช ๋ น์ด๋ฅผ ๋ ๋ฆฌ๋ฉด O(N) ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฑธ๋ฆฌ๋ ์ ์ ์์ ์ฑ ์ฝ๋๋ฅผ ์์ฑํด ๋ฐ์ํ ๋ฌธ์ ์์ต๋๋ค. ํํฌ์ธํธ์์ ์ฑ๋ฅ ์ด์๋ฅผ ์๋ ค์ฃผ์ง ์์๋๋ผ๋ฉด ๋ชจ๋ฅด๊ณ ์ง๋์น ๋ปํ ๋ด์ฉ์ด์์ต๋๋ค.
์ฌ์ค ๋๋ฌด ๊ฐ๋จํ ๋ด์ฉ์ด๋ผ ๊ธ๋ก ์จ๋ ๋๋ ์ถ์์ง๋ง, ๋น์ฐํ ์ผ๋ ๊ฐ๊ณผํ ์ ์๋ค๋ ์ ์ ๋ฐ์ฑํ๊ธฐ ์ํด ์ผ์ต๋๋ค. ๊ฒฐ๋ก ์ ์ ๋๋ก ์๊ณ ์ฐ์!
'๐๊ธฐ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
9์๊น์ง ์งค๋งํ ๊ณํ (3) | 2023.07.17 |
---|---|
๊ธ๋ 8๊ธฐ ๋ง๋ฌด๋ฆฌ ๋ฐ ํ๊ณ (2) | 2023.07.16 |
OpenAI๋ก ์๋น์ค ์ฌ์ฉ์ฑ ๊ฐ์ ํ๊ธฐ (0) | 2023.05.29 |
ํ๋ก๋ฉํ ์ฐ์ค ์ค์น ์ฝ์ง (0) | 2023.05.21 |
๋์ปค์์ Redis ์ฌ์ฉํ ๋ ์ํ์ฐฉ์ค 3๊ฐ์ง (0) | 2023.04.02 |