ã¢ãŒããã¯ãã£ãå€æŽããããã§ãããŒããŒã·ã§ã³ãšã¬ãŒãã£ã³ã°ã·ã¹ãã ãå³ããããå¿ èŠããããšããããcatã«ããããã
ãã®ãããžã§ã¯ãã®ç¹åŸŽã¯ããã€ãïŒYouTubeïŒãªã©ã®ãããŒãµã€ãã«ãããããªã³ã³ãã³ããé ä¿¡ããããšã§ãã ãµã€ãã«ã¯BBã³ãŒãïŒç¹å®ã®HTMLïŒã®ã¿ã衚瀺ããå¿ èŠããããŸãã ãããã£ãŠãHTMLããªã³ã¶ãã©ã€ã§çµ¶ããçæããå¿ èŠã¯ãããŸããã§ããããããšãã°1æ¥1åãªã©ãäžå®ã®æéåŸã«è¡ãããŸãããã1000ã€ã³ãã¬ãã·ã§ã³åŸã«ããŒããŒã·ã§ã³ã«çœ®ãæããããŸããã Apacheã¯nginxã«çœ®ãæããããnginxèªäœã¯çæãããéçHTMLã³ã³ãã³ããåã«è¿ããŸããã
ãµã€ãã«æ¥ããã³ã«ã蚪åè ã¯äœãæ°ãããã®ãèŠãã¯ãã§ãã æ°ãããã®ã¯ãããããããšã§ãããããå¿ããããŠããå€ããã®ã§ãã äžè¬çã«ããããªãã¬ãã¥ãŒã®ããŒããŒã·ã§ã³ãå¿ èŠã§ããïŒãããã«ã€ããŠã¯å°ãåŸã§ïŒã ããã€ãã®å転ã¢ã«ãŽãªãºã ããããŸãã ããŒã±ãã£ã³ã°æ åœè ã®å¿ã®æŽç·ŽåºŠãæ³åããããšããã§ããŸããã ãã®ãããæãåçŽãª1ã€ã«ã€ããŠã®ã¿èª¬æããŸãã
æåã®10ã¹ãããã«ã¯ãæ°ãããã¬ãã¥ãŒã®ã¿ãæ¿å ¥ãããŸãã 次ã«ãCTRãæ倧ã®ãã®ã«ããŽãªã®90ã®ãã¬ãã¥ãŒãéžæãããŸãã ãã®çšèªãããç¥ããªã人ã¯ãè±èªããã®ã¯ãªãã¯å¯èœæ§ã®ææšã§ãã ã¯ãªãã¯çïŒç»åã®ã¯ãªãã¯æ°ãšã€ã³ãã¬ãã·ã§ã³æ°ã®æ¯çã
ãããªã¯äººæ°ãããå¯èœæ§ããããŸããããã¬ãã¥ãŒã¯è¡šç€ºã§ããŸããã ããã¯ããããªã®æããžã¥ãŒã·ãŒãªç¬éã座ã£ãŠéžæããåŠçã®ä»£ããã«ãããããã座ã£ãŠã©ã³ãã ã«éžæããããã¬ãŒã ã®ãã¬ãã¥ãŒãçæããããã§ãã ãã®ãããéåžžã«èå³æ·±ããããªã®è©äŸ¡ãäžããå¯èœæ§ããããŸãã ãµã€ããå€æ§åããã©ã³ãã ãã¬ãŒã ã®å¹æãåçã«ããããã«ãããŒã«ã«è©äŸ¡ã䜿çšãããŸãã1ã€ã®ãããªãã3ã€ã®ãã¬ãã¥ãŒãçæããããããããã¬ãã¥ãŒãããŸãã èªç¶éžæã®éçšã§ãæãé åçãªåçãæ®ããŸãã æ祚ã·ã¹ãã ããããŸãïŒæãäž/æã§äžããŸããã1察1ã®æè¡çãªå®è£ ã¯å転ã·ã¹ãã ã«äŒŒãŠããŸãã
ããããSEOã®ããšã話ãèãã®ã§ã¯ãªãããããã®è©³çŽ°ãå ±æããããã«ããã«éãŸããŸããã äžè¬çã«ãã©ã³ããã¯ãããžãŒå šäœãWebãµã€ããžã§ãã¬ãŒã¿ãŒã«çœ®ãæããããŸããã Nginxã¯ãéçã®æ»ãå€ã«åãçµã¿ãŸããã CTRã®èšç®ãå®è£ ããããã ãã«æ®ããŸãã
ãµã€ãäžã®ãããªã®ç·æ°ã¯çŽ100Kã ã£ããããæ°žç¶çãªã¡ã¢ãªå ã¹ãã¬ãŒãžãéžæããããšã¯ããªãå¯èœã§ãã 代æ¿åã«ã¯ãRedisãAerospikeãTarntoolããããŸãã
åªããæ©èœãšMailRuã®ãã¬ã³ããªãŒãªãã·ã¢èªãµããŒãã«ããã圌ãã¯TarantoolãéžæããŸããã MySQLã¯ã©ãã«ãè¡ã£ãŠããŸãããåç»ã®BBã³ãŒããã«ããŽãªãšååã®ãªã¹ããã³ã³ãã³ãã®èª¬æããŠã§ããµã€ãã®çæã«å¿ èŠãªãã®ä»ã®æ å ±ãä¿åãç¶ããŠããŸãã ããããããŒã¿ããŒã¹ã¯å®éã«ã¯äœ¿çšãããªãã£ããããæå°éã®ã¡ã¢ãªã圌ã«å²ãåœãŠãããŸããã
Tarantoolã«ã€ããŠããã«è©³ãã説æããŸãïŒä»¥éãT *ãšåŒã³ãŸãïŒã ããŸããŸãªèšäºã§åœŒã«ã€ããŠå€ãã®ããšãæžãããŠããŸãããã»ããã¢ãããšã€ã³ã¹ããŒã«ãçç¥ããŠããããå®éã«ã©ã®ããã«é©çšããããããäŒãããŸãã
äœãäœã§ããããç解ããããã®å°ãéå±ãªçè«ïŒT *ã®ãã¹ãŠã®ããŒã¿ã¯ã¹ããŒã¹ã«ä¿åãããŸãïŒã¹ããŒã¹ã ããã¯ãSQLã®ããŒãã«ãŸãã¯MongoDbã®ã³ã¬ã¯ã·ã§ã³ã«é¡äŒŒããŠããŸãã ããŒãã«ã¯ããã¥ã¡ã³ãã®ã³ã¬ã¯ã·ã§ã³ã§ããè¡ã§æ§æããããããã¹ããŒã¹ã«ã¯å€ãã®ã¿ãã«ïŒMySQLã®è¡ã®ã¢ããã°ïŒãå«ãŸããŸãã
ã¿ãã«ã¯èŠçŽ ãŸãã¯ãã£ãŒã«ãã§æ§æãããŸãã ã¿ãã«ãã£ãŒã«ãã®èŠçŽ ãåŒã³åºãã®ã¯äŸ¿å©ã§ãããã®çšèªãé å®ããŸãããã®çšèªã¯ã tarantool.org / doc / book / box / index.htmlã®ããã¥ã¡ã³ãã«åããŸããã ããŒãã«è¡ãšã¯ç°ãªããã¿ãã«ã®ãã£ãŒã«ãã«ã¯ååã¯ãªããã·ãªã¢ã«çªå·ã®ã¿ããããŸãã ãã ããåŸã§èŠãããã«ãããã¯éèŠã§ã¯ãããŸããã
åã¿ãã«ã«ã¯äž»ããŒãå¿ èŠã§ãã ãã©ã€ããªã€ã³ããã¯ã¹ã¯ãTREEãHASHãBITSETããŸãã¯RTREEã®ããããã®ã¿ã€ãã§ãã ãŸããã»ã«ã³ããªã€ã³ããã¯ã¹ãã¹ããŒã¹ã«éããããšãã§ããŸããããã«ãããå€§æ ¹ã§ã¯äœæã§ããªããããªäžæã®ãµã³ãã«ãäœæã§ããŸãã
å³1ã¯ãMySQLãšT *ã®é¡äŒŒæ§ã瀺ããŠããŸãã
è©äŸ¡ãä¿åããããã«ãçµ±èšã¹ããŒã¹ãäœæãããŸãã ãããè¡ãã«ã¯ãã³ã³ãœãŒã«ã«ç§»åããŠã³ãã³ããå®è¡ããŸãã
box.cfg {}-ããã©ã«ãèšå®ãããŒãããŸã box.schema.space.createïŒ "stats"ïŒ-æ°ããã¹ããŒã¹ãäœæããŸã
ã¹ããŒã¹ãã©ã®ããã«äœæããããã確èªããŸãããã
tarantool> box.space --- -çµ±èšïŒ äžæçïŒfalse ãšã³ãžã³ïŒmemtx ...
ãããŠããããstatså€æ°ã«å²ãåœãŠãŸã
tarantool> stats = box.space
ããŒã¿ããŒã¹ãŸãã¯MongoDbã®ã¹ããŒããäœæããå Žåã次ã®ã¹ããŒããéžæããŸãã
1ããŒ-äž»ããŒããããªIDãšåã 2 clicks_1-æåã®åçã®ã¯ãªãã¯æ° 3ã¯ãªãã¯_2--|| -2çªç®ã®åç 4ã¯ãªãã¯_3--|| -3çªç®ã®åç 5 clicks_sum_1-æåã®åçã®ã¯ãªãã¯ã®ç·æ° 6 clicks_sum_2--|| -2çªç®ã®åç 7 clicks_sum_3--|| -3çªç®ã®åç 8 show_1ã·ã§ãŒã§ãåã ... 13 show_sum_3 æåŸã®ã¹ãã³ã®æåã®ç»åã®14 ctr_1 ctr 15 ctr_2 16 ctr_3 17 ctr_sum_1æéå šäœã®æåã®ç»åã®ctr 18 ctr_sum_2 19 ctr_sum_3 æåŸã®ééã®ãã¹ãŠã®åçã®20 ctr ctr æéå šäœã®ãã¹ãŠã®åçã®21 ctr_sum ctr
æåã®åã¯ãã£ãŒã«ãã®çªå·ã§ãããã£ãŒã«ãåãå®æ°ãšããŠå®çŸ©ããŸãã
-æåã®ãã£ãŒã«ãã¯äž»ããŒã§ã clicks_1 = 2 clicks_2 = 3 ã ã ã ctr_sum = 22
ã¹ããŒã¹ã«äž»ããŒãäœæããHASHã¿ã€ããéžæããŸãã
çµ±èšïŒcreate_indexïŒ 'primary'ã{type = 'hash'ãparts = {1ã 'NUM'}}ïŒ
äœæããããšã確èªããŸãã
tarantool> stats.index --- -0ïŒïŒ0 ãŠããŒã¯ïŒtrue ããŒãïŒ -ã¿ã€ãïŒNUM fieldnoïŒ1 idïŒ0 space_idïŒ513 ååïŒãã©ã€ã㪠ã¿ã€ãïŒHASH ãã©ã€ããªïŒ* 0 ...
ããŸãããã°éåžžã«äŸ¿å©ã§ãã次ã«ãclicks_1ãã£ãŒã«ããã€ã³ã¯ãªã¡ã³ãããé¢æ°ãäœæãããããã°ã®ããã«ããã€ãã®ãšã³ããªãæ¿å ¥ããŸãã
çµ±èšïŒæ¿å ¥{1,0,0,0,0,0,0} çµ±èšïŒæ¿å ¥{2,0,0,0,0,0,0} çµ±èšïŒ{3,0,0,0,0,0,0}ãæ¿å ¥
ãŸãã次ã®ãã®ãããããšã確èªããŸãã
tarantool>çµ±èšïŒ{2}ãéžæ --- --[2ã0ã0ã0ã0ã0ã0] ...
çŽ æŽãããããã¹ãŠãç§ãã¡ã®ããã«åããŠããŸãïŒ æ¬¡ã«ããã£ãŒã«ãã€ã³ã¯ãªã¡ã³ãã³ãŒããèšè¿°ããŸãããã
tarantool> statsïŒupdateïŒ2ã{{'+'ã2,1}}ïŒ tarantool>çµ±èšïŒ{2}ãéžæ -[2ã1ã0ã0ã0ã0ã0] tarantool> statsïŒupdateïŒ2ã{{'+'ã2,1}}ïŒ -[2ã2ã0ã0ã0ã0ã0]
æŽæ°ã³ãã³ãã«ã¯æ¬¡ã®ãã©ã¡ãŒã¿ãŒããããŸãã
äž»ããŒ-æŽæ°çšã®ããŒçªå·
2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ã¢ã¯ã·ã§ã³ã®ãªã¹ãã§ãåèŠçŽ ã¯ããªãã¬ããïŒ3ã€ã®èŠçŽ ã®ãªã¹ãïŒãè¡šããŸãã
-ã¢ã¯ã·ã§ã³ã®ã¿ã€ãããã®å Žåã¯è¿œå
-å€æŽãè¡ããããã£ãŒã«ãã®çªå·
-çªå·
æŽæ°ã³ãã³ãã®è©³çŽ°ã«ã€ããŠã¯ãããã¥ã¡ã³ããã芧ãã ãã ïŒ tarantool.org/doc/book/box/box_space.html#lua-function.space_object.update
statsïŒupdateãå®è¡ãããã³ã«ã2çªç®ã®ãã£ãŒã«ãã®ããŒ= 2ã®ããŒã¿ã1ãã€å¢å ããããšãããããŸããããèªã¿ããã圢åŒã§æžã蟌ã¿ãŸãã 以åã«ç§ãã¡ã¯å°ããªããã°ãªããŸããã§ããïŒ
tarantool> clicks_1 = 2
å®è¡ïŒ
tarantool> statsïŒupdateïŒ2ã{{'+'ãclicks_1,1}} -[2ã4ã0ã0ã0ã0ã0]
ãããé¢æ°ã§ã©ããããŸãã
function click_incïŒkeyïŒstatsïŒupdateïŒkeyã{{'+'ãclicks_1,1}}ïŒend
ãããŠãã§ãã¯ïŒ
tarantool> click_incïŒ2ïŒ tarantool>çµ±èšïŒ{2}ãéžæ --- --[2ã5ã0ã0ã0ã0ã0] ... tarantool> click_incïŒ2ïŒ tarantool>çµ±èšïŒ{2}ãéžæ --- --[2ã6ã0ã0ã0ã0ã0] ...
é¢æ°ã«ç»åçªå·ãè¿œå ããŸãïŒçªå·ã¯0ããå§ãŸããŸã-æåã®ç»åïŒïŒ
function click_incïŒkeyãimg_numïŒstatsïŒupdateïŒkeyã{{'+'ãclicks_1 + img _numã1}}ïŒend
ãã§ãã¯ããåŸãé¢æ°ãå¥ã®ãã¡ã€ã«ã§èŠããã衚瀺ããŸãïŒclick.lua
é¢æ° click_inc ïŒ key ã img_num ïŒ
img_num > 3ã® å Žå
åœãè¿ã
çµãã
ç®± ã¹ããŒã¹ çµ±èšïŒ update ïŒ key ã { { '+' ã clicks_1 + img_num ã 1 } } ïŒ
çã è¿ã
çµãã
ã芧ã®ãšãããé¢æ°å®è¡ã®ããžãã¯ã¯éåžžã«åçŽã§ããæåã®åŒæ°ã¯ãããªIDã§ã次ã®çªå·ã¯ãã®ãã¬ãã¥ãŒã§ãã 次ã«ãããããã¹ãŠãã©ã®ããã«é©çšã§ããããèŠãŠã¿ãŸãããã WEBãããžã§ã¯ãã®å Žåããã®é¢æ°ã¯3ã€ã®æ¹æ³ã§åŒã³åºãããšãã§ããŸãã
-ã«ã¹ã¿ã APIã®äœ¿çšïŒPHP / Python / Perl / Javaã¹ã¯ãªãããªã©ãã
-tarantool-httpãä»ããŠãnginxãä»ããŠãªã¯ãšã¹ãããããã·ãããŸã
ãŸãã¯ãhttp.libãŸãã¯å¥ã®WebãµãŒããŒïŒxavanteãªã©ïŒã䜿çšããç¬èªã®luaã¹ã¯ãªãã
-nginx_upstreemã¢ãžã¥ãŒã«ã䜿çšããŠnginxããçŽæ¥ã
èå³ãããã°ã2çªç®ã®æ¹æ³ã«ã€ããŠè©³ãã説æããŸããããã®å Žåã¯3çªç®ã®ãªãã·ã§ã³ãéžæããŸããã ãã®èšäºã«ã¯éåžžã«å€ãã®æåããããŸãããã®ãããT *äœæè ã®nginxãšTarantoolã«åºã¥ããŠãµãŒãã¹ãæ§ç¯ããèšäºã§ã¢ãžã¥ãŒã«ã®ã€ã³ã¹ããŒã«ãšæ§æã«ã€ããŠèªãããšãã§ããŸãã
ãããã£ãŠãclick.luaã¯æ¬¡ã®ããã«ãªããŸãã
ïŒïŒ/ usr / bin / tarantool
ç®± cfg {
log_level = 5 ;
listen = 10001 ;
}
click_1 = 2 ;
é¢æ°click_inc ïŒ key ã img_num ïŒ
img_num > 3ã® å Žå
0ã è¿ã
çµãã
ç®± ã¹ããŒã¹ çµ±èšïŒ update ïŒ key ã { { '+' ã click_1 + img_num ã 1 } } ïŒ
1ã è¿ã
çµãã
ããããã§ãã¯ããŠãã ããïŒ
curl http://127.0.0.1:8081/echo --data '{"method"ïŒ "click_inc"ã "params"ïŒ[2,1]ã "id"ïŒ0}' {"id"ïŒ0ã "çµæ "ïŒ[[1]]}
確èªããã«ã¯ãT *ã®å®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ã«æ¥ç¶ããŸãããã
tarantool> console = requireïŒ "ã³ã³ãœãŒã«"ïŒ tarantool> console.connectïŒ "127.0.0.1:10001"ïŒ tarantoolïŒ127.0.0.1:10001ã«æ¥ç¶ -æ¬åœ 127.0.0.1:10001>çµ±èš= box.space.stats 127.0.0.1:10001>çµ±èšïŒ{2}ãéžæ --[2ã7ã0ã0] ...
2çªç®ã®ç»åã®ã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããããšãã§ããŸãã
curl http://127.0.0.1:8081/echo --data '{"method"ïŒ "click_inc"ã "params"ïŒ[2,2]ã "id"ïŒ1}' {ãidãïŒ0ããçµæãïŒ[[1]]}
çµæã確èªããŸãã
127.0.0.1:10001>çµ±èšïŒ{2}ãéžæ --[2ã7ã1ã0] ...
ã¯ãªãã¯ã¹ã«ãŒã·ã¹ãã ãäœãã®ãã©ãã»ã©ç°¡åããèŠãŸããã ããã§ã¯ãé ä¿¡ã·ã¹ãã ã«ç§»ããŸãããã
ãã¬ãã¥ãŒã®ã»ããã®åããŒãžã¯ãã€ã³ãã¬ãã·ã§ã³ã€ã³ã¯ãªã¡ã³ãããã·ãŒãžã£show_incãå®è¡ããããšããã«ããŽãªããä»»æã«åŒã³åºããŸãã ããããç§ãã¡ãç解ããŠããããã«ãããã¯æé©ã§ã¯ãããŸããã 次ã®ãªãã·ã§ã³ããããŸããHTMLããŒãžã®æ¬æã«å€æ°ãçæãããŸãã
< ã¹ã¯ãªãã >
show_pictupies =â 1,2,3,4,5â / *衚瀺ãããŠããç»åã®ãã¹ãŠã®IDã¯ããã«ãªã¹ããããŠããŸã* /
< / ã¹ã¯ãªãã >
ããã«AJAXã§ãã®ãªã¹ãå šäœã転éããŸãã ããããããã§ã¯ãç»åã®idã«å ããŠããã®è¡šç€ºãªãã·ã§ã³ãæž¡ãå¿ èŠããããŸãããã®ããããªã¹ãã¯ã1-1ã2-1ã3-1ã4-2ãã®åœ¢åŒãåãããšãã§ããŸãããã€ãã¹èšå·ã®åŸã®æ°åã¯è¡šç€ºãªãã·ã§ã³ã瀺ããŸãã
æ®å¿µãªãããluaã§ççºãããããªé¢æ°ã®é¡äŒŒç©ã¯ãªããããGoogleã§ãã®ã³ãŒãã䜿çšããŸãã
é¢æ°åå²ïŒ inputstr ã sep ïŒ
sep == nilã® å Žå
sep = "ïŒ s"
çµãã
ããŒã«ã« t = { } ; i = 1
stringã® str gmatch ïŒ inputstr ã "ïŒ[^" .. sep .. "] +ïŒ" ïŒ do
t [ i ] = str
i = i + 1
çµãã
tãè¿ã
çµãã
次ã«ãããŒãã«ã調ã¹ãŸãã ã«ãŒããå®è£ ããã«ã¯ãå埩é¢æ°ãå®è£ ããŸãã
é¢æ°å€ïŒ t ïŒ
ããŒã«ã« i = 0
return function ïŒ ïŒ i = i + 1 ; t [ i ]ã è¿ã
çµãã
it in values ïŒ tt ïŒ do show_inc ïŒ it ã 2 ïŒ end
ãæ³åã®ãšãããshow_incã¯click_incãšéåžžã«ãã䌌ãŠããŸãããå€æ°click_1ãshow_1ã«çœ®ãæãããšããããã€ãã®äŸå€ããããŸãã ãããã£ãŠãããæ±çšçãªé¢æ°stat_incïŒããŒããã£ãŒã«ããimg_numberïŒãäœæã§ããŸãã
é¢æ° stat_inc ïŒ key ã field ã img_num ïŒ
img_num > 3ã® å Žå
0ã è¿ã
çµãã
ç®± ã¹ããŒã¹ stats ïŒ update ïŒ key ã { { '+' ã field + img_num ã 1 } } ïŒ
1ã è¿ã
çµãã
2çš®é¡ã®ctrãã«ãŠã³ãããŠãããããæåŸã®äžä»£ããæåã®äžä»£ãšäžè¬çãªäžä»£ã®2ã€ãã«ãŠã³ããããããã¯ãªãã¯ããã·ãŒãžã£ãäœæããnginxçµç±ã§åŒã³åºããŸãã
é¢æ°ã¯ãªãã¯ïŒ key ã img_num ïŒ
stat_inc ïŒ key ã clicks_1 ã img_num ïŒ
stat_inc ïŒ key ã clicks_sum_1 ã img_num ïŒ
çµãã
ãããŠè¡šç€ºïŒ
é¢æ° show ïŒ key_list ïŒ
list = slipt ïŒ key_list ã 'ã' ïŒ
å€ã®ãªã¹ãïŒãªã¹ãïŒ
ãã
pos = string.find ïŒ it ã â - â ïŒ ;
key = string.sub ïŒ it ã 0 ã pos - 1 ïŒ ;
img_num = string.sub ïŒ it ã pos + 1 ïŒ
stat_inc ïŒ key ã shows_1 ã img_num ïŒ
stat_inc ïŒ key ã shows_sum_1 ã img_num ïŒ
çµãã
çµãã
ãã®ããã«ããŠãã¯ãªãã¯ãšã€ã³ãã¬ãã·ã§ã³ã®äž¡æ¹ãã«ãŠã³ãããŸãã
ãã®ãããã¯ã«èå³ãæã£ãŠãHTMLãçæããããã®ctrã®èšç®æ¹æ³ãšç»åã®éžææ¹æ³ã説æã§ããŸãã