スポンサーリンク

このドキュメントの内容は、以下の通りです。

C言語からlibmemcachedを使用してみました。
pecl-libmemcacheと同じような振る舞いをすると思っていたら、異なった振る舞いをしていました。
pecl-libmemcacheは、複数あるmemcachedの1つが存在しなくなったら(プロセスを落としたら)、そのmemcachedにはset/getはせずに、他のmemcachedを利用していました。その代わり、今までaの値をset/getしているサーバがほかのサーバになってしまい、急にキャッシュが効かなくなります。
libmemcachedの場合は、memcached_server_list_append()で追加したmemcachedのすべてがある前提で、常に格納先が決定されています。
だから、aの値をset/getするサーバは、稼働していようがいまいが、常に同じです。

// Last update: 2009/07/21 10:51:53
#include <stdio.h>
#include <stdlib.h>
#include <err.h>

#include <libmemcached/memcached.h>

memcached_return
Memcached_behavior_set(memcached_st *ptr, memcached_behavior flag,
		uint64_t data)
{
	memcached_return	rc = memcached_behavior_set(ptr, flag, data);
	if (MEMCACHED_SUCCESS != rc) {
		warnx ( "%s: %s", __func__, memcached_strerror(ptr,rc));
	}
	return rc;
}

int
main (int argc, char *argv[])
{

	struct memcached_st		*mmc		= NULL;
	struct memcached_server_st	*servers	= NULL;
	memcached_return		rc;
	int	i;

	char	*hostnames[]	= {
		"192.168.0.2",
		"192.168.0.3"
	};

	mmc	= memcached_create(NULL);
	if (! mmc) {
		warnx ("can not create memcached");
		exit(1);
	}

	int	port	= 11211;
	char	**p;

	for (p = hostnames; **p; ++p) {
		servers	= memcached_server_list_append(servers,
				*p, port, & rc);
		if (MEMCACHED_SUCCESS != rc) {
			warnx ( memcached_strerror(mmc, rc) );
		}
	}

	rc	= memcached_server_push(mmc, servers);

	if (MEMCACHED_SUCCESS != rc) {
		warnx ( memcached_strerror(mmc, rc) );
	}

	memcached_server_list_free(servers);

	char	*key1 = "a";
	char	*key2 = "b";
	char	*value1 = "123";
	char	*value2 = "456";

	time_t		expire	= 33;	// expire させる秒数
	uint32_t	flags	= 0;
	size_t		len;
	char	*val;

	rc	= memcached_set(mmc, key1, strlen(key1),
			value1, strlen(value1), expire, flags);
	if (MEMCACHED_SUCCESS != rc) {
		warnx ("can not set %s", key1);
		warnx ( memcached_strerror(mmc, rc) );
	}
	rc	= memcached_set(mmc, key2, strlen(key2),
			value2, strlen(value2), expire, flags);
	if (MEMCACHED_SUCCESS != rc) {
		warnx ("can not set %s", key2);
		warnx ( memcached_strerror(mmc, rc) );
	}

	val	= memcached_get(mmc, key1, strlen(key1),
			&len, &flags, &rc);
	if (MEMCACHED_SUCCESS != rc) {
		warnx ("can not read %s", key1);
		warnx ( memcached_strerror(mmc, rc) );
	} else {
		printf("%s\n", val);
	}

	free(val);

	val	= memcached_get(mmc, key2, strlen(key2),
			&len, &flags, &rc);
	if (MEMCACHED_SUCCESS != rc) {
		warnx ("can not read %s", key2);
		warnx ( memcached_strerror(mmc, rc) );
	} else {
		printf("%s\n", val);
	}

	free(val);

	memcached_free(mmc);

	exit (EXIT_SUCCESS);
}

コンパイル


gcc -I/usr/local/include -L/usr/local/lib/ -lmemcached libmemcached.c

参考


http://docs.libmemcached.org/

メモ


とある環境で、libmemcachedを使ってmemcachedにset/getをさせているときに、memcachedを終了させるとプログラムがcore dumpしてしまいました。
FreeBSD 6/FreeBSD 7の環境でテストしている分には、落ちなかったので、たぶん、とある環境のlibmemcachedが古いか、OSが古いのが原因だと思われます。

クライアント FreeBSD 6.3 AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ (2412.38-MHz 686-class CPU) メモリ1GB 100base
memcached FreeBSD 7.2 AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ (2412.38-MHz 686-class CPU) メモリ1GB 1000base
の環境で260万の値のsetやgetは、それぞれ7分半でできました。
秒間 8000 set、8000 getぐらいの性能でした。

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー