1.memcached 的工作原理(通过保持的KEY值,查询value值,在内存中操作)


memcached是怎么工作的?


Memcached的神奇来自两阶段哈希(two-stage hash)。Memcached就像一个巨大的、存储了很多<key,value>对的哈希表。通过key,可以存储或查询任意的数据。


客 户端可以把数据存储在多台memcached上。当查询数据时,客户端首先参考节点列表计算出key的哈希值(阶段一哈希),进而选中一个节点;客户端将 请求发送给选中的节点,然后memcached节点通过一个内部的哈希算法(阶段二哈希),查找真正的数据(item)。


举个列子,假设有3个客户端1, 2, 3,3台memcached A, B, C:

Client 1想把数据”barbaz”以key “foo”存储。Client 1首先参考节点列表(A, B, C),计算key “foo”的哈希值,假设memcached B被选中。接着,Client 1直接connect到memcached B,通过key “foo”把数据”barbaz”存储进去。Client 2使用与Client 1相同的客户端库(意味着阶段一的哈希算法相同),也拥有同样的memcached列表(A, B, C)。

于是,经过相同的哈希计算(阶段一),Client 2计算出key “foo”在memcached B上,然后它直接请求memcached B,得到数据”barbaz”。

各种客户端在memcached中数据的存储形式是不同的(perl Storable, php serialize, java hibernate, JSON等)。一些客户端实现的哈希算法也不一样。但是,memcached服务器端的行为总是一致的



2.memcached 安装


安装基础包

yum -y install gcc gcc-c++


http://memcached.org/files/memcached-1.4.24.tar.gz


http://nchc.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz


首先是下载 memcached 了,目前最新版本是 1.1.12,直接从官方网站即可下载到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下载的是 libevent-1.1a.tar.gz


接下来是分别将 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解开包、编译、安装:


# tar -xzf libevent-1.1a.tar.gz 

# cd libevent-1.1a 

# ./configure --prefix=/usr 

# make 

# make install 

# cd .. 


# tar -xzf memcached-1.1.12.tar.gz 

# cd memcached-1.1.12 

# ./configure --prefix=/usr 

# make 

# make install

安装完成之后,memcached 应该在 /usr/bin/memcached。


3.如何使用memcached-Server端?


在服务端运行:


# ./memcached -d -m 2048 -l 192.168.1.90 -p 11211  -u root


## -l 监听地址,memcache 无身份验证功能,严禁在无防护情况下使用

## -d 以守护进程的形式运行

## -m 指定分配内存大小,单位 m

## -p 监听端口

## -u 运行用户

## -c 最大并发连接数

## -P PID 文件存放位置

## -f 增长因子


这将会启动一个占用2G内存的进程,并打开11211端口用于接收请求。由于32位系统只能处理4G内存的寻址,所以在大于4G内存使用PAE的32位服务器上可以运行2-3个进程,并在不同端口进行监听。



## 启动成功,监听所有地址,包括 ipv6 ,这样不安全,最好 -l 指定监听 IP


4、测试 Memcached


Memcached常用命令及使用说明


一、存储命令


存储命令的格式:


<command name> <key> <flags> <exptime> <bytes>

<data block>

参数说明如下:


<command name> set/add/replace

<key>        查找关键字

<flags>        客户机使用它存储关于键值对的额外信息

<exptime> 该数据的存活时间,0表示永远

<bytes>        存储字节数

<data block> 存储的数据块(可直接理解为key-value结构中的value)




[root@study ~]# telnet 127.0.0.1 11211    # 登陆 memcached

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

set id 0 0 5    # 保存一个值

12345

STORED

get id          # 取值

VALUE id 0 5

12345

END

replace id 0 0 5    # 更新值

88888

STORED

get id          # 查看是否更新

VALUE id 0 5

88888

END

quit

Connection closed by foreign host.



[root@study ~]# telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

get id          # 重新登陆还保存着

VALUE id 0 5

88888

END

quit

Connection closed by foreign host.


[root@study ~]# telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

get id

VALUE id 0 5

88888

END

delete id       # 删除值

DELETED

get id

END

quit

Connection closed by foreign host.



其他:


一、粘性 session 和非粘性 session 的区别:


         粘性 session 就是指, apache 服务器会把某个用户的请求,交给 tomcat 集群中的一个节点,以后此节点就负责该保存该用户的 session ,如果此节点挂掉,那么该用户的 session 也会消失。


         非粘性 session :这种方式下,通过负载均衡器会根据节点的情况,把用户的请求进行分发,也就是会复制多份 session 分发给多个节点,这样,如果节点中其中一个 session 挂掉的话,其它的还能继续工作,也就是只要有一个节点没有挂掉,该用户的信息就不会消失。


 


二、memcached 策略的引言


         MSM : memcachedsession manager ,是一种高可用的 tomcat session 支持方案,它可以支持粘性 session ,也可以支持非粘性 session ,这里,我采用的是非粘性 session ,也就是多个 tomcat 之间的 session 复制,当然,除了 MSM 只是一个组件,还可以选择其它的组件,比如 memcacheddb , membase 。