高性能内存对象缓存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语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读;跨平台,支持 Windows、 Linux、 *BSD 和 Mac Os;支持多种 I/O 多路复用技术, 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 服务脚本

<memcached_service.sh>

[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

<?php

phpinfo();

?>

测试网页进行正常访问

(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 扩展模块

<添加test.php>

[root@memcached-api html]# ls

test1.php test.php

[root@memcached-api html]# cat test.php

<?php

$memcache = new Memcached();

$memcache->addServer('192.168.10.101', 11211);

$memcache->set('key', 'Memcache test successful!', 0, 60);

$result = $memcache->get('key');

unset($memcache);

echo $result;

?>

在浏览器上进行测试

相关推荐
木鬼与槐3 小时前
MySQL高阶1831-每天的最大交易
数据库·mysql
晴天qt015 小时前
[mysql]mysql排序和分页
数据库·mysql
小张同学(恩师白云)6 小时前
SpringDataJPA基础增删改查
java·数据库
Jasonakeke8 小时前
【重学 MySQL】三十四、加密与解密函数
数据库·mysql
一知半解搞开发8 小时前
Mysql系列-索引简介
java·数据库·mysql
akhfuiigabv8 小时前
使用Neo4j-Cypher-FT实现自然语言查询图数据库
数据库·python·oracle·neo4j
Aa134517650258 小时前
c#中使用sql防注入方式写入数据
数据库·sql·c#
木木ainiks9 小时前
django自用教程
数据库·django·sqlite
akhfuiigabv9 小时前
探索Timescale Vector与Postgres数据库的融合:AI应用的新选择
数据库·人工智能·python
自身就是太阳9 小时前
Maven的高级特性
java·开发语言·数据库·后端·spring·maven