Blogger Information
Blog 17
fans 0
comment 0
visits 11747
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Memcache
指纹指恋的博客
Original
681 people have browsed it

在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


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post