Skip to content

Latest commit

ย 

History

History
129 lines (89 loc) ยท 6 KB

File metadata and controls

129 lines (89 loc) ยท 6 KB

ranked

ranked๋Š” redis์˜ sorted map์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, periodic(daily, weekly, monthly, alltime etc..)ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š”๋ฐ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋‹ค.

ranked์˜ ํ•„์š”์„ฑ

๊ธฐ์กด redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ expired zadd๋‚˜ expired zincrby๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„  redis์˜ setex์™€ psubscribe __keyevent::expired๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์˜ ์ž์ฒด ํƒ€์ด๋จธ(cron) ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค. ์ด๋Š” statelessํ•˜๊ฒŒ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ์š”์ธ์ด ๋˜์—ˆ์œผ๋ฉฐ, expired๋ฅผ ์œ„ํ•œ ๋ถ€๊ฐ€์ ์ธ ์—ฐ์‚ฐ์ด ์ถ”๊ฐ€๋กœ ์†Œ์š”๋˜์—ˆ๋‹ค. ranked๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ stateful ๋…ธ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์„œ๋ฒ„์˜ ๋…๋ฆฝ์„ฑ์„ ๋†’์ด๋Š” ํ”„๋กœ์ ํŠธ๋‹ค. ranked๋Š” redis์˜ zadd, zsub, zinc, zdec, zrange, zrevrange flushall๋งŒ์„ slimํ•˜๊ฒŒ ์ œ๊ณตํ•˜๋ฉฐ, ์ถ”๊ฐ€๋กœ ranked์˜ ํ•ต์‹ฌ ํ•จ์ˆ˜์ธ zincrbyp๋ฅผ ์ œ๊ณตํ•œ๋‹ค. redis๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค๋ฅธ ์—ฐ์‚ฐ๋“ค์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ranked์˜ ํ•œ๊ณ„

ranked๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ periodicํ•œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๊ฐ€๋ น ํŠน์ • ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ(ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ, ์ผ์ฃผ์ผ์— ํ•œ ๋ฒˆ ๋“ฑ) ๋ฐ์ดํ„ฐ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—” ranked๋ง๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์•ˆ์„ ๊ฐ•๊ตฌํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋‹ค. ๊ทธ ์ด์œ ๋Š” ranked๋Š” redis์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ, incp์™€ decp ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š”๋ฐ์— ํŠนํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ranked๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ฐฉ์•ˆ์œผ๋กœ๋Š” key๋ฅผ timestamp์™€ ํ•จ๊ป˜ ์ €์žฅํ•˜์—ฌ ํŠน์ • timestamp ์ด์ƒ์˜ ๊ฐ’๋“ค ๋งŒ๋“ค ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ๋งค๋ฒˆ O(n)๋งŒํผ์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ๊ฒƒ์ด๊ณ , ์ด๋Š” ์‹ค์‹œ๊ฐ„ ๋žญํ‚น ์ฒ˜๋ฆฌ๋ฅผ ๋ฐฉํ•ดํ•˜๋Š” ํฐ ์š”์ธ์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ์ธ์ง€ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

ranked๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ

์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํŠน์ • ๊ฒŒ์‹œ๊ธ€์˜ ์กฐํšŒ์ˆ˜(๋˜๋Š” up vote ์ˆ˜ ๋“ฑ)์„ ๊ธฐ์ค€์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๊ฒŒ์‹œ๊ธ€ ๋žญํ‚น ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ranked ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต ๋‹น์ผ์— ์˜ฌ๋ผ์˜จ ๊ธ€๋“ค์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋†’์€ ์กฐํšŒ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ฒŒ๋  ํ™•๋ฅ ์ด ๋†’์ง€๋งŒ, ๋‹ค๋ฅธ ์š”์ธ์œผ๋กœ ์ธํ•ด ์˜ค๋ž˜์ „ ๊ฒŒ์‹œ๊ธ€์ด ๋งŽ์ด ์กฐํšŒ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๋‹น์ผ์— ์˜ฌ๋ผ์˜จ ๊ธ€๋“ค๋งŒ ์‹ค์‹œ๊ฐ„ ๊ฒŒ์‹œ๊ธ€ ๋žญํ‚น์„ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋„ ๋ฌธ์ œ์—†๊ฒ ์ง€๋งŒ, ๋ชจ๋“  ๊ธ€๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋žญํ‚น ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค๋ฉด ranked ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•  ๊ฒƒ์ด๋‹ค.

๋นŒ๋“œ ๋ฐฉ๋ฒ•

git clone https://github.com/rollrat/ranked
cd ranked
mkdir build
cd build
cmake ../ -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release

์„œ๋ฒ„ ์‹คํ–‰

./bin/ranked 0.0.0.0 6372

api

zadd

zadd <table> [<value> <member>]+

zadd๋Š” table์— ์žˆ๋Š” member๋ฅผ value๋กœ ์„ค์ •์‹œํ‚จ๋‹ค. value๋Š” ์ •์ˆ˜๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. member ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์„ value๋กœ ์„ค์ •์‹œํ‚จ๋‹ค.

zincrby

zincrby <table> [<increment> <member>]+

zincrby๋Š” table์— ์žˆ๋Š” member์˜ value๋ฅผ increment๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. member ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜๊ณ  increment๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

zincrbyp (expired zincrby)

zincrbyp <table> [<increment> <member>]+ <expire>

zincrbyp๋Š” table์— ์žˆ๋Š” member์˜ value๋ฅผ increment๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , expire์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด member์˜ value๋ฅผ increment๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

zrange

zrange <table> <offset> <count> [withscores]

zrange๋Š” <table>์— ์žˆ๋Š” key-value ์ค‘ value๊ฐ€ ์ž‘์€ ์ˆœ์œผ๋กœ key๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋˜, offset๊ฐœ ๋งŒํผ ๋ฆฌ์ŠคํŠธ์˜ ์•ž ๋ถ€๋ถ„์ด ์ƒ๋žต๋˜๊ณ , count๊ฐœ ๋งŒํผ์˜ ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ๋งŒ์„ ๊ฐ€์ ธ์˜จ๋‹ค. withscores๋Š” key-value์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

zrevrange

zrevrange <table> <offset> <count> [withscores]

zrange๋Š” <table>์— ์žˆ๋Š” key-value ์ค‘ value๊ฐ€ ํฐ ์ˆœ์œผ๋กœ key๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๋˜, offset๊ฐœ ๋งŒํผ ๋ฆฌ์ŠคํŠธ์˜ ์•ž ๋ถ€๋ถ„์ด ์ƒ๋žต๋˜๊ณ , count๊ฐœ ๋งŒํผ์˜ ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ๋งŒ์„ ๊ฐ€์ ธ์˜จ๋‹ค. withscores๋Š” key-value์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

flushall

flushall

flushall์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ชจ๋“  table์„ ์‚ญ์ œํ•œ๋‹ค.

ranked์˜ ๊ตฌํ˜„

ranked๋Š” sorted map๊ณผ min heap์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. ranked๋Š” incp ๋˜๋Š” decp ์š”์ฒญ์„ ํ•ด์„ํ•˜์—ฌ remain์„ timestamp๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  min heap์— ์‚ฝ์ž…ํ•œ๋‹ค. zrange๋˜๋Š” zrevrange์ด ์š”์ฒญ๋˜๋ฉด min heap์— ์‚ฝ์ž…๋œ ํ•ญ๋ชฉ๋“ค์„ ์กฐํšŒํ•˜๊ณ  sorted map๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๊ณ  range๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

range ์—ฐ์‚ฐ์˜ ๊ตฌํ˜„

sorted map์„ ํ†ตํ•˜์—ฌ range์—ฐ์‚ฐ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„ , sorted map์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ value์˜ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ณ , ์š”๊ตฌ๋˜๋Š” offset๊ณผ count์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ด์•ผํ•œ๋‹ค. sorted map์„ ์ •๋ ฌํ•˜๋Š”๋ฐ O(log n)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋ฏ€๋กœ, ํ•œ ๋ฒˆ์˜ range ์š”์ฒญ๋‹น log n์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋จ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, sorted map์„ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด์„  ์ „์ฒด๋ฅผ ๋ณต์ œํ•ด์•ผํ•˜๋Š”๋ฐ, ๋ณต์ œํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋ณ‘๋ชฉ์ด ๋  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด key์— ๋Œ€ํ•œ ์ •๋ ฌ๋งŒ ์ง€์›๋˜๋Š” sorted map์„ ํ™•์žฅํ•˜์—ฌ key์™€ value ๋ชจ๋‘์˜ ์ •๋ ฌ์„ ์ง€์›ํ•˜๋Š” double sorted map์„ ๋งŒ๋“ ๋‹ค. double sorted map์€ key์— ๋Œ€ํ•œ btree์™€ value์— ๋Œ€ํ•œ btree๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ์„œ๋กœ ์ƒํ˜ธ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํฌ์ธํ„ฐ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค.

array ๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„

double sorted map์„ ๊ธฐ์กด std::map์„ ํ†ตํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด, std::map์™€ sorted array๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. sorted array๋Š” ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” array์˜ ํ™•์žฅํ˜•์ด๋‹ค. double sorted map์— ์š”์†Œ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค๋ฉด,

priority queue๋ฅผ ํ†ตํ•œ ๊ตฌํ˜„

heap์€ up heap๊ณผ down heap๊ณผ์ •์ด ํฌํ•จ๋œ๋‹ค. ์ด ๊ณผ์ •์„ ์ด์šฉํ•˜๋ฉด sorted map๊ณผ priority queue๋ฅผ ์ด์šฉํ•˜์—ฌ