å ¨ææ¤ç´¢ã¨ã³ã¸ã³groongaããã¹ããªãªã¼ã¹ãã¾ããã
å ¨ææ¤ç´¢ã¨ã³ã¸ã³ã®groongaããã¹ããªãªã¼ã¹ãã¾ããã
æ¬æ¥éå¬ããããkey-value storeåå¼·ä¼ã§çºè¡¨ããã¦ããã ãã¾ããã
ä»ã¾ã§ãSennaã«ã¯
- Tritonnçµç±ã§ä½¿ã£ãå ´åãMySQLå´ã®ã¤ã³ããã¯ã¹ã¨ã®ä½µç¨ãé£ãããSennaæ¬æ¥ã®ããã©ã¼ãã³ã¹ãçºæ®ã§ããªãã£ãã
- å¾æ¥ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ã¯ããã¼ã¯ãã¤ã¶ã®åãæ¿ããªã©ã®æè»æ§ããªãã£ãã
ã¨ãã£ãåé¡ãããã¾ããã
groongaã¯ãããã«å¯¾ããè¿çã§ãã
- èªåã§ãã¼ã¿ãã¼ã¹æ¸ãã°ããããããï¼
- æè»ãªAPIç¨æããã°ããããããï¼
ã£ã¦ãã¨ã§ããã
ãã¼ã¿ãã¼ã¹ã¯ãkey-valueã¹ãã¢ãçµã¿åãããcolumnã¹ãã¢çãªæãã«ãªã£ã¦ãã¾ãã
詳細ã«ã¤ãã¦ã¯ãä»å¾å¥ã¨ã³ããªãããã¥ã¡ã³ãã§è¿°ã¹ã¾ãã
ä»å¾ã¯ãSennaã¯ãã°ä¿®æ£ã®ã¿è¡ãã¡ã³ããã³ã¹ã¢ã¼ãã«ç§»è¡ãã¾ãã
å®é使ã£ã¦ã¿ãã
ä»åã¯ãgroongaãåãããmemcachedäºæãããã³ã«å¯¾å¿æ©è½ãã使ã£ã¦ã¿ã¾ãããã
groongaã¯ãç¬èªã®ãã¼ã¿ãã¼ã¹ã»å ¨ææ¤ç´¢æ©è½ãAPIçµç±ã§æä¾ããã©ã¤ãã©ãªã§ãããã®ã©ã¤ãã©ãªã使ã£ã¦ãmemcachedäºæã®ãã¼ã¢ã³ãæ¸ãã¦ã¿ãããã¨ããã話ã§ããããããã³ã«ã¯memcachedäºæãªããããã¼ã¿ã¯HDD/SSDã«ä¿åããã¾ãã
以ä¸ã®ããã«ã¤ã³ã¹ãã¼ã«ãã¾ãã
ä»åã¯ãå
¨ææ¤ç´¢ã¯è¡ããªãããã
MeCabãªãã§ã¤ã³ã¹ãã¼ã«ãã¦ã¿ã¾ãããã
> tar xvfz groonga-0.0.1.tar.gz > cd groonga-0.0.1 > ./configure --without-mecab > make > su # make install
以ä¸ã®ããã«ãgroongaãã¼ã¢ã³ãèµ·åãã¾ãã
ããã©ã«ãã§ã¯ããã¼ãçªå·10041ã§listenãã¾ãã
> groonga -s <ãã¼ã¿ãã¼ã¹ãã¡ã¤ã«å>
Gronngaã¯ãç¬èªãããã³ã«ã¨memcachedäºæãããã³ã«ããµãã¼ããã¦ãã¾ãã
ä»åã¯ãmemcachedäºæãããã³ã«ã使ã£ã¦ã¿ã¾ãããã
memcachedã®ãã¤ããªãããã³ã«ããµãã¼ããã¦ããã¯ã©ã¤ã¢ã³ããå¿
è¦ã§ãã
ä»åã¯ãlibmemcachedãç´ã«ä½¿ã£ã¦ã¿ã¾ãã
livedoorã®æ± éãããWEB+DB pressã«æ¸ããã³ã¼ãã®ãã¯ãã§ããâ¦
#include <stdio.h> #include "libmemcached/memcached.h" int main(int argc, char *argv[]) { struct memcached_st *memc; struct memcached_server_st *servers; memcached_return rc; char *val; size_t val_len; uint32_t flags; memc = memcached_create(NULL); memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_BINARY_PROTOCOL, 1); servers = memcached_servers_parse("127.0.0.1:10041"); rc = memcached_server_push(memc, servers); if (rc != MEMCACHED_SUCCESS) { fprintf(stderr, "Error: %s\n", memcached_strerror(memc, rc)); return -1; } rc = memcached_set(memc, "key", 3, "value", 5, 0, 0); if (rc != MEMCACHED_SUCCESS) { fprintf(stderr, "Error: %s\n", memcached_strerror(memc, rc)); return -1; } val = memcached_get(memc, "key", 3, &val_len, &flags, &rc); if (rc == MEMCACHED_SUCCESS) { printf("val: %.*s\n", val_len, val); } if (val) { free(val); } memcached_server_list_free(servers); memcached_free(memc); return 0; }
'key'ã¨ãããã¼ã«ã'value'ã¨ããå¤ãè¨å®ãã¦ã
ããã®åå¾ãã§ãã¾ãããã
ãã£ããã£ãã
PHPã®ã»ãã·ã§ã³ç¶æãgroongaã§ãã£ã¦ã¿ã
PECLã®memcacheã©ã¤ãã©ãªã¯ãæè¿ãã¤ããªãããã³ã«ããµãã¼ãããããã§ãã
ãã試ãã¦ã¿ãããã¾ãåããªãã£ãã£ãã
ã¨ããããã§ãä»åã¯ãPECLã®memcachedã©ã¤ãã©ãªã使ãã¾ããã
libmemcachedã®ã©ããã¼ã§ããã
PECLã®memcache/memcachedã¯ã
PHPã®ã»ãã·ã§ã³ãmemcachedã«ä¿åããããã®æ©è½ãæã£ã¦ããã
php.iniãç·¨éããã ãã§ã»ãã·ã§ã³æ
å ±ãmemcachedã«ä¿åãããã¨ãå¯è½ã§ãã
ãã ããmemcachedã®ããã¹ããããã³ã«ã使ããã¦ãã¾ããã§ããã¼â¦
ãã£ã¦ãPHPã®ã»ãã·ã§ã³ç¶æãmemcachedã®ãã¤ããªãããã³ã«ãç¨ãã¦è¡ã
ãã¹ãããã°ã©ã ãæ¸ãã¾ããã
ãããªãã§ãã¾ãåãã¯ãã§ãã
<?php extension_loaded('memcached') || dl('memcached.so') || exit(1); class MemcachedBinarySession { private static $memcached; private static $lifetime; public static function open() { self::$lifetime = ini_get('session.gc_maxlifetime'); $m = new Memcached; $m->setOption(Memcached::OPT_BINARY_PROTOCOL, 1); $ret = $m->addServer('localhost', 10041); self::$memcached = $m; return $ret; } public static function close() { return TRUE; } public static function read($session_id) { return self::$memcached->get($session_id); } public static function write($session_id, $session_data) { return self::$memcached->set($session_id, $session_data, self::$lifetime); } public static function destroy($id) { return self::$memcached->delete($session_id); } // don't delete. public static function gc($max_lifetime) { return TRUE; } } ini_set('session.save_handler', 'user'); session_set_save_handler(array('MemcachedBinarySession', 'open'), array('MemcachedBinarySession', 'close'), array('MemcachedBinarySession', 'read'), array('MemcachedBinarySession', 'write'), array('MemcachedBinarySession', 'destroy'), array('MemcachedBinarySession', 'gc') ); if (session_id() == '') session_start(); if (isset($_SESSION['counter'])) { $_SESSION['counter']++; } else { $_SESSION['counter'] = 1; } echo '<br/>SessionID: '. session_id() .'<br/>Counter: '. $_SESSION['counter']; ?>
groongaãµã¼ããlocalhostã§åããã¦ãããµã¼ãã«ã
ä¸è¨ã®ã¹ã¯ãªãããç½®ãã¦ã¿ã¾ãããã
ãã©ã¦ã¶ã§ç¢ºèªããã¨ãã«ã¦ã³ã¿ãå¢ãã¦ããã¾ããã¼ã
ãã¼ãã
大äºãªæ³¨æ
ã¨ãããããä»æ¥ã®çºè¡¨ä¼ã®ããã ãã«ãªãªã¼ã¹ããã¦ã®ã§ã
以ä¸ã®ãããªå¶éäºé
ãããã¾ãã
groongaã¯ãªãã¸ããªãgithubã§å
¬éãã¦ãã¾ãã
http://github.com/groonga/groonga/tree/master
ãã²ãã²ããããï¼give me patchï¼ï¼ï¼
- ãã¹ããªãªã¼ã¹ã®ãããAPIããã¥ã¡ã³ããã¾ã£ãããªãã§ãã
APIããã¥ã¡ã³ãã¯ä»å¿
æ»ã«æ¸ãã¦ã¾ãã
memcachedãã¤ããªãããã³ã«äºæAPIã§éãã§ã¿ã¦ãã
- Macã§ãã¹ããã¦ãªãã£ããkqueueãµãã¼ããã¦ãªãã£ãã
ç¾å¨ãLinux(amd64)ã§éçºã»ãã¹ããã¦ãã¾ãã
Macã§ããã¹ããã¦ã¾ããã
ã¾ããkqueueãµãã¼ãããã¦ããªããããå¤é度ãé«ããã¹ããMacãFreeBSDã§è¡ãã¨é
ãã¨æãã¾ãã
- è¨èªãã¤ã³ãã£ã³ã°ãããã¾ããã
ç¾å¨ãå種LLè¨èªã®ããã®ãã¤ã³ãã£ã³ã°ãããã¾ããã
ãã¤ã³ãã£ã³ã°å¤§åéä¸ã§ãï¼
- exptimeã¯ä¿åããã¦ãã¾ãããå¦çã¯è¡ã£ã¦ãã¾ããã
Tokyo Tyrantçã®memcachedäºæå®è£
ã§ã¯ãflagsãexptimeãç¡è¦ãããã®ãããã¾ãã
groongaã§ã¯ãflagsãexptimeããã¡ãã¨ä¿åãã¦ãã¾ãã
ããexptimeã®å¦çãæ¸ãã¦ããªãã®ã§ãexpireãè¡ããã¾ããã
ãã¡ãã¨ä¿åã¯ãã¦ããã®ã§ããã¨ã¯expireã®å¦çã®å®è£
ãå¿
è¦ã§ãã
ã¨ããããã¯ãgetã®éã«exptimeãè¶ãã¦ãããå¤ãæ¶ãã
çãªå®è£
ããã¤ãã¦ããããã¨ããã§ãã
- ãã¡ã¤ã«ãã©ã¼ããããå¤ããããããã¾ããã
ãã¹ããªãªã¼ã¹ãªã®ã§ããã¡ã¤ã«ãã©ã¼ãããå¤ããããããã¾ããã
- MySQLãã使ãã¾ããã
ç¾å¨ãMySQLçµç±ã§ã¯å©ç¨ã§ãã¾ããã
ããã«ã¤ãã¦ã¯ãç¾å¨â¦ã²ãã²ããéã®çµç¹ãã¼ï¼ï¼ãããµã£
ã¨ããããã§ããæå¾
ããã