Memcache

1.背景:

随着计算机性能的发展 , 内存空间的加大 , 原本被存储在硬盘中的数据库数据可以被存入读取速度更快的内存当中

管理服务器数据存入内存的软件—>memcache

2.流程

安装—>启动(memcached)—>链接(port:11211)—->发送命令(get/set)

存储格式:hash键值对

key(键) value(值) length time(存活时间)

注: memcache重启,内存中数据也就消失.

​ 使用内存较多 , CPU使用少 , 与Apache相反

使用:缓存sql语句 , 会话控制机制

3.安装

Windows 32x 64x

Linux

4.启动

Windows:

常用参数:

-p<num> 设置链接端口号(默认不设置为11211)

-U<num> UDP监听端口(默认11211,0时关闭)

-l<ip_address> 绑定地址(默认无论内外网或本地ip都允许,有安全隐患,若设置为127.0.0.1就只能本机访问)

-d 独立进程运行

  • -d start 启动memcached服务
  • -d restart 重启memcached服务
  • -d stop|shutdown 关闭正在运行的memcached服务
  • -d install 安装memcached服务
  • -d uninstall 卸载memcached服务

-u <username> 绑定使用指定用户运行进程

-m <num> 允许最大内存使用量 , 单位M (默认为64M)

-P <file> 将PID写入文件<file>,配合 -d 一起使用

-M 内存耗尽时返回错误 , 而不是删除项

-c 最大同时连接数 , 默认是1024

-f 块大小增长因子 , 默认是1.25

-n 最小分配空间 , key+value+flags默认是48

-h 显示帮助

1
2
#/usr/local/memcached/bin/memcached -d -m 256 -p 11211 -u www -l 127.0.0.1
#/usr/local/memcached/bin/memcached -d -m 1024 -p 11211 -u root -c 1000

5.基础常用命令(客户端)

stats : 当前所有memcached服务器运行的状态信息

add : 添加一个数据到服务器

set : 替换一个已经存在的数据 , 如果数据不存在 , 则和add命令相同

get : 从服务器端提取指定的数据

delete : 删除指定的单个数据 , 如果要清除所有的数据 , 请使用flush_all指令

  • 客户端链接直接操作memcached

    telnet localhost 11211

  • 添加数据

    add 键名(key) 标志(flag) 存活时间(time) 长度(length)

    输出数据(长度与设定长度相同)

    eg: add name x1 30 5 回车换行 tomey

    注 : 时间设为0永久存在

  • 删除所有数据

    flush_all

  • stats 得到memcached 的运行状态

  • stats items 显示各 item 的数目和最老 item 的年龄

  • stats cachedump 2(item后数字) n(0-得到全部) 展示某个slab中的前n个key列表

6.PHP操作

 memcache 函数库(基于php开发)(面向对象和面向过程)

memcache_add() 或者 memcache_obj->add()

​ memcached 函数库(基于c++开发)(只有面向对象使用)

安装memcache 和memcached扩展: ….

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
// 创建一个memcache对象
$mem = new Memcache;

// 链接memcache服务器
$mem->connect('127.0.0.1',11211);

// 操作(增删改查)
//add添加
$mem->add('one','test code string',MEMCACHE_COMPRESSED,60*60*24*7);
#时间不能设置超过30天,否则会变成时间戳格式,推荐使用time()+秒数
#设置为0则永久存在
$mem->add('two',array('111','222','333'),MEMCACHE_COMPRESSED,0)
#数组/对象会在memcache中以序列化的方式存在

//set设置(==replace覆盖)
$mem->set('one','demo',MEMCACHE_COMPRESSED,0);

//get取值(存进去是什么类型数据,取出来还是什么类型)
var_dump($mem->get('one'));
var_dump($mem->get(array('one','two')));

//delete删除
$mem->delete('one');
$mem->delete('two',10); #10秒后删除,0为立即删除

//flush删库
$mem->flush();

// 关闭链接
$mem->close();

?>

其他常用函数:

​ 自增: increment(key [, num]);

​ 查看状态: getStats(type);

7.分布式配置

​ 多服务器机器利用哈希算法共同分担压力 , 共同提供数据库服务

​ addServer(‘主机名’,端口号,[持久链接],[权重],[超时时间],[重试间隔])

$mem->addServer('192.168.14.112',11211)

8.安全防护

  1. 内网访问

    memcached -d -m 1024 -u root -l 192.168.xx.xx(内网ip) -p 11211 -c 1024 start

  2. 设置防火墙

    1
    2
    3
    4
    5
    指定访问类型
    iptables -F
    iptables -P INPUT DROP
    iptables -A INPUT -p tcp -s 192.168.xx.xx --dport 11211 -j ACCEPT
    iptables -A INPUT -p udp -s 192.168.xx.xx --dport 11211 -j ACCEPT

9.实际使用memcache读取数据

​ 多用户大批量访问下 , 重复读取数据 , 服务器压力太大 , 使用memcache在查询时 , 缓存一份 , 以后的查询可以从memcache缓存中获取 , 当数据有变化时在更新缓存内容 , 以减轻负载压力

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php 

// 创建memcache对象
$mem = new Memcache;

// 连接memcache数据库
$mem->addServer('192.168.14.48','11211');
$mem->addServer('192.168.14.49','11211');

// 设置sql语句和mem缓存的键
$sql = 'select id,name,sex,age,email from users order by id';
$key = md5($sql);

//从mem内存中获取数据
$data = $mem->get($key);

//数据库操作
if (empty($data)) {
//链接
try {
$pdo = new PDO('mysql:host=localhost;dbname=test','root','123456');
} catch (Exception $e) {
echo '数据库链接失败:'.$e->getMessage();
}
// 获取数据 , 执行查询语句
$PDOstatement = $pdo->prepare($sql);

$PDOstatement->exec();

$data = $PDOstatement->fetchAll(PDO::FETCH_ASSOC);

//将查询到的数据存入mem缓存
$mem->set($key,$data,MEMCACHE_COMPRESSED,10);
}

print_r($data);

// 关闭链接
$mem->close();

?>