在Mac环境下安装memcache
没 brew 安装brew
brew安装完成后,执行以下命令:brew insatall memcached
Updating Homebrew... ==> Installing dependencies for memcached:libevent ==> Installing memcached dependency:libevent ==> Downloading https://homebrew.bintray.com/bottles/libevent-2.0.22.sierra.bott ######################################################################## 100.0% ==> Pouring libevent-2.0.22.sierra.bottle.1.tar.gz �� /usr/local/Cellar/libevent/2.0.22: 734 files, 2.0M ==> Installing memcached ==> Downloading https://homebrew.bintray.com/bottles/memcached-1.4.33.sierra.bot ######################################################################## 100.0% ==> Pouring memcached-1.4.33.sierra.bottle.tar.gz ==> Caveats To have launchd start memcached now and restart at login: brew services start memcached Or, if you don't want/need a background service you can just run: /usr/local/opt/memcached/bin/memcached ==> Summary �� /usr/local/Cellar/memcached/1.4.33: 11 files, 184.5K
启动停止命令:
brew services start memcached
brew services stop memcached
安装客户端:brew install libmemcached
==> Downloading https://homebrew.bintray.com/bottles/libmemcached-1.0.18_1.sierr ######################################################################## 100.0% ==> Pouring libmemcached-1.0.18_1.sierra.bottle.tar.gz � /usr/local/Cellar/libmemcached/1.0.18_1: 230 files, 1.8M
设置启动,守护线程 内存 ip端口:memcached -p 11211 -m 2048 -u root -d
测试连接:telnet localhost 11211
Trying 127.0.0.1... Connected to bogon. Escape character is '^]'.
按Ctrl + ] 会呼出telnet的命令行,出来telnet命令好之后就可以执行telnet命令
memcached的命令
分为 增删改查4类,沿着这个思路来学习
增:add往内存增加一行新纪录
语法:add key flag expire length
用add时,如果内存中已经有这个键,就无法再使用add进行添加,但是可以使用replace进行替换/更改
key:给值取一个独特的名字
flag:标志,要求为一个正整数
expire:有效期
length:缓存的长度(字节为单位)
flag的意义:memcache基本文本协议,传输的东西,理解成字符串来存储
question:想存一个PHP对象和一个PHP数组怎么办?
answer:序列化成字符串,往外取得时候,自然还要反序列成对象/数组/json/格式等等,这是flag的意义就体现出来了
expire的意义:设置缓存的有效期,有3种格式
1、设置秒数,从设定开始数,第N秒后失效
2、时间戳,到指定事件戳后失效,(适用于团购活动倒计时等场景)
3、设置为0,不自动失效(不是永不失效,如服务器重启或者老数据被挤出,都会导致数据失效,即便什么都没发生,30天后也会失效)
删:删除内存中的一行记录
语法:delete key [time seconds]
中括号里面的秒数是可选参数,加上之后是指,被删除的key,N秒内不能再用,目的是让网站上的页面缓存也代谢完毕
替换:
语法:replace key flag expire length
参数与add完全一样,不再赘述
只有key值存在时,才能修改键值,
查询:查询一条记录
语法:get key
返回key值
set 是设置和修改值:相当于有set和replace两者的功能
语法:set key flag expire length
如果服务器无此键 ——> 增加的效果
如果服务器有此键 ——> 修改的效果
incr、decr命令:增加或减少值的大小(适用于抢购等场景)
语法:incr key num
decr key num
示例:incr age 2 //年龄增加2岁
需要注意的是,这两个命令是把值当做32位无符号来操作的,也就是说,值最小是0,不会出现负数
stats:统计命令
flush_all命令:清空所有存储对象
memcache内存分配机制
1、内存的碎片化
如果用C语言直接malloc,free来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存碎片,无法再利用,这种空闲,但无法利用内存的现象,称为内存的碎片化
2、memcache是如何缓解内存碎片化的?
memcache用slab allocator机制来管理内存
基本原理:预先把内存分成数个slab仓库,各仓库,切分成不同尺寸的小块,需要存入内容时,判断内容的大小,为其选择合理的仓库
需要注意的是,如果有100byte的内容要存,但122大小的仓库中的chunk满了,并不会寻找更大的仓库,如144的仓库来存储,而是把122仓库的旧数据踢掉。详见过期与删除机制
3、对于固定大小的chunk,也会有浪费,如何缓解?
对于特定的网站,可以长期统计网站内的缓存数据,咱自己网站的特点,设置chunk的大小
4、一般而言,观察缓数据大小的变化规律,设置合理的生长因子
grow factor 默认是1.25倍,可以使用 -f num根据网站缓存的大小进行设置
memcache的过期数据删除机制
1、当某个值过期后,并没有从内存中删除,因此,stats统计时,curr_item仍有其信息
2、当某个新值去占用他的位置时,当成chunk来占用
3、当get值时,判断是否过期,如果过期,返回空,并且清空,curr_item就减少了
即这个过期数据只是让用户看不到而已,并没有在过期的瞬间立即从内存删除,这个称谓lazy expiration,惰性失效
3、如果chunk都满了,又有新的值要加入,要挤掉谁?
memcache此处用的是LRU删除机制
操作系统的内存管理:
FIFO:先进先出
LRU:最近最少使用:当某个单元被请求时,维护一个计数器,通过计数器来判断,最近谁最少被使用,就把谁踢出
memcache中的参数限制
key的长度:250字节,(二级制协议支持6535个字节)
value的限制:1M,一般都是存储一些文本,如新闻列表等等,这个值足够了
内存的限制:32位下最大设置到2G,64位基本不需要考虑
如果有30G数据要缓存,一般也不会单实例装30G,(不要把鸡蛋放在一个篮子),一般建议,开启多个实例(可以再不同的机器,或同台机器上的不同端口)
PHP连接memcache
1、下载memcached.dll,并放在php/ext目录下,下载是需要考虑3个条件(在phpinfo()中查看),PHP版本/ts或nts/vc6还是vc9
2、观察正确的目录和配置文件路径,并观察extension_dir的路径,先运行phpinfo(),确认真正使用的php.ini是哪一个
3、把dll放入extension目录,并修改php.ini,引入dll