memcached原理详述及配置
如果一个网站流量很大,则查询数据库将会耗费大量时间。如果将经常查询的的数据和对象缓存到内存中,则需要查询数据库时,直接返回内存中缓存的数据。这中静态化方式则会高效很多。分布式缓存系统是为了解决数据库服务器和web服务器直接的瓶颈。其中memcached是一个开源、高性能、分布式的内存对象缓存系统。主要通过在内存中缓存数据和对象减轻数据库的负载来加速动态web程序。内存中缓存的数据通
过API的方式被存取,数据就像一张大的HASH表,以键-值对方式存在。
读取
执行读取操作的顺序是从 Web 层获取请求(需要执行一次数据库查询)并检查之前在缓存中存储的查询结果。如果我找到所需的值,则返回它。如果未找到,则执行查询并将结果存储在缓存中,然后再将结果返回给 Web 层。
写入
将数据写入到数据库中时,首先需要执行数据库写入操作,然后将之前缓存的任何受此写入操作影响的结果设定为无效。此过程有助于防止缓存和数据库之间出现数据不一致性。
Memcached采用client/server架构,服务端启动守护进程,等待clent请求到达,采用异步I/O,使用libevenet作为事件通知机制。可以建设多个服务端协同工作,但这些服务端之间并不通信,每个server端对自己的数据进行管理,客户端制定server端IP和端口进行通信。缓存在内存中的数据并不会同步到磁盘上,因此,重启后缓存的数据就会丢失。当缓存数据的总大小达到初始设置值时,就会使用LRU算法删除不用的缓存。
Memcached采用slaballocation机制分配和管理内存,其原理是将内存分割成各种尺寸的块chunk,Chunk就是用来存储key-value数据的最小单位,把尺寸相同的块分成组(slab class) ,每个slab class的大小可以在memcached启动时制定GrowethFactor控制,默认值为1.25。这些内存块不会释放,可重复利用。
可同过以下命令看到slab class生成过程:
#/usr/local/memcached/bin/memcached -d -f 1.25 -n 50 -vvv -u nobody slabclass 1: chunk size 104 perslab 10082 slabclass 2: chunk size 136 perslab 7710 slabclass 3: chunk size 176 perslab 5957 slabclass 4: chunk size 224 perslab 4681 slabclass 5: chunk size 280 perslab 3744 slabclass 6: chunk size 352 perslab 2978 slabclass 7: chunk size 440 perslab 2383 slab class 8: chunk size 552 perslab 1899 slabclass 9: chunk size 696 perslab 1506 slabclass 10: chunk size 872 perslab 1202 slabclass 11: chunk size 1096 perslab 956 slabclass 12: chunk size 1376 perslab 762 slabclass 13: chunk size 1720 perslab 609 slabclass 14: chunk size 2152 perslab 487 slabclass 15: chunk size 2696 perslab 388 slabclass 16: chunk size 3376 perslab 310 slabclass 17: chunk size 4224 perslab 248 slabclass 18: chunk size 5280 perslab 198 slabclass 19: chunk size 6600 perslab 158 slabclass 20: chunk size 8256 perslab 127 slabclass 21: chunk size 10320 perslab 101 slabclass 22: chunk size 12904 perslab 81 slabclass 23: chunk size 16136 perslab 64 slabclass 24: chunk size 20176 perslab 51 slabclass 25: chunk size 25224 perslab 41 slabclass 26: chunk size 31536 perslab 33 slabclass 27: chunk size 39424 perslab 26 slabclass 28: chunk size 49280 perslab 21 slabclass 29: chunk size 61600 perslab 17 slabclass 30: chunk size 77000 perslab 13 slabclass 31: chunk size 96256 perslab 10 slabclass 32: chunk size 120320 perslab 8 slabclass 33: chunk size 150400 perslab 6 slabclass 34: chunk size 188000 perslab 5 slabclass 35: chunk size 235000 perslab 4 slabclass 36: chunk size 293752 perslab 3 slabclass 37: chunk size 367192 perslab 2 slabclass 38: chunk size 458992 perslab 2 slabclass 39: chunk size 573744 perslab 1 slabclass 40: chunk size 717184 perslab 1 slabclass 41: chunk size 1048576 perslab 1 <26server listening (auto-negotiate) <27server listening (auto-negotiate) <28send buffer was 124928, now 268435456 <32send buffer was 124928, now 268435456 <31server listening (udp) <35server listening (udp) <30server listening (udp) <34server listening (udp) <29server listening (udp) <33server listening (udp) <28server listening (udp) <32server listening (udp)
Memcached
常用选项说明
-l <ip_addr>
:指定进程监听的地址;
-d:
以
daemon
模式运行;
-u <username>
:以指定的用户身份运行
memcached
进程;
-m <num>
:用于缓存数据的最大内存空间,单位为
MB
,默认为
64MB
;
-c <num>
:最大支持的并发连接数,默认为
1024
;
-p <num>:
指定监听的
TCP
端口,默认为
11211
;
-U <num>
:指定监听的
UDP
端口,默认为
11211
,
0
表示关闭
UDP
端口;
-t <threads>
:用于处理入站请求的最大线程数,仅在
memcached
编译时开启了支持线程才有效;
-f <num>
:设定
Slab Allocator
定义预先分配内存空间大小固定的块时使用的增长因子;
-M
:当内存空间不够使用时返回错误信息,而不是按
LRU
算法利用空间;
-n:
指定最小的
slab chunk
大小;单位是字节;
-S:
启用
sasl
进行用户认证;需要在编译时指定
—enable-sasal
当Memcached接收到客户端发送过来的数据时首先会根据收到数据的大小选择一个最合适的Slab Class,然后通过查询Memcached保存着的该Slab Class内空闲Chunk的列表就可以找到一个可用于存储数据的Chunk。当一条数据库过期或者丢弃时,该记录所占用的Chunk就可以回收,重新添加到空闲列表中。从以上过程我们可以看出Memcached的内存管理制效率高,而且不会造成内存碎片,但是它最大的缺点就是会导致空间浪费。因为每个 Chunk都分配了特定长度的内存空间,所以变长数据无法充分利用这些空间。如图所示,将100个字节的数据缓存到128个字节的Chunk中,剩余的28个字节就浪费掉了。
安装libevent
Libevent是memcached所依赖的异步事件通知库,在安装memcached的之前需要安装它。
# cdlibevent-2.0.22-stable # ./configure –prefix=/usr/local/libevetn # make # make install
# cd memcached-1.4.24 # ./configure--prefix=/usr/local/memcached --with-libevent=/usr/local/libevent # make # make install
为memcached体佛那个SysV风格服务启动脚本
# vim/etc/init.d/memcached
#!/bin/bash # # Init file formemcached # # chkconfig: - 86 14 # description:Distributed memory caching daemon # # processname:memcached # config:/etc/sysconfig/memcached./etc/rc.d/init.d/functions # ## Default variables PORT="11211" USER="nobody" MAXCONN="1024" CACHESIZE="64" OPTIONS=""RETVAL=0 prog="/usr/local/memcached/bin/memcached" desc="Distributedmemory caching" lockfile="/var/lock/subsys/memcached"start() {echo -n $"Starting $desc(memcached): "daemon $prog -d -p $PORT -u $USER -c$MAXCONN -m $CACHESIZE "$OPTIONS"RETVAL=$?echo[ $RETVAL -eq 0 ] && touch$lockfilereturn $RETVAL } stop() {echo -n $"Shutting down $desc(memcached): "killproc $progRETVAL=$?echo[ $RETVAL -eq 0 ] && rm -f$lockfilereturn $RETVAL }restart() {stopstart }reload() {echo -n $"Reloading $desc ($prog):"killproc $prog -HUPRETVAL=$?echoreturn $RETVAL }case "$1" instart)start;;stop)stop;;restart)restart;; condrestart)[ -e $lockfile ] && restartRETVAL=$?;;reload)reload;;status)status $progRETVAL=$?;;*)echo $"Usage: $0{start|stop|restart|condrestart|status}"RETVAL=1 esacexit $RETVAL
# chmod +x/etc/init.d/memcached
基本 memcached 客户机命令
set
添加新的键值对,如果以存在,将会重写
add
当缓存中不存在键时,add
命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且将 获得响应NOT_STORED。
replace
仅当键已经存在时,replace
命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到 一条 NOT_STORED 响应。
get
命令用于检索与之前添加的键值对相关的值。
gets 同get,但返回的信息要多余get
delete
用于删除 memcached 中的任何现有值。您将使用一个键调用 delete
,如果该键存在于缓存中,则删除该值。如果不存 在,则返回一条 NOT_FOUND 消息。
append 在一个存在的项后增加数据。
prepend 在一个存在的项首增加数据
stats 当前memcached实例信息
flush_all 清理缓存中的所有键值对
stats slabs显示slabs信息,可以获取每个slabs的chunksize长度,从而确定数据到底保存在哪个slab
stats items 显示slab中item数目
修改命令语法:
command <key><flags> <expiration time> <byte>
<value>
key
用于查找缓存值
flags
可以包括键值对的×××参数,客户机使用它存储关于键值对的额外信息
expiration time
缓存中保存键值对的时间,秒为单位,
0
表示永远
bytes
缓存中存储的字节
value
存储的值
# telnet localhost 11211 set xiaobai 0 0 3 123 STORED add xiaobai 0 0 3 123 NOT_STORED get xiaobai VALUE xiaobai 0 3 123 END gets xiaobai VALUE xiaobai 0 3 32 123 END append xiaobai 0 0 3 456 STORED get xiaobai VALUE xiaobai 0 6 123456 END prepend xiaobai 0 0 3 789 STORED get xiaobai VALUE xiaobai 0 9 789123456 END delete xiaobai DELETED get xiaobai END
安装memcached的php扩展
#cd memcache-2.2.7 # /usr/local/php/bin/phpize #./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcache #make #make install 安装完成后会提示 Installingshared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20100525/
#mkdir /etc/php.d #vim /etc/php.d/memcache.iniextension = /usr/local/php/lib/php/extensions/no-debug-zts-20100525/memcache.so 或vim /etc/php.iniextension =/usr/local/php/lib/php/extensions/no-debug-zts-20100525/memcache.so
测试PHP扩展是否安装成功
#vim /usr/html/test.php <?php $mem= new Memcache; $mem->connect('127.0.0.1',11211); $mem->set('test','Hello xiaoming',0,12); $val= $mem->get('test'); echo$val; ?>
转载于:https://blog.51cto.com/mingxiao/1655764
memcached原理详述及配置相关推荐
- MariaDB/MySQL备份和恢复(三):xtrabackup用法和原理详述
MariaDB/MySQL备份恢复系列: 备份和恢复(一):mysqldump工具用法详述 备份和恢复(二):导入.导出表数据 备份和恢复(三):xtrabackup用法和原理详述 xtrabacku ...
- Nginx 反向代理工作原理简介与配置详解
Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...
- SPI 通信原理详述
SPI 通信原理详述 1.物理层 1.1 SPI接口 1.2 SPI互连 2 协议层 2.1 SPI时序 1)时钟极性 2)时钟相位 2.2数据格式 3.传输速率 4 优缺点 SPI(Serial P ...
- kafka入门:简介、使用场景、设计原理、主要配置及集群搭建
为什么80%的码农都做不了架构师?>>> kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 问题导读: 1.zookeeper在kafka的作用是什么? 2. ...
- Windows下Memcached的安装与配置
Windows下Memcached的安装与配置 安装: 1.下载memcached, http://www.danga.com/memcached/ ; 2.解压,比如放在 D:\memcached- ...
- 使用LVS实现负载均衡原理及安装配置详解
使用LVS实现负载均衡原理及安装配置详解 负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均 ...
- SpringBoot核心原理:自动配置、事件驱动、Condition
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/l6108003/article/ details/106966386 前言 SpringBoot是Spring的包装,通过自动 ...
- Memcached原理与应用
Memcached原理与应用 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.Memcached是什么 高性能 支持高并发 分布式内存缓存 ...
- Nginx 教程(一)-- 工作原理及安装配置
Nginx简介 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在一个BSD-like协议下发行,由俄罗斯人IgorSysoev开发,共俄罗斯大型的搜索 ...
最新文章
- 实事求实来看综合布线网络
- bios文件查看工具_修改BIOS让老主板支持NVMe固态硬盘
- es6 之 generator(-)
- SpringBoot最简单服务配置
- 网络协议分层及报文格式大全
- 使用贝赛尔路径(UIBezierPath)创建画板
- CreateRemoteThread函数
- springmvc注解@RequestMapping
- void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
- android shape使用总结
- python爬虫做毕业论文_基于Python的网络爬虫(智联招聘)开发与实现毕业论文+作品源码+演示视频...
- 如何寻找综述性论文?
- 【VSCode教程】 C++第一个DLL、远离手动GCC、快速自动生成、来 say_helloヽ(^o^)丿
- HDU 6164 Dying Light(计算几何)
- java音乐_用JavaJFugue进行音乐编程
- 《数据库》数据库的备份与恢复
- 【每日早报】2019/09/18
- javascript setTimeout 参数最大值问题和递归调用
- python提取数据指定列_Python:提取特定列数据并将其存储到变量中
- RHEL8(红帽8正式版)新特性及使用方法
热门文章
- 理解 UDDI(统一描述、发现和集成)
- 扫盲篇:用户体验不等于可用性
- topcoder srm 330 div1
- Handler、Looper与MessageQueue源码分析
- 微信JSApi支付~微信支付代理模式的实现(原创)
- 我的存储解决方案理论
- Android Tabhost with FragmentActivity
- 关于Webpack详述系列文章 (第四篇)
- 企业项目构建学习(一)maven
- FFmpeg #39;scale#39; filter not present, cannot convert pixel formats.