ranked๋ redis์ sorted map์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, periodic(daily, weekly, monthly, alltime etc..)ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋๋ฐ์ ์ต์ ํ๋์ด ์๋ค.
๊ธฐ์กด 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๋ ์ฌ์ฉ์๊ฐ ์ค์๊ฐ์ผ๋ก periodicํ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๋๋ก ๋์์ค๋ค.
์ค์๊ฐ ์๋น์ค๊ฐ ํ์ํ์ง ์์ ๊ฒฝ์ฐ, ๊ฐ๋ น ํน์ ์๊ฐ์ ํ ๋ฒ(ํ๋ฃจ์ ํ ๋ฒ, ์ผ์ฃผ์ผ์ ํ ๋ฒ ๋ฑ) ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ์ ranked๋ง๊ณ ๋ค๋ฅธ ๋ฐฉ์์ ๊ฐ๊ตฌํด๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค.
๊ทธ ์ด์ ๋ ranked๋ redis์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ, incp์ decp ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๊ณ ์กฐํํ๋๋ฐ์ ํนํ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
ranked๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก๋ key๋ฅผ timestamp์ ํจ๊ป ์ ์ฅํ์ฌ ํน์ timestamp ์ด์์ ๊ฐ๋ค ๋ง๋ค ์กฐํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
๋ค๋ง ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ค์๊ฐ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ค๋ฉด ๋งค๋ฒ O(n)๋งํผ์ ์๊ฐ์ด ์์๋ ๊ฒ์ด๊ณ , ์ด๋ ์ค์๊ฐ ๋ญํน ์ฒ๋ฆฌ๋ฅผ ๋ฐฉํดํ๋ ํฐ ์์ธ์ด ๋ ์ ์์์ ์ธ์งํ์ฌ์ผ ํ๋ค.
์ปค๋ฎค๋ํฐ์์ ํน์ ๊ฒ์๊ธ์ ์กฐํ์(๋๋ 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
zadd <table> [<value> <member>]+
zadd๋ table์ ์๋ member๋ฅผ value๋ก ์ค์ ์ํจ๋ค.
value๋ ์ ์๋ง ๊ฐ๋ฅํ๋ค.
member ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ value๋ก ์ค์ ์ํจ๋ค.
zincrby <table> [<increment> <member>]+
zincrby๋ table์ ์๋ member์ value๋ฅผ increment๋งํผ ์ฆ๊ฐ์ํจ๋ค.
member ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ 0์ผ๋ก ์ค์ ํ๊ณ increment๋งํผ ์ฆ๊ฐ์ํจ๋ค.
zincrbyp <table> [<increment> <member>]+ <expire>
zincrbyp๋ table์ ์๋ member์ value๋ฅผ increment๋งํผ ์ฆ๊ฐ์ํค๊ณ ,
expire์ด๊ฐ ์ง๋๋ฉด member์ value๋ฅผ increment๋งํผ ๊ฐ์์ํจ๋ค.
zrange <table> <offset> <count> [withscores]
zrange๋ <table>์ ์๋ key-value ์ค value๊ฐ ์์ ์์ผ๋ก key๋ค์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋,
offset๊ฐ ๋งํผ ๋ฆฌ์คํธ์ ์ ๋ถ๋ถ์ด ์๋ต๋๊ณ , count๊ฐ ๋งํผ์ ๋ฆฌ์คํธ ํฌ๊ธฐ๋ง์ ๊ฐ์ ธ์จ๋ค.
withscores๋ key-value์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.
zrevrange <table> <offset> <count> [withscores]
zrange๋ <table>์ ์๋ key-value ์ค value๊ฐ ํฐ ์์ผ๋ก key๋ค์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋,
offset๊ฐ ๋งํผ ๋ฆฌ์คํธ์ ์ ๋ถ๋ถ์ด ์๋ต๋๊ณ , count๊ฐ ๋งํผ์ ๋ฆฌ์คํธ ํฌ๊ธฐ๋ง์ ๊ฐ์ ธ์จ๋ค.
withscores๋ key-value์ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ ธ์จ๋ค.
flushall
flushall์ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ table์ ์ญ์ ํ๋ค.
ranked๋ sorted map๊ณผ min heap์ ์ด์ฉํ์ฌ ๊ตฌํํ๋ค.
ranked๋ incp ๋๋ decp ์์ฒญ์ ํด์ํ์ฌ remain์ timestamp๋ก ๋ณํํ๊ณ min heap์ ์ฝ์
ํ๋ค.
zrange๋๋ zrevrange์ด ์์ฒญ๋๋ฉด min heap์ ์ฝ์
๋ ํญ๋ชฉ๋ค์ ์กฐํํ๊ณ sorted map๋ฅผ ์ฌ๊ตฌ์ฑํ๊ณ 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๋ก ๊ตฌํํ๋ค.
์๋ก ์ํธ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฒ ํฌ์ธํฐ๋ก ์ฐ๊ฒฐํ๋ค.
double sorted map์ ๊ธฐ์กด std::map์ ํตํด์ ๊ตฌํํ๋ ค๋ฉด, std::map์ sorted array๋ฅผ ์ฌ์ฉํ๋ค.
sorted array๋ ํญ์ ์ ๋ ฌ๋ ์ํ๋ฅผ ์ ์งํ๋ array์ ํ์ฅํ์ด๋ค.
double sorted map์ ์์๋ฅผ ์ฝ์
ํ๋ค๋ฉด,
heap์ up heap๊ณผ down heap๊ณผ์ ์ด ํฌํจ๋๋ค.
์ด ๊ณผ์ ์ ์ด์ฉํ๋ฉด sorted map๊ณผ priority queue๋ฅผ ์ด์ฉํ์ฌ