Redis ๊ธฐ๋ฐ˜์˜ ์บ์‹ฑ ๋ฐ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•œ ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค ์„ฑ๋Šฅ ๊ฐœ์„ 

2024. 11. 7. 21:33ยท๐Ÿ’ป ๊ฐœ๋ฐœ/๐Ÿ€ Spring

 

๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ์กฐํšŒ API ์ค‘ ์บ์‹ฑ์„ ์ ์šฉํ•  ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด ๋ณด๊ณ , ๊ธฐ์กด RDB์—์„œ ์ž‘๋™๋˜๊ณ  ์žˆ๋˜ ๋Œ€๊ธฐ์—ด ๋กœ์ง์„ Redis๋กœ ์ด๊ด€ํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ ์บ์‹ฑ ์ „ํ›„ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์–ผ๋งˆ๋‚˜ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜๋Š”์ง€๋„ ์ฒดํฌํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์บ์‹œ ์ ์šฉ ๊ธฐ์ค€

์šฐ์„  ์บ์‹œ๋ฅผ ์ ์šฉํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ธฐ์ค€์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1. ์กฐํšŒ ๋น„์šฉ์ด ๋†’์€์ง€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋น„์šฉ์ด ํฐ ๊ฒฝ์šฐ ์บ์‹ฑ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์กฐํšŒ๋˜๋Š”์ง€

๋ฐ˜๋ณต์ ์ธ ์š”์ฒญ์ด ๋งŽ์€ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

3. ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ์ด์Šˆ๊ฐ€ ์—†๋Š”์ง€

์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ์™€ ์›๋ณธ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์บ์‹œ๋ฅผ ์ ์ ˆํžˆ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์บ์‹ฑ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

์บ์‹œ ์ ์šฉ์„ ๊ณ ๋ คํ•  ๋•Œ๋Š” ์บ์‹œ ํžˆํŠธ์œจ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ๋†’์€ ํžˆํŠธ์œจ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์บ์‹ฑ ํšจ๊ณผ๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ , ์‹œ์Šคํ…œ์˜ ์‘๋‹ต ์†๋„๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์กฐํšŒ API ๋ณ„ ๋ถ„์„

ํ˜„์žฌ ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค์—๋Š” ๋‹ค์–‘ํ•œ ์กฐํšŒ API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ API์— ๋Œ€ํ•œ ๋ถ„์„๊ณผ ์บ์‹œ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. ์ฝ˜์„œํŠธ ์ •๋ณด ๋ฐ ๋‚ ์งœ ๋ชฉ๋ก ์กฐํšŒ API โœ…

ํŠน์ • ์ฝ˜์„œํŠธ์˜ ์ •๋ณด์™€ ์˜ˆ์•ฝ ๊ฐ€๋Šฅํ•œ ๋‚ ์งœ๋ฅผ ์กฐํšŒํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋น„์šฉ : ๋ฐ์ดํ„ฐ ์–‘์ด ํฌ๊ณ  ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์กฐํšŒ ๋น„์šฉ์ด ํฝ๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋นˆ๋„ : ์‚ฌ์šฉ์ž๋“ค์ด ์ฝ˜์„œํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ž์ฃผ ์š”์ฒญ๋˜๋Š” API์ž…๋‹ˆ๋‹ค.

  - ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ : ๋‚ ์งœ ์ •๋ณด๊ฐ€ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„ ์บ์‹ฑ ์ ์šฉ์ด ์ ๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ, ๋‚ ์งœ๋ณ„ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ ์ขŒ์„ ์ˆ˜๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ์Šค์ผ€์ค„๋ง ์ฃผ๊ธฐ์— ๋งž์ถฐ ์ •ํ•ฉ์„ฑ์„ ๋งž์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ๋Œ€๊ธฐ์—ด ์ƒํƒœ ์กฐํšŒ API โŒ

์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€๊ธฐ์—ด์—์„œ ๋ช‡ ๋ฒˆ์งธ์— ์œ„์น˜ํ•ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋น„์šฉ : ๋Œ€๊ธฐ์—ด ์ˆœ์œ„ ์ •๋ณด ์กฐํšŒ ์ž์ฒด๋Š” ๊ฐ€๋ฒผ์šฐ๋‚˜, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋นˆ๋„ : ๋Œ€๊ธฐ ์ค‘์ธ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์ฃผ ์กฐํšŒํ•˜์ง€๋งŒ, ํ•ญ์ƒ ์ตœ์‹  ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  - ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ : ์‹ค์‹œ๊ฐ„ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์—ฌ ์บ์‹ฑ์„ ์ ์šฉํ•  ๊ฒฝ์šฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

3. ์ขŒ์„ ์ƒํƒœ ์กฐํšŒ API โŒ

ํŠน์ • ์ฝ˜์„œํŠธ ๋‚ ์งœ์˜ ์ขŒ์„ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋น„์šฉ : ์ขŒ์„ ์ƒํƒœ๋Š” ๋ณต์žกํ•œ ์ •๋ณด์ด๋ฏ€๋กœ ์กฐํšŒ ๋น„์šฉ์ด ๋น„๊ต์  ํฝ๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋นˆ๋„ : ์ขŒ์„ ์ƒํƒœ๋Š” ์˜ˆ์•ฝ์ด ์ง„ํ–‰๋  ๋•Œ ์ž์ฃผ ์กฐํšŒ๋ฉ๋‹ˆ๋‹ค.

  - ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ : ์˜ˆ์•ฝ์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ•ฉ์„ฑ ์œ ์ง€๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

4. ์ž”์•ก ์กฐํšŒ API โŒ

ํŠน์ • ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์ž”์•ก์„ ์กฐํšŒํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋น„์šฉ : ์ž”์•ก ์กฐํšŒ ์ž์ฒด๋Š” ๊ฐ„๋‹จํ•˜์—ฌ ๋น„์šฉ์ด ํฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  - ์กฐํšŒ ๋นˆ๋„ : ์‚ฌ์šฉ์ž๊ฐ€ ์ถฉ์ „ ๋˜๋Š” ๊ฒฐ์ œ ์ „ํ›„๋กœ ์ž์‹ ์˜ ์ž”์•ก์„ ์ž์ฃผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  - ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ : ์ž”์•ก ์ •๋ณด๋Š” ์‹ค์‹œ๊ฐ„์„ฑ์ด ์š”๊ตฌ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ถฉ์ „/๊ฒฐ์ œ ์‹œ ์บ์‹œ๋ฅผ ์ ์ ˆํžˆ ๊ฐฑ์‹ ํ•œ๋‹ค๋ฉด ์บ์‹ฑ์„ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

์ด API ์ค‘, ์ฝ˜์„œํŠธ ์ •๋ณด ๋ฐ ๋‚ ์งœ ๋ชฉ๋ก ์กฐํšŒ๋Š” ๋ฐ์ดํ„ฐ ์–‘์ด ํฌ๊ณ  ๊ฐฑ์‹  ์ฃผ๊ธฐ๊ฐ€ ๋น„๊ต์  ๋А๋ฆฌ๋ฉฐ ๋™์ผํ•œ ์š”์ฒญ์ด ๋ฐ˜๋ณต๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹ฑ ์ ์šฉ์˜ ํ•„์š”์„ฑ์ด ํฌ๋‹ค๊ณ  ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด ๋Œ€๊ธฐ์—ด ์ƒํƒœ ์กฐํšŒ, ์ขŒ์„ ์ƒํƒœ ์กฐํšŒ๋Š” ์‹ค์‹œ๊ฐ„์„ฑ์„ ์š”๊ตฌํ•˜๊ณ  ์ž”์•ก ์กฐํšŒ๋Š” ๋น„์šฉ์ด ๋น„๊ต์  ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ์ ์šฉ ๋Œ€์ƒ์— ๋„ฃ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ๋Œ€๊ธฐ์—ด ์ƒํƒœ ์กฐํšŒ๋Š” Redis๋กœ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹ฑ์ด ์•„๋‹ˆ์–ด๋„ ๋น ๋ฅธ ์กฐํšŒ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์บ์‹œ ์ „ํ›„ ์„ฑ๋Šฅ ๋น„๊ต

์บ์‹œ ์ ์šฉ ์ „ํ›„์˜ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด Grafana์™€ k6๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ, ์บ์‹œ ์ ์šฉ ์ „์—๋Š” ํ‰๊ท  1.56, ์ตœ๋Œ€ 10์˜ ํ™œ์„ฑ ์ปค๋„ฅ์…˜์ด ์žˆ์—ˆ์ง€๋งŒ, ์บ์‹œ ์ ์šฉ ํ›„์—๋Š” ํ™œ์„ฑ ์ปค๋„ฅ์…˜์ด 0์œผ๋กœ ์ค„์–ด๋“ค์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์š”์ฒญ์ด ๊ฑฐ์˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋™์‹œ ์š”์ฒญ์ด ๋งŽ์„ ๋•Œ ํ’€ ์‚ฌ์ด์ฆˆ์˜ ํ•œ๊ณ„์— ๋„๋‹ฌํ•ด ๋Œ€๊ธฐ ์ปค๋„ฅ์…˜์ด ๋ฐœ์ƒํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋น„๊ตํ•ด, ์บ์‹œ ์ ์šฉ ํ›„์—๋Š” ๋Œ€๊ธฐ ์ปค๋„ฅ์…˜์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์บ์‹œ ์ ์šฉ ํ›„, ๋™์ผ ์‹œ๊ฐ„ ๋‚ด ์š”์ฒญ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ์†Œํญ ์ฆ๊ฐ€ํ–ˆ์œผ๋ฉฐ, ์„œ๋ฒ„์˜ ๋‹จ๊ฑด ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๋„ ์งง์•„์ง„ ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

์•„๋ž˜๋Š” ์ฃผ์š” ๊ฒฐ๊ณผ๋ฅผ ์š”์•ฝํ•œ ํ‘œ์™€ Grafana ๊ฒฐ๊ณผ ์บก์ณ์ž…๋‹ˆ๋‹ค.

 

ํ•ญ๋ชฉ ์บ์‹œ ์ ์šฉ ์ „ ์บ์‹œ ์ ์šฉ ํ›„
HikariCP ํ™œ์„ฑ ์ปค๋„ฅ์…˜ (ํ‰๊ท ) 1.56 0.0
HikariCP ํ™œ์„ฑ ์ปค๋„ฅ์…˜ (์ตœ๋Œ€) 10.0 0.0
HikariCP ๋Œ€๊ธฐ ์ปค๋„ฅ์…˜ (ํ‰๊ท ) 0.222 0.0
HikariCP ๋Œ€๊ธฐ ์ปค๋„ฅ์…˜ (์ตœ๋Œ€) 2.0 0.0
API ์š”์ฒญ ์ˆ˜ (ํ‰๊ท ) 183.0 198.0
API ์š”์ฒญ ์ˆ˜ (์ตœ๋Œ€) 453.0 486.0
HTTP ์š”์ฒญ ์ง€์† ์‹œ๊ฐ„ (ํ‰๊ท ) 14.1 13.08
HTTP ์š”์ฒญ ์ง€์† ์‹œ๊ฐ„ (์ตœ๋Œ€) 264.95 182.45

 

 

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ( ์บ์‹œ ์ ์šฉ ์ „ )

 

 

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ( ์บ์‹œ ์ ์šฉ ํ›„ )

 

์ด๋ฅผ ํ†ตํ•ด ์บ์‹ฑ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ์‘๋‹ต ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐ ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

๋Œ€๊ธฐ์—ด ๋กœ์ง์„ RDB์—์„œ Redis๋กœ ์ด๊ด€

๊ธฐ์กด์˜ ๋Œ€๊ธฐ์—ด ๋กœ์ง์€ RDB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ์„ ์š”๊ตฌํ•˜๋Š” ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋†’์€ ๋ถ€ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ๋Œ€๊ธฐ์—ด ๋กœ์ง์„ Redis๋กœ ์ด๊ด€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

Redis๋กœ ์ด๊ด€ํ•˜๋ฉด์„œ ActiveToken(์˜ˆ์•ฝ ๊ฐ€๋Šฅ ํ™œ์„ฑ ํ† ํฐ)๊ณผ WaitingToken(๋Œ€๊ธฐ ํ† ํฐ)์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐ ๋Œ€๊ธฐ/ํ™œ์„ฑ ํ† ํฐ์€ ์ฝ˜์„œํŠธ ์Šค์ผ€์ค„ ID๋ฅผ Key๋กœ ๊ฐ€์ง€๋Š” ZSet(Sorted Set)์œผ๋กœ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

์ด๋ฅผ ํ†ตํ•ด, WaitingToken์—์„œ๋Š” ZRANK ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ O(log(N)) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ์ˆœ์œ„๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ActiveToken์—์„œ๋Š” Score์— ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•˜์—ฌ ZREMRANGEBYSCORE ๋ช…๋ น์–ด๋กœ ๋งŒ๋ฃŒ๋œ ํ† ํฐ์„ ๋น ๋ฅด๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WaitingToken๊ณผ ActiveToken

 

๋˜ ๊ฐ ํ† ํฐ์„ ๋ณ„๋„์˜ Hash ๊ตฌ์กฐ๋กœ ์ €์žฅํ•˜์—ฌ, ํ† ํฐ์„ key๋กœ ์‚ฌ์šฉํ•˜๊ณ  value์—๋Š” ์Šค์ผ€์ค„ ID, ์ƒํƒœ๊ฐ’, ๋งŒ๋ฃŒ์ผ์ž๋ฅผ ์ €์žฅํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠน์ • ํ† ํฐ์— ๋Œ€ํ•œ ์กฐํšŒ ์‹œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ† ํฐ ๋ณ„ ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” Hash

 

 

์ฝ”๋“œ ๋ณ€๊ฒฝ์ ์œผ๋กœ๋Š” ๊ธฐ์กด JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ง์„ RedisTemplate๋ฅผ ์‚ฌ์šฉํ•œ ๋กœ์ง์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์œผ๋ฉฐ, ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๊ด€๋ฆฌ์™€ ์ƒํƒœ ๋ณ€๊ฒฝ ์—ญ์‹œ Redis๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜๋Š” ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ RedisTemplate์„ ์‚ฌ์šฉํ•˜์—ฌ Redis์— ์ €์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

@Repository
class WaitingQueueRedisRepository(
    private val redisTemplate: RedisTemplate<String, Any>,
) : WaitingQueueRepository {
    companion object {
        const val WAITING_TOKEN_PREFIX = "WaitingToken"
        const val ACTIVE_TOKEN_PREFIX = "ActiveToken"
        const val TOKEN_INFO_PREFIX = "TokenInfo"
    }

    override fun addWaitingQueue(waitingQueue: WaitingQueue): WaitingQueue {
        // 1. WaitingToken ์ €์žฅ
        redisTemplate.opsForZSet().add(
            "$WAITING_TOKEN_PREFIX:${waitingQueue.scheduleId}",
            waitingQueue.token,
            System.currentTimeMillis().toDouble(),
        )
        redisTemplate.expire("$WAITING_TOKEN_PREFIX:${waitingQueue.scheduleId}", Duration.ofHours(1))

        // 2. TokenInfo ์ €์žฅ
        val key = "$TOKEN_INFO_PREFIX:${waitingQueue.token}"
        val fields =
            mapOf(
                "scheduleId" to waitingQueue.scheduleId.toString(),
                "status" to waitingQueue.status.name,
            )
        redisTemplate.opsForHash<String, String>().putAll(key, fields)
        redisTemplate.expire(key, Duration.ofHours(1))
        return waitingQueue
    }
    
    /* ... */
}

 

 

 

 

๋งˆ์น˜๋ฉฐ

์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์กฐํšŒ API์— ์บ์‹ฑ์„ ์ ์šฉํ•˜๊ณ , ๋Œ€๊ธฐ์—ด ๋กœ์ง์„ Redis๋กœ ์ด๊ด€ํ•˜๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์บ์‹ฑ์„ ํ†ตํ•ด ๋ฐ˜๋ณต์ ์ธ ์กฐํšŒ ์š”์ฒญ์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ณ , Redis๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€๊ธฐ์—ด ๋กœ์ง์˜ ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ณผ์ •์„ ํ†ตํ•ด ์บ์‹ฑ์„ ์ ์šฉํ•˜๋Š” ๊ธฐ์ค€๊ณผ Redis๋ฅผ ํ™œ์šฉํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ํ† ๋Œ€๋กœ ์ถ”ํ›„์— ์‹ค๋ฌด์— ์ ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ’ป ๊ฐœ๋ฐœ > ๐Ÿ€ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์„œ๋น„์Šค ํ™•์žฅ์„ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ถ„๋ฆฌ์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„  (6) 2024.11.15
๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ (synchronized, reentrantLock)  (0) 2024.09.29
Spring Security ๋‚ด๋ถ€ ํ๋ฆ„ ์ดํ•ดํ•˜๊ธฐ  (0) 2024.02.13
์Šคํ”„๋ง ๋ถ€ํŠธ์— OpenAI Whisper API ์ ์šฉํ•˜๊ธฐ  (1) 2023.08.24
'๐Ÿ’ป ๊ฐœ๋ฐœ/๐Ÿ€ Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • ์„œ๋น„์Šค ํ™•์žฅ์„ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ถ„๋ฆฌ์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„
  • ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ (synchronized, reentrantLock)
  • Spring Security ๋‚ด๋ถ€ ํ๋ฆ„ ์ดํ•ดํ•˜๊ธฐ
  • ์Šคํ”„๋ง ๋ถ€ํŠธ์— OpenAI Whisper API ์ ์šฉํ•˜๊ธฐ
EastShine_
EastShine_
๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๋‚˜์˜ ๊ธฐ๋ก ๐Ÿ“
  • EastShine_
    ๊ฐœ๋ฐœ.LOG ๐Ÿ’ป
    EastShine_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • 07-09 18:50
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (27)
      • ๐Ÿ’ป ๊ฐœ๋ฐœ (21)
        • ๐Ÿ–ฅ๏ธ ์šด์˜์ฒด์ œ (3)
        • ๐ŸŒ ๋„คํŠธ์›Œํฌ (0)
        • ๐Ÿ’พ Database (3)
        • ๐ŸŽ› Java (0)
        • ๐Ÿ–ฒ Javascript (0)
        • ๐Ÿ€ Spring (5)
        • ๐ŸŽธ ETC (4)
        • ๐Ÿ“ˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (3)
        • ๐Ÿ“– TIL (Today I Learned) (3)
      • ๐Ÿ  ์ผ์ƒ (6)
        • ๐Ÿ““ ์ผ์ƒ ์ผ๊ธฐ (6)
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    Whisper API
    Python
    e-book pdf ์ถ”์ถœ
    e-book pdf ๋ณ€ํ™˜
    ํŠธ๋žœ์žญ์…˜ ๋ถ„๋ฆฌ
    ๋™์‹œ์„ฑ์ฒ˜๋ฆฌ
    ๋น„๊ด€์ ๋ฝ
    ๋Œ€๊ธฐ์—ด
    transactionaleventlistener
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๋ฐฑ์—”๋“œ
    spring
    6๊ธฐ
    ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค
    redis
    ๋‚™๊ด€์ ๋ฝ
    ์ฝ˜์„œํŠธ์˜ˆ์•ฝ์„œ๋น„์Šค
    ํšŒ๊ณ 
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.1
EastShine_
Redis ๊ธฐ๋ฐ˜์˜ ์บ์‹ฑ ๋ฐ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•œ ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค ์„ฑ๋Šฅ ๊ฐœ์„ 
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”