Linux 缓存之memcached详解

本文深入解析Memcached,一款高性能、分布式内存对象缓存系统,重点介绍其工作原理、特点、存储方式及在LNMP环境下的安装配置与PHP操作实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是memcached

Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据,如字符串、对象等。

它是缓存服务器,但本身无法决定缓存任何数据,一半依赖于客户端,一半依赖于服务器,它自身只提供存储能力,但存储哪些数据,如何存是由客户端决定的。

二、memcached特点
memcached作为高速运行的分布式缓存服务器,具有以下的特点

简单key/value存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可。存储项由“键、过期时间、可选的标志及数据”四个部分组成;
功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期;
各服务器间彼此无视:不在服务器间进行数据同步;
O(1)的执行效率
清理超期数据:默认情况下,Memcached是一个LRU缓存,同时,它按事先预订的时长清理超期数据;但事实上,memcached不会删除任何已缓存数据,只是在其过期之后不再为客户所见;而且,memcached也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长;
补充:libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。


三、memcached存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

四、memcached安装与配置

系统环境

CentOS7.4

1 安装软件包
[root@proxy ~]#yum -y install memcached

查看生成的文件
[root@proxy ~]# rpm -ql memcached
/etc/sysconfig/memcached
/usr/bin/memcached
/usr/bin/memcached-tool
/usr/lib/systemd/system/memcached.service
/usr/share/doc/memcached-1.4.15
/usr/share/doc/memcached-1.4.15/AUTHORS
/usr/share/doc/memcached-1.4.15/CONTRIBUTORS
/usr/share/doc/memcached-1.4.15/COPYING
/usr/share/doc/memcached-1.4.15/ChangeLog
/usr/share/doc/memcached-1.4.15/NEWS
/usr/share/doc/memcached-1.4.15/README.md
/usr/share/doc/memcached-1.4.15/protocol.txt
/usr/share/doc/memcached-1.4.15/readme.txt
/usr/share/doc/memcached-1.4.15/threads.txt
/usr/share/man/man1/memcached-tool.1.gz
/usr/share/man/man1/memcached.1.gz

2 memcached配置文件

[root@proxy ~]# vim /usr/lib/systemd/system/memcached.service
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS

[root@proxy ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""


3、memcached常用选项说明

-l <ip_addr>:指定进程监听的地址;
-d: 以服务模式运行;
-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进行用户认证;
4、启动memcached服务

[root@proxy ~]# systemctl restart memcached
[root@proxy ~]# ss -antulp | grep memcached
udp    UNCONN     0      0         *:11211                 *:*                   users:(("memcached",pid=5736,fd=28))
udp    UNCONN     0      0        :::11211                :::*                   users:(("memcached",pid=5736,fd=29))
tcp      LISTEN        0    128      *:11211                 *:*                  users:(("memcached",pid=5736,fd=26))
tcp      LISTEN        0    128        :::11211               :::*                  users:(("memcached",pid=5736,fd=27))

5、memcached相关命令首先连接memcached

[root@proxy ~]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.

查看状态统计信息
stats
STAT pid 5788
STAT uptime 25
STAT time 1453373921
STAT version 1.4.5
STAT pointer_size 64
STAT rusage_user 0.000000
STAT rusage_system 0.011998
STAT curr_connections 10
STAT total_connections 11
STAT connection_structures 11
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT get_hits 0
STAT get_misses 0
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 9
STAT bytes_written 7
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 0
STAT curr_items 0
STAT total_items 0
STAT evictions 0
STAT reclaimed 0
END


使用telnet连接服务器测试memcached服务器功能,包括增、删、改、查等操作。
 

[root@proxy ~]# telnet  localhost  11211
Trying ::1..
……
##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
set name 0 180 3                //定义变量,变量名称为name
plj                            //输入变量的值,值为plj                
STORED
get name                        //获取变量的值
VALUE name 0 3                 //输出结果
plj
END
##提示:0表示不压缩,180为数据缓存时间,3为需要存储的数据字节数量。
add myname 0 180 10            //新建,myname不存在则添加,存在则报错
set myname 0 180 10            //添加或替换变量
replace myname 0 180 10        //替换,如果myname不存在则报错
get myname                    //读取变量
append myname 0 180 10        //向变量中追加数据
delete myname                    //删除变量
stats                        //查看状态
flush_all                        //清空所有
quit                            //退出登录                                  

 

6  部署LNMP+memcached网站平台,通过PHP页面实现对memcached服务器的数据操作 

具体的LNMP环境部署过程在此就不在赘述了,前面篇章有介绍。

 先查看每个服务运行状况:

[root@proxy ~]# ss -antulp | grep nginx
tcp    LISTEN     0      128       *:80                    *:*                   users:(("nginx",pid=10557,fd=6),("nginx",pid=4746,fd=6))

[root@proxy ~]# ss -antulp | grep 9000
tcp    LISTEN     0      128    127.0.0.1:9000                  *:*                   users:(("php-fpm",pid=10689,fd=0),("php-fpm",pid=10688,fd=0),("php-fpm",pid=10687,fd=0),("php-fpm",pid=10686,fd=0),("php-fpm",pid=10685,fd=0),("php-fpm",pid=10683,fd=6))

[root@proxy ~]# ss -antulp | grep 3306
tcp    LISTEN     0      50        *:3306                  *:*                   users:(("mysqld",pid=5548,fd=14))

[root@proxy ~]# ss -antulp | grep 11211
udp    UNCONN     0      0         *:11211                 *:*                   users:(("memcached",pid=5736,fd=28))
udp    UNCONN     0      0        :::11211                :::*                   users:(("memcached",pid=5736,fd=29))
tcp    LISTEN     0      128       *:11211                 *:*                   users:(("memcached",pid=5736,fd=26))
tcp    LISTEN     0      128      :::11211                :::*                   users:(("memcached",pid=5736,fd=27))

创建PHP页面,使用PHP语言测试memcached服务

 [root@proxy ~]# vim /usr/local/nginx/html/test.php
<?php
$memcache=new Memcache;                //创建memcache对象
$memcache->connect('localhost',11211) or die ('could not connect!!');
$memcache->set('key','test');             //定义变量
$get_values=$memcache->get('key');        //获取变量值
echo $get_values;
?>

为PHP添加memcache扩展,需要给PHP安装扩展模块才可以连接memcached数据库

[root@proxy ~]# yum -y install  php-pecl-memcache
[root@proxy ~]# systemctl restart php-fpm

客户端使用浏览器访问服务器PHP首页文档,检验对memcached的操作是否成功

[root@client ~]# firefox http://192.168.4.5/test.php

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值