博客列表 >Memcache

Memcache

指纹指恋的博客
指纹指恋的博客原创
2018年03月04日 17:00:59674浏览

在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仓库,各仓库,切分成不同尺寸的小块,需要存入内容时,判断内容的大小,为其选择合理的仓库

d5785cea9e77c5b2ad7003db8a6efce6.jpg

fa542cf68e10158170481b41e66707a8.png


  • 需要注意的是,如果有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


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议