以下是自学it网--中级班上课笔记
网址:www.zixue.it
一:memcached的启动
下载相应的win二进制版本,不用安装,到命令行下 memcached -h 可以看到帮助.
-p <num> TCP port number to listen on (default: 11211) // 监听的端口
-U <num> UDP port number to listen on (default: 0, off)
-s <file> unix socket path to listen on (disables network support)
-a <mask> access mask for unix socket, in octal (default 0700)
-l <ip_addr> interface to listen on, default is INDRR_ANY
-d start tell memcached to start
-d restart tell running memcached to do a graceful restart
-d stop|shutdown tell running memcached to shutdown
-d install install memcached service // 把memcached注册成服务
-d uninstall uninstall memcached service
-r maximize core file limit
-u <username> assume identity of <username> (only when run as root)
-m <num> max memory to use for items in megabytes, default is 64 MB //分配给memcached的最大内存
-M return error on memory exhausted (rather than removing items)
-c <num> max simultaneous connections, default is 1024 // 最大的连接数
-k lock down all paged memory. Note that there is a
limit on how much memory you may lock. Trying to
allocate more than that would fail, so be sure you
set the limit correctly for the user you started
the daemon with (not for -u <username> user;
under sh this is done with 'ulimit -S -l NUM_KB').
-v verbose (print errors/warnings while in event loop) //输出错误信息
-vv very verbose (also print client commands/reponses) //输出所有信息
-h print this help and exit
-i print memcached and libevent license
-b run a managed instanced (mnemonic: buckets)
-P <file> save PID in <file>, only used with -d option
-f <factor> chunk size growth factor, default 1.25 //增长因子
-n <bytes> minimum space allocated for key+value+flags, default 48
出现以下内容则启动成功
使用telnet工具来测试.
在win下为例
telnet 127.0.0.1 11211
[提示错误:'telnet' 不是内部或外部命令,也不是可运行的程序或批处理文件。]
如果提示以上问题:windows7带有telnet,只是默认没有安装而已。
解决问题:
1.开始–>控制面板–>程序
2.右侧打开或者关闭windows功能
3.找到Telnet客户端,选择安装
telnet 127.0.0.1 11211
连接,并按 ctrl+] , 再回车,打开回显,就可以做测试了.
Memcached的命令分 增删改查4类,沿着这个思路来学习.
注意:在telnet 客户端下如果打错字母则就得重新开个终端他是不支持删除的
增: add 往内存增加一行新记录
语法 add key flag expire length
Key 给值起一个独特的名字
Flag 标志,要求为一个正整数
Expire 有效期
Length 缓存的长度(字节为单位)
Flag的意义:
Memcached基本文本协议,传输的东西,理解成字符串来存储.
想:让你存一个PHP对象,和一个PHP数组,怎么办?
答:序列化成字符串,往出取的时候,自然还要反序列成 对象/数组/json格式等等.
这时候, flag的意义就体现出来了.
Expire的意义:
设置缓存的有效期,有3种格式
1:设置秒数, 从设定开始数,第N秒后失效.
2:时间戳, 到指定的时间戳后失效.
比如在团购网站,缓存的某团到中午12:00失效.
3: 设为0. 不自动失效.
注: 有种误会,设为0,永久有效.错误的.
1:编译memcached时,指定一个最长常量,默认是30天.
所以,即使设为0,30天后也会失效.
2:可能等不到30天,就会被新数据挤出去.
Replace 替换
Replace key flag expire length
参数和add完全一样
Delete 删除
Delete key
Delete key [time seconds]
加秒数之后,是指,被删除的key,N秒内不能再用,目的是让网站上的页面缓存也代谢完毕.
Get 查询
Get key
返回key的值
Set 是设置和修改值
参数和add ,replace一样,但功能不一样.
用add时, 如果内存中已经有name这个键,后续再add name键,增不上去.
但对于已经存在的键,可以用replace进行替换/更改
而set 想当于有add replace两者的功能.
Set key flag expire leng 时
如果服务器无此键 ----> 增加的效果
如果服务器有此键 ----> 修改的效果.
统计命令: stas
把memcached当前的运行信息统计出来
stats
STAT pid 2296 进程号
STAT uptime 4237 持续运行时间
STAT time 1370054990
STAT version 1.2.6
STAT pointer_size 32
STAT curr_items 4 当前存储的个数
STAT total_items 13
STAT bytes 236
STAT curr_connections 3
STAT total_connections 4
STAT connection_structures 4
STAT cmd_get 20
STAT cmd_set 16
STAT get_hits 13
STAT get_misses 7 // 这2个参数 可以算出命中率
STAT evictions 0
STAT bytes_read 764
STAT bytes_written 618
STAT limit_maxbytes 67108864
STAT threads 1
END
缓存有一个重要的概念: 命中率.
命中率是指: (查询到数据的次数/查询总数)*100%
如上, 13/(13+7) = 60+% , 的命中率.
Flush_all 清空所有的存储对象
缓存的5分钟法则:
如果5分钟内有可能再次访问,就有必要放在内存里,而不是硬盘里.
不要照搬这句话----要根据实际的业务来,像网站标题这样的,完全可以永久有效.
像微博这样,刷新非常快的,可以缓存30秒.
Memcached的内存管理
1:内存的碎片化
如果用C,语言直接 malloc,free来向操作系统申请和释放内存时,
在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用.
这种空闲,但无法利用内存的现象,---称为内存的碎片化.
2: memcached是如何克服内存的碎片化的?
Memcached用 slab allocator 机制来管理内存.
基本原理: 预告把内存划分成不同尺寸的小块, 需要存内容时,
判断内容的大小,为其选取合理的块.
3:对于固定大小的chunk,也会有浪费? 如何缓解?
答: 1:对于特定的网站,你可以长期的统计网站内缓存数据,按自己的网站的特点,设置chunk的大小.
4: 一般而言,观察缓存数据大小的变化规律,设置合理的生长因子. Grow factor
默认是1.25倍.
Memcached的过期数据删除机制
1: 当某个值过期后,并没有从内存删除, 只是你去get的时候,返回空.
2: 当某个新值去占用他的位置时,当成空chunk来占用.
即--这个过期,只是让用户看不到这个数据而已,并没有真正删除.
这个称为 lazy expiration ,惰性失效.
3: 如果chunk都满了, 又有新的值要加入, 要挤掉谁?
Memcached此处用的 LRU 删除机制.
(操作系统的内存管理,常用FIFO,LRU删除)
LRU: Least Recently Used 最近最少使用
FIFO: first in ,first out
原理: 当某个单元被请求时,维护一个计数器,通过计数器来判断最近谁最少被使用.
就把谁T出.