Memcached概述、基本操作指令以及部署
一:memcached的概述
1.1:memcached的定义
-
memcache是一套分布式的高速缓存系统,由LiveJournal的Bard Fitzpartrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度,提升效果十分显著。memcache是一套开放源代码软件,以BSD license授权发布的
-
以下是memcache官网(http://memcached.org/)
1.2:memcached的工作流程
- 工作流程:
- 先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作,如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份memcached中(memcache客户端不负责,需要程序明确实现);
- 每次更新数据库的同时更新memcached中的数据,保持一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效策略首先被替换,然后再替换掉最近未使用的数据
1.3:memcached的特点
-
memcached本质上是一个内存key-value缓存,它通过减轻数据库负载加速动态web应用。
-
memcached不支持数据的持久化,服务器关闭之后数据全部丢失。
-
memcached协议简单,使用的是基于文本行的协议。
-
memcached是多线程工作,redis是单线程工作,各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息
-
memcached服务器不具有分布式功能,分布式部署取决于memcache客户端
-
memcached用lazy expiration(懒淘汰)实现key过期
-
memcached通过提前分配内存保证运行性能,很少出现内存碎片
-
memcached使用非阻塞IO服用网络模型,目的是提高数据吞吐量
-
memecached使用listen/work的多线程模型,优点是能够充分利用多核,但是会带来一些锁冲突
-
对于memcached为什么不支持持久化,不支持复杂数据结构的解析?
- 业务决定技术方案,memcached以“以服务的方式,而不是库的方式管理KV内存”,为设计目标,它与其他缓存数据库不一样的是KV内存管理组件库,持久化和复杂数据结构并不是它的初衷
1.4:memcached的使用场景
-
数据查询缓存:将数据库的数据加载到memcached,提供程序的访问速度
-
计数器的场景:通过incr/decr命令实现评论数量、点击数统计、操作次数等场景
-
乐观锁实现:例如计划任务多实例部署的场景,通过CAS实现不重复执行
-
防重复处理命令:CAS命令
-
集群和分布式的区别:集群可以在单机或者多台机子上部署多个相同配置的服务;分布式在多台机子上部署多个不同服务
1.5:在分布式/群集redis/memcached/kafka/hadoop/mycat中使用到的一致性Hash算法
- 在集群增加或者减少机器的时候,如果用hash算法就会出现大面积缓存不足的情况,造成数据库服务器崩溃,所以此时出现了一致性hash算法。将数据存放在hash取模之后的一个节点,但是一致性hash算法无法解决负载均衡的问题,因为数据本身就是不均衡的。所以加强版本是增加虚拟节点,原因是虚拟节点越多,则数据尽可能均匀。但是虚拟节点是需要维护的,数量也有上限(2^32)。一致性hash算法是无法完全达到均匀数据的。
二:部署memcached
2.1:实验环境
-
两台centos 7.6
-
memcached服务器:20.0.0.51,安装服务:libevent-2.1.8-stable.tar.gz
memcached-1.5.6.tar.gz
-
lamp服务器:20.0.0.52,安装服务:memcached-1.5.6.tar.gz
httpd-2.4.29.tar.bz2
apr-1.6.2.tar.gz
apr-util-1.6.0.tar.gz
mysql-5.6.26.tar.gz
php-5.6.11.tar.bz2
-
2.2:实验原理图
- memcached服务器提供缓存数据库,在LAMP架构主机上安装memcache,memcache提供API接口,在LAMP上的php上调用这个接口,把数据缓存在memcached
2.3:配置memcached服务器
- 修改主机名
hostnamectl set-hostname memcached
- 安装事件通知库,libevent(可在memcached官网上下载)
'解压数据包'
tar xzvf libevent-2.1.8-stable.tar.gz -C /opt
cd /opt/libevent-2.1.8
'安装环境源'
yum install -y gcc gcc-c++ make
'编译、安装libevent'
./configure --prefix=/usr/local/libevent
make && make install
由于memcached安装依赖于libevent,所以必须先安装libevent
- 安装memcahed
'解压软件包'
tar xzvf memcached-1.5.6.tar.gz -C /opt
'手工编译安装'
cd /opt/memcached-1.5.6/
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make && make install
'优化memcached的执行文件'
ln -s /usr/local/memcached/bin/* /usr/local/bin
'开启memcached服务'
memcached -d -m 32m -p 11211 -u root
'-d守护进程;-m指定缓存大小;-p指定端口;-u指定用户'
'验证进程是否开启'
netstat -natp | grep 11211
[root@memcahced ~]# netstat -ntap |grep memc
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 20076/memcached
tcp6 0 0 :::11211 :::* LISTEN 20076/memcached
'关闭防火墙和SElinux功能'
systemctl stop firewalld.service
setenforce 0
'使用telnet连接memcached数据库'
'查看是否存在telnet功能,安装Telnet'
rpm -q telnet
yum install telnet -y
'连接数据库'
[root@memcahced ~]# telnet 192.168.43.101 11211
Trying 192.168.43.101...
Connected to 192.168.43.101.
Escape character is '^]'.
- memcached缓存数据库的命令操作
分组 | 命令 | 描述 |
---|---|---|
存储命令 | set | 用于将value存储在指定的key中。key已经存在,则更新该key所对应的原来的数据 |
add | 用于将value存储在指定的key中,存在则不更新 | |
replace | 替换已存在的key的value,不存在,则替换失败 | |
append | 命令用于向已经存在key的value后面追加数据 | |
prepend | 向已存在的key的value前面追加数据 | |
cas | 比较和替换,对比后,没有被其他用户修改的情况下才能写入 | |
检索命令 | get | 获取存储在key中的value,不存在,则返回空 |
gets | 获取带有CAS令牌存的value,若key不存在,则返回为空 | |
删除 | delete | 删除已存在的key |
计算 | incr/decr | 对已经存在的key的数据值进行自增或自减操作 |
统计 | stats | 返回统计信息例如PID、版本号、连接数等 |
stats items | 显示各个slab中item的数目和存储时长(最后一次访问距离现在的秒数) | |
stats sizes | 显示所有item的大小和个数 | |
stats slabs | 显示各个slab的信息,包括chunk的大小、数目、使用情况等 | |
清除 | flush_all | 清除所有内容 |
2.4:配置LAMP和memcache
- 修改主机名
hostnamectl set-hostname lamp
- 配置LAMP架构(手工编译),具体配置可以看我之前的博客
链接: https://blog.csdn.net/m0_47219942/article/details/107779877.
- 配置memcache
yum install autoconf -y
'解压memcache软件包'
[root@localhost ~]# tar xf memcache-2.2.7.tgz -C /opt/
手工编译安装
[root@localhost ~]# cd /opt/memcache-2.2.7/
[root@localhost memcache-2.2.7]# /usr/local/php5/bin/phpize
'配置,开启memeche,增加PHP模块'
[root@localhost memcache-2.2.7]# ./configure --enable-memcache --with-php-config=/usr/local/php5/bin/php-config
[root@localhost memcache-2.2.7]# vim /usr/local/php5/php.ini
'添加'
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20131226/"
extension = memcache.so '指向memcache模块'
[root@localhost memcache-2.2.7]# cd /usr/local/httpd/htdocs/
'编辑php测试页面'
[root@localhost htdocs]# vim index.php
<?php
$memcache = new Memcache();
$memcache->connect('20.0.0.52',11211);
$memcache->set('key','Memcache test Successfull!',0,60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
[root@localhost htdocs]# service httpd restart
2.5:验证配置
- 出现如下画面则,说明部署成功