高性能内存对象缓存memcached
一、memcached简介
1.memcached是基于内存级的缓存服务器,将所有的数据都存在内存中。因为在内存中会统一维护一张巨大的hash表,所以支持任意存储类型的数据
2.memcached是C/S架构,需要安装memcached服务端和memcached API客户端
3.主要作用:
memcache主要用于分担数据库的负载压力,是缓存系统,所以严格意义上来说,memcache不是一个nosql的数据库,只是一个提供内存缓存功能的系统。那怎么理解别人说的memcache又是一个nosql数据库?
首选说明一下什么是nosql(泛指非关系型数据库),关系型数据是基于二维表(实体和实体之间的关系就叫做关系型数据库),而非关系型数据库不使用SQL语句作为查询,使用key-value这种数据结构保存数据的数据库,而memcache本身是没有使用SQL语句作为查询的,所以他是nosql库。
二、memcached原理
1.当Web客户端发送请求到Web服务器的应用程序时,应用程序会通过调用Memcached API客户端程序库接口去连接Memcached服务器,进而查询数据。如果此时Web客户端所请求的数据已经在Memcached服务端中缓存,则Memcached服务端会将数据返回给Web客户端;如果数据不存在,则会将Web客户端请求发送至MySQL数据库,由数据库将请求的数据返回给Memcached以及Web客户端,与此同时memcached服务器也会将数据保存,方便下次使用
2.存储方式与数据过期方式
1)数据存储方式:Slab Allocation
按组分配内存,每次分配一个Slab,相当于一个大小为1MB的页,然后在1MB的空间里根据数据大小划分大小相同的chunk。该方法可以有效解决内存碎片问题,但对内存空间有所浪费
2)数据过期方式: LRU、Laxzy Expiration
LRU是指追加的数据空间不足时,会根据LRU的情况淘汰最近最少使用的记录。
Laxzy Expiration即惰性过期,是指使用get时查看记录时间,从而检查记录是否已经过期
3. Memcached 缓存机制
缓存是常驻在内存的数据,能够快速进行读取。当程序写入缓存数据请求时,Memcached 的API接口将Key输入路由算法模块路由到集群中一台服务器, 之后由API接口与服务器进行通信,完成一次分布式缓存写入
4. Memcached分布式
当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。
也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。
5.分布式算法(Consistent Hashing):
余数算法
散列算法
三、安装memcached
1.安装libevent
1)解压
略
2)编译
./configure --prefix=/usr/local/libevent
3)安装
make && make install
2.安装memcached
1)解压
略
2)配置
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
3)安装
make && make install
3.memcached启动与停止
1)启动:memcached -d -m 128 -u root -l 192.168.11.6 -p 11211 -c 1024 -P /usr/local/memcached/memcached.pid
选项及解释
-d 启动一个守护进程
-m 分配使用的内存空间大小 默认 64M
-u 运行memcached的用户
-l 服务器的监听地址
-p 端口 11211
-c 设置最大并发连接数 1024
-P 保存PID文件
2)停止
killall memcached
4.编写memcached服务控制脚本
四、memcached数据库操作与管理
1.连接memcached
telnet ip 11211
2.操作命令格式
<command name><key><flags><exptime><bytes><data block>
3.常见操作命令
1)添加一条键值数据
add username 0 0 7
example
STORED
username:键值
0:标记位,表示自定义信息为0(序号)
0:过期时间(表示永不过期)
example:键值
2)查询键值数据
get 键值名
gets 键值名 #检查最近是否更新,最后一位显示的是更新因子,每更新一次,更新因子加一
3)更新一条数据
replace 需要更新的键值名 标记位 过期时间 字节数 #键值必须存在,否则报错
例:replace username 0 0 7
set 需要更新的键值名 标记位 过期时间 字节数 #如果键值名不存在,就创建键值
例:set username 0 0 10
4)删除一条缓存数据
delete 键值名
5)追加数据
在原键值后追加
append 键值名 标记位 过期时间 字节数
例:append username 0 0 7
在原键值前追加
prepend 键值名 标记位 过期时间 字节数
6)清除所有缓存数据
flush_all
7)查看服务器统计信息
stats
stats items #返回所有键值对的统计信息
stats cachedump 1 0 #返回指定存储空间的键值对
stats slabs #显示各个slab的信息,包括chunk大小、数目、使用情况
stats sizes #输出所有item的大小
stats reset #清空统计数据
五、安装memcached API客户端
1.安装libmemcached
1)解压
略
2)配置
./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached
make && make install
2.编译安装memcached扩展
1)解压memcached-2.2.0.tgz
略
2)进入解压目录
cd memcached-2.2.0.tgz
3)配置,因为memcached-2.2.0.tgz包中没有配置脚本,需要PHP的phpize生成配置脚本
/usr/local/php5/bin/phpize
./configure --enable-memcached --with-php-config=/usr/local/php5/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
4)安装
make test
make install
共享组件位置
5)配置PHP,添加memcached组件
vim /usr/local/php5/php.ini
添加:
extension_dir="/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/"
extension=memcached.so
6)访问nginx的PHP页面看模块是否添加成功
vim /var/www/html/index.php
<?php
phpinfo();
?>
7)编写网页,测试memcached API功能
vim /var/www/html/test.php
<?php
$memcache = new Memcached();
$memcache->addServer('192.168.1.6',11211); memcached服务端的ip
$memcache->set('key','Memcache test successful',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
上一篇: 搭建memcached 集群 + keepalived 实现高可用
下一篇: DBCP原理分析