Memcache

一、memcache概述

1、memcache就是一个数据库、但是数据存在内存中。常用来做缓存服务器、将从数据库查询的数据缓存起来,减少数据库查询、加快查询速度。
2、明确使用场景:缓存服务器
3、适合存储的数据:
①访问比较频繁的数据,安全性差的数据,丢失无所谓的数据。
②数据更新,比较频繁的数据,比如用户的在线状态。
③数据的单个键值不能太大,不要超过1Mb数据。

二、通过putty操作memcached

【memcached手册:http://www.runoob.com/memcached/memcached-tutorial.html

1、增/改键(set

语法:set 键 额外信息 缓存时间 数据长度
键:名称不能超过250字符
额外信息:客户机使用它存储关于键值对的额外信息(注:整型参数)
缓存时间:0-理论永久,其他-单位秒(注:最大存储时间30天
数据长度:写数字,单位字节(注:①单个键最大存储数据为1M②回车输入具体内容)
说明:键存在则修改,键不存在则创建

2、获取键值(get

语法:get 键

3、添加键数据(add

语法:add 键 是否压缩 缓存时间/s 数据长度/字节
说明:只能添加不能修改

4、修改键数据(replace

语法:replace 键 是否压缩 缓存时间/s 数据长度/字节
说明:只能修改不能添加

5、删除键(delete

语法:delete 键

6、删除所有键(flush_all

语法:flush_all

7、递增(incr)和递减(decr

语法:incr 键 数字
语法:decr 键 数字
说明:返回增长后的结果,键必须存在

8、查看当前Memcached运行状态(stats
pid:              memcache服务器进程ID
uptime:           服务器已运行秒数
time:             服务器当前Unix时间戳
version:          memcache版本
pointer_size:     操作系统指针大小
rusage_user:      进程累计用户时间
rusage_system:    进程累计系统时间
curr_connections: 当前连接数量
total_connections:     Memcached运行以来连接总数
connection_structures: Memcached分配的连接结构数量
cmd_get:        get命令请求次数
cmd_set:        set命令请求次数
cmd_flush:      flush命令请求次数
get_hits:       get命令命中次数
get_misses:     get命令未命中次数
delete_misses:  delete命令未命中次数
delete_hits:    delete命令命中次数
incr_misses:    incr命令未命中次数
incr_hits:      incr命令命中次数
decr_misses:    decr命令未命中次数
decr_hits:      decr命令命中次数
cas_misses:     cas命令未命中次数
cas_hits:       cas命令命中次数
cas_badval:     使用擦拭次数
auth_cmds:      认证命令处理的次数
auth_errors:    认证失败数目
bytes_read:     读取总字节数
bytes_written:  发送总字节数
limit_maxbytes: 分配的内存总大小(字节)
accepting_conns:服务器是否达到过最大连接(0/1)
listen_disabled_num: 失效的监听数
threads:      当前线程数
conn_yields:  连接操作主动放弃数目
bytes:        当前存储占用的字节数
curr_items:   当前存储的数据总数
total_items:  启动以来存储的数据总数(包括过期的)
evictions:    LRU释放的对象数目
reclaimed:    已过期的数据条目来存储新数据的数目

三、php操作memcached

【官方手册:https://secure.php.net/manual/zh/memcache.set.php

常用操作

创建mem对象:$mem = new Memcache;
连接服务器: $mem->connect(服务ip地址,端口);
关闭服务器: $mem->close();
设置数据: $mem->set(键,值 [,是否压缩,缓存时间])
【注:缓存时间不设置默认为永久,设置为0也为永久,如果设置其它时间则不能超过30天】
获取数据: $mem->get(键);
递增: $mem->incrment(键,数字);
递减: $mem->decrment(键,数字);

//1、创建mem对象
$mem = new Memcache;
 
//2、连接mem服务
$mem->connect('localhost',11211);
 
//3、设置
$rs = $mem->set('hsz',666);
var_dump($rs);
echo "<hr />";
 
//4、获取
$rs = $mem->get('hsz');
var_dump($rs);

四、memcache能存储的数据类型

使用php可以存储到memcache的数据类型

//1.创建memcache对象
$mem = new memcache;
//2.连接服务
$mem->connect('localhost', 11211);
 
//3.设置服务
//①整型
$rs = $mem->set('v1', 8);
var_dump($rs);
var_dump($mem->get('v1'));
echo '<br>';
 
//②浮点型
$rs = $mem->set('v2', 8.88);
var_dump($rs);
var_dump($mem->get('v2'));
echo '<br>';
 
//③布尔型
$rs = $mem->set('v3', true);
var_dump($rs);
var_dump($mem->get('v3'));
echo '<br>';
 
//④字符串型
$rs = $mem->set('v4', 'abcdef');
var_dump($rs);
var_dump($mem->get('v4'));
echo '<br>';
 
//⑤数组型
$rs = $mem->set('v5', ['name'=>'张三', 'age'=>18]);
var_dump($rs);
var_dump($mem->get('v5'));
echo '<br>';
 
//⑥对象类型
class Cla
{
    public $name = '张三';
    public $age = 18;
    public function show() {
        return $this->name.$this->age;
    }
}
$obj = new Cla;
$rs = $mem->set('v6', $obj);
var_dump($rs);
var_dump($mem->get('v6'));
echo '<br>';
 
//⑦空类型
$rs = $mem->set('v7', null);
var_dump($rs);
var_dump($mem->get('v7'));
echo '<br>';
 
//⑧资源类型
$handler = fopen('./abc.txt', 'rb');
$rs = $mem->set('v8', $handler);
var_dump($rs);
var_dump($mem->get('v8'));
echo '<br>';

结果如下:

使用putty查看memcache数据如下:

五、php代码实现分布式的memcache服务器

//1、创建memcahce对象
$mem = new Memcache;
 
//2、设置memcache服务器连接池
$mem->addServer('127.0.0.1', 11211);
$mem->addServer('192.168.165.56', 11211);
$mem->addServer('192.168.165.53', 11211);
 
//3、设置数据
$rs1 = $mem->set('abc_name', '张三');
$rs2 = $mem->set('abc_age', 18);
$rs3 = $mem->set('abc_sex', '男');
 
var_dump($rs1);
var_dump($rs2);
var_dump($rs3);
echo '<hr />';
 
var_dump($mem->get('abc_name'));
var_dump($mem->get('abc_age'));
var_dump($mem->get('abc_sex'));

六、memcache的相关算法

1、惰性过期机制(lazy expiration)

说明:memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为惰性过期
好处:减少监控过期产生的开销

2、最近最少使用算法(LRU:Least Recently Used)

缓存空间已满,采用LRU策略,
将使用频率最低数据进行删除
图示如下:


七、memcache常见问题

1、缓存雪崩

场景:项目缓存同一时间失效
问题:瞬间几万次,甚至几千万次的同时访问数据库,数据库崩溃
解决:
①不要集中设置缓存有效期
②控制缓存在闲时过期(如:夜间)
③主从复制,读写分离

2、永久数据被踢

原因:因为惰性过期机制和最近最少使用机制导致
解决:永久数据和非永久数据分开存放

八、实现session跨域共享&跨服务器共享

【通过session共享实现单点登录】
1、同一服务器下session跨域共享
2、利用memcache实现session跨服务器共享

使所有服务器设置的session都存储在同一个memcache服务器上,然后各个服务器需要session数据的时候都从这台memcache服务器上读取,从而实现session共享。【通过此种方式共享其它数据也同理】


#one.php代码
//开启session跨域,允许session共享
ini_set('session.cookie_domain','hsz.com');
//通过php的ini_set函数临时更改php配置文件
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', 'tcp://127.0.0.1:11211');
 
session_start();
$_SESSION['name'] = '张三';
echo session_id().'<br>';
print_r($_SESSION);
 
#two.php代码
//开启session跨域,允许session共享
ini_set('session.cookie_domain','hsz.com');
//通过php的ini_set函数临时更改php配置文件
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', 'tcp://127.0.0.1:11211'); //ip可以写多个,使用","分隔
 
session_start();
echo session_id().'<br>';
print_r($_SESSION);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容