高性能内存对象缓存Memcached

一、Memcached 基本概述

1.案例概述

Memcached是一款开源高性能分布式内存对象缓存系统,将数据存储在内存中,支持任何数据存储类型数据。使用Memcached提高网站访问速度。提别是拼房访问数据的大型网站。

Memcached 是C/S架构,需要构建 Memcached 服务端和Memcached API 客户端。
Memcached架构

2.数据存储方式与数据过期方式

(1)数据存储方式:Slab Allocation

Slab Allocation 即按组分配内存,每次先分配一个 Slab,相当于一个大小为 1M的页。然后,在 1M 的空间里根据数据划分大小相同的 Chunk,该方法可以有效解决内存碎片问题,但也可能会使内存空间产生浪费。

(2)数据过期方式:LRU、Laxzy Expiration

LUR 是指追加的数据空间不足时,会根据 LRU 的情况淘汰最近最少使用的记录。

Laxzy Expiration 即惰性过期,是指使用 get 时查看记录时间,从而检查记录是否已经过期。

3.Memcached 缓存机制

缓存是常驻在内存的数据,能够快速进行读取,而 Memcached 就是这样一款非常出色的缓存软件。当程序写入缓存数据请求时,Memcached 的 API 接口将 Key 输入路由算法模块并路由到集群中的一台服务器,之后由 API 接口与服务器进行通信,完成一次分布式缓存写入。

4.Memcached 分布式

Memcached分布式部署主要依赖于Memcached的客户来端实现,多个Memcached 服务器是独立的。分布式数据如何存储是由路由算法所决定。当数据到达客户端程序库,客户端的算法就依据路由算法来决定保的Memcached 服务器。读取数据时,客户端依据使用保存数据时相同的路由算法选中和存储数据时相同的服务器来读取数据。

5. Memcached 路由算法

(1)求余数 hash 算法

使用key运算得到一个整数,在做hash算法,根据余数进行路由。

适合大多数据需求,不适合在动态变化环境中。

(2)一致性 hash 算法

按照hash算法把对应的key通过一定的hash处理后形成首尾相接闭合循环通过与对象存储一样的hash算法映射到环中,顺时针将所有对象存储到离自己最近的机器中。

适合动态变化环境中。

二、实验环境

|-----|-----------|------------------------------|------------------------------------------------------------------------------------------|
| 主机 | 操作系统 | 主机名/IP地址 | 主要软件及版本 |
| 服务器 | Centos7.9 | Memcache1/192.168.10.101 | libevent-2.1.8-stable.tar.gz memcached-1.5.1.tar.gz memcached-1.2.8-repcached-2.2.tar.gz |
| 服务器 | Centos7.9 | Memcache2/192.168.10.102 | libevent-2.1.8-stable.tar.gz memcached-1.2.8-repcached-2.2.tar.gz |
| 客户端 | Centos7.9 | Memcached-API/192.168.10.103 | httpd-2.4.25.tar.gz php-5.5.38.tar.gz libmemcached-1.0.18.tar.gz memcached-2.2.0.tgz |

1.单memcached节点缓存系统

(1)设置各节点的主机名

主机:192.168.10.101

root@localhost \~\]# hostnamectl set-hostname Memcache1 \[root@localhost \~\]# bash 主机:192.168.10.102 \[root@localhost \~\]# hostnamectl set-hostname Memcache2 \[root@localhost \~\]# bash 主机:192.168.10.103 \[root@localhost \~\]# hostnamectl set-hostname Memcached-API \[root@localhost \~\]# bash #### **(2)安装** **Memcached** **服务器 101** **安装** **Libevent** \[root@memcache1 \~\]# systemctl stop firewalld \[root@memcache1 \~\]# yum -y install gcc\* \[root@memcache1 \~\]# tar zxvf libevent-2.1.8-stable.tar.gz \[root@memcache1 \~\]# cd libevent-2.1.8-stable \[root@memcache1 libevent-2.1.8-stable\]# ./configure --prefix=/usr/local/libevent \[root@memcache1 libevent-2.1.8-stable\]# make \&\& make install 备注: Libevent 是一个用[C语言](https://baike.baidu.com/item/C%E8%AF%AD%E8%A8%80/105958 "C语言")[编写](https://baike.baidu.com/item/%E7%BC%96%E5%86%99/1517598 "编写")的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 \*BSD 和 Mac Os;支持多种 I/O [多路复用技术](https://baike.baidu.com/item/%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8%E6%8A%80%E6%9C%AF/5785640 "多路复用技术"), epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。 Libevent 已经被广泛的应用,作为底层的网络库;比如 memcached、 Vomit、 Nylon、 Netchat等等。 **安装** **Memcached** \[root@memcache1 \~\]# tar zxvf memcached-1.5.1.tar.gz \[root@memcache1 \~\]# cd memcached-1.5.1 \[root@memcache1 memcached-1.5.1\]# ./configure \\ --prefix=/usr/local/memcached \\ --with-libevent=/usr/local/libevent \[root@memcache1 memcached-1.5.1\]# make \&\& make install ****设置**** ****Memcached**** ****服务脚本**** \ \[root@memcache1 \~\]# yum -y install psmisc 备注: psmisc提供了killall命令 \[root@memcache1 \~\]# chmod 755 /usr/local/memcached/memcached_service.sh \[root@memcache1 \~\]# /usr/local/memcached/memcached_service.sh start (绝对路径) 或 \[root@memcache1 \~\]# ./memcached_service.sh start (当前路径) \[root@memcache1 \~\]# netstat -anpt \| grep memcached tcp 0 0 0.0.0.0:11211 0.0.0.0:\* LISTEN 20564/memcached tcp6 0 0 :::11211 :::\* LISTEN 20564/memcached ### 2.Memcached API 客户端 103 #### (1)基本环境安装 \[root@memcached-api \~\]# systemctl stop firewalld \[root@memcached-api \~\]# setenforce 0 \[root@memcached-api \~\]# yum -y install gcc\* \<利用ali 仓库\> \[root@memcached-api \~\]#yum -y install httpd mariadb mariadb-server php php-devel php-mysql \[root@memcached-api \~\]# systemctl start mariadb \[root@memcached-api \~\]# mysqladmin -uroot password 'pwd123' \[root@memcached-api \~\]# systemctl start httpd \[root@memcached-api \~\]# cd /var/www/html/ \[root@memcached-api html\]# ls \[root@memcached-api html\]# vim test1.php \ 测试网页进行正常访问 ![](https://i-blog.csdnimg.cn/direct/3741188738c84bc6bd81c922f8177f79.png) #### (2)编译安装 Libmemcached \<安装 Libmemcached\> \[root@memcached-api \~\]# tar zxvf libmemcached-1.0.18.tar.gz \[root@memcached-api \~\]# cd libmemcached-1.0.18 \[root@memcached-api libmemcached-1.0.18\]# ./configure \\ --prefix=/usr/local/libmemcached \\ --with-memcached=/usr/local/memcached \[root@memcached-api libmemcached-1.0.18\]# make \&\& make install 备注: libmemcached 是一个 memcached 的库,客户端库,C 和 C++ 语言实现的客户端库,具有低内存占用率、线程安全、并提供对memcached功能的全面支持 \<安装memcached-2.2.0.tgz\> 方法一:如果lamp是用yum安装的,使用如下方法 \[root@memcached-api \~\]# yum -y install zlib zlib-devel \[root@memcached-api \~\]# tar -xzvf memcached-2.2.0.tgz \[root@memcached-api \~\]# cd memcached-2.2.0/ \[root@memcached-api memcached-2.2.0\]# /usr/bin/phpize \[root@memcached-api memcached-2.2.0\]# ./configure --with-php-config=/usr/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl --with-zlib-dir 备注: 1. SASL全称Simple Authentication and Security Layer,是一种用来扩充C/S模式验证能力的机制。简单来说SASL是一个胶合(glue)库,通过这个库把应用层与形式多样的认证系统整合在一起。这有点类似于 PAM,但是后者是认证方式,决定什么人可以访问什么服务,而SASL是认证过程,侧重于信任建立过程,这个过程可以调用PAM来建立信任关系。在这里Memcached就是上面提到的应用层,具体的认证交给SASL库,SASL会根据相应的认证机制来完成验证功能。 \[root@memcached-api memcached-2.2.0\]# make \&\& make install 方法二:如果lamp是用源码包安装的,使用如下方法 \[root@memcached-api \~\]# tar -xzvf memcached-2.2.0.tgz \[root@memcached-api \~\]# cd memcached-2.2.0/ \[root@memcached-api memcached-2.2.0\]# /usr/local/php5/bin/phpize 备注: 此命令可以在memcached-2.2.0下生成memcached的配置脚本 phpize命令需要autoconf包的支持 :yum -y install autoconf \[root@memcached-api memcached-2.2.0\]# cp -r /usr/local/php5/include/php/ext/ ./ \[root@memcached-api memcached-2.2.0\]# ./configure \\ --enable-memcached \\ --with-php-config=/usr/local/php5/bin/php-config \\ 指定配置脚本位置 --with-libmemcached-dir=/usr/local/libmemcached \\ --disable-memcached-sasl \[root@memcached-api memcached-2.2.0\]# make \[root@memcached-api memcached-2.2.0\]# make test 注意: 最后会提示发送邮件报告,可以选否(n) \[root@memcached-api memcached-2.2.0\]# make install #### (3)****配置**** ****PHP**** ****添加**** ****Memcached**** ****组件**** 添加Memcached 方法一:如果使用的yum安装的php, \[root@memcache2 \~\]# vim /etc/php.ini 去掉extension_dir=" " 只添加extension=memcached.so 方法二:源码包安装 \[root@memcached-api \~\]# ****cd /usr/local/php5/**** \[root@memcached-api php5\]# ****vim php.ini**** extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-zts-20121212/" extension=memcached.so \[root@memcached-api php5\]# systemctl restart httpd 在浏览器测试即可,查看是否已经添加 Memcached 扩展模块 ![](https://i-blog.csdnimg.cn/direct/fa74765497744f4e90750cf08a779150.png) \<添加test.php\> \[root@memcached-api html\]# ls test1.php test.php \[root@memcached-api html\]# cat test.php \addServer('192.168.10.101', 11211); $memcache-\>set('key', 'Memcache test successful!', 0, 60); $result = $memcache-\>get('key'); unset($memcache); echo $result; ?\> 在浏览器上进行测试 ![](https://i-blog.csdnimg.cn/direct/b20e2f42a43f4b2aae98523946e5ff86.png)

相关推荐
悟空打码1 小时前
MyBatis源码解读5(3.1、缓存简介)
缓存·mybatis
极小狐2 小时前
极狐GitLab 容器镜像仓库功能介绍
java·前端·数据库·npm·gitlab
极小狐2 小时前
如何构建容器镜像并将其推送到极狐GitLab容器镜像库?
开发语言·数据库·机器学习·gitlab·ruby
阿四啊2 小时前
【Redis实战篇】分布式锁-Redisson
数据库·redis·分布式
_星辰大海乀2 小时前
数据库约束
java·数据结构·数据库·sql·链表
一只fish2 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(1)
数据库·mysql
AI大模型顾潇3 小时前
[特殊字符] 本地部署DeepSeek大模型:安全加固与企业级集成方案
数据库·人工智能·安全·大模型·llm·微调·llama
FAQEW3 小时前
MongDB和MySQL的区别
数据库·mysql·mongdb·区别
码农飞哥3 小时前
互联网大厂Java面试实战:Spring Boot到微服务的技术问答解析
java·数据库·spring boot·缓存·微服务·消息队列·面试技巧
niechel3 小时前
02-GBase 8s 事务型数据库 客户端工具dbaccess
数据库