当前位置: 首页 > news >正文

Memcached开发(八):使用PHP进行操作

目录

1. 安装与配置

1.1 安装Memcached服务器

1.2 安装PHP的Memcached扩展

2. 基本操作

2.1 连接Memcached服务器

2.2 设置与获取数据

2.3 删除数据

2.4 检查数据是否存在

2.5 添加和替换数据

3. 高级操作

3.1 批量操作

3.2 数据计数器

3.3 CAS(Check and Set)

3.4 持久连接

3.5 压缩数据

4. 性能优化

4.1 使用一致性哈希

4.2 增加服务器节点

4.3 使用内存优化选项

4.4 调整PHP的Memcached配置

5. 错误处理与调试

5.1 检查操作结果

5.2 启用详细日志

5.3 使用Memcached的统计信息

6. 示例

6.1 缓存数据库查询结果

6.2 缓存API响应

7. 代码示例与项目实战

7.1 简单的PHP缓存类

7.2 完整的Web应用缓存示例

8. 总结


Memcached是一种高性能的分布式内存对象缓存系统,广泛应用于加速动态Web应用程序。PHP作为一种流行的服务器端脚本语言,与Memcached的结合可以极大地提升Web应用程序的性能。在本章中,我们将详细介绍如何在PHP中使用Memcached,包括安装和配置、基本操作、进阶技巧和性能优化等内容。

1. 安装与配置

1.1 安装Memcached服务器

首先,我们需要在服务器上安装Memcached。可以使用包管理工具来安装。

对于Debian/Ubuntu系统:

sudo apt-get update
sudo apt-get install memcached

对于CentOS/RHEL系统:

sudo yum install memcached

安装完成后,启动Memcached服务:

sudo systemctl start memcached
sudo systemctl enable memcached

1.2 安装PHP的Memcached扩展

要在PHP中使用Memcached,需要安装PHP的Memcached扩展。

对于Debian/Ubuntu系统:

sudo apt-get install php-memcached

对于CentOS/RHEL系统:

sudo yum install php-pecl-memcached

安装完成后,重启Web服务器(例如Apache或Nginx)以使扩展生效。

sudo systemctl restart apache2  # For Apache
sudo systemctl restart nginx    # For Nginx

2. 基本操作

2.1 连接Memcached服务器

在PHP中使用Memcached,首先需要创建一个Memcached对象,并连接到Memcached服务器。

<?php
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);

2.2 设置与获取数据

可以使用set方法将数据存储到Memcached中,并使用get方法从Memcached中获取数据。

<?php
// 设置数据
$memcached->set('key', 'value', 60); // 60秒后过期// 获取数据
$value = $memcached->get('key');
echo $value; // 输出 'value'

2.3 删除数据

使用delete方法可以从Memcached中删除数据。

<?php
// 删除数据
$memcached->delete('key');

2.4 检查数据是否存在

可以使用get方法结合false检查数据是否存在。

<?php
$value = $memcached->get('key');
if ($value === false) {echo '数据不存在或已过期';
} else {echo '数据存在:' . $value;
}

2.5 添加和替换数据

使用add方法可以在键不存在时设置数据,使用replace方法可以在键存在时替换数据。

<?php
// 添加数据(仅当键不存在时生效)
$memcached->add('key', 'new_value', 60);// 替换数据(仅当键存在时生效)
$memcached->replace('key', 'replaced_value', 60);

3. 高级操作

3.1 批量操作

Memcached支持批量设置和获取数据。

<?php
// 批量设置数据
$memcached->setMulti(['key1' => 'value1','key2' => 'value2','key3' => 'value3'
], 60);// 批量获取数据
$values = $memcached->getMulti(['key1', 'key2', 'key3']);
print_r($values);

3.2 数据计数器

Memcached支持对数值进行增减操作。

<?php
// 设置计数器
$memcached->set('counter', 0);// 增加计数器
$memcached->increment('counter', 1); // 增加1// 减少计数器
$memcached->decrement('counter', 1); // 减少1// 获取计数器值
$counter = $memcached->get('counter');
echo $counter; // 输出当前计数器值

3.3 CAS(Check and Set)

CAS操作允许你在设置数据前检查其版本,确保数据的一致性。

<?php
// 获取数据和CAS token
$value = $memcached->get('key', null, $cas_token);// 更新数据,使用CAS token
$memcached->cas($cas_token, 'key', 'new_value', 60);

3.4 持久连接

Memcached支持持久连接,可以减少连接开销。

<?php
$memcached = new Memcached('persistent_id');
$memcached->addServer('localhost', 11211);

3.5 压缩数据

为了节省内存,可以启用数据压缩。

<?php
$memcached->setOption(Memcached::OPT_COMPRESSION, true);
$memcached->set('key', 'large_value', 60);

4. 性能优化

4.1 使用一致性哈希

一致性哈希可以在增加或删除服务器时减少缓存失效的情况。

<?php
$memcached->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$memcached->addServer('server1', 11211);
$memcached->addServer('server2', 11211);

4.2 增加服务器节点

为了提高性能,可以增加Memcached服务器节点,实现负载均衡。

<?php
$memcached->addServer('server1', 11211);
$memcached->addServer('server2', 11211);
$memcached->addServer('server3', 11211);

4.3 使用内存优化选项

可以通过配置Memcached服务器的启动参数来优化内存使用。例如,使用较大的内存池和设置较大的最大对象大小。

memcached -m 1024 -I 2m

4.4 调整PHP的Memcached配置

可以通过php.ini文件调整Memcached扩展的配置参数,例如启用二进制协议和设置连接超时时间。

[memcached]
memcached.sess_binary = On
memcached.sess_connect_timeout = 1000

5. 错误处理与调试

5.1 检查操作结果

在进行Memcached操作后,可以使用getResultCodegetResultMessage方法检查操作结果。

<?php
$memcached->set('key', 'value');
$result_code = $memcached->getResultCode();
$result_message = $memcached->getResultMessage();
echo "Result code: $result_code, Result message: $result_message";

5.2 启用详细日志

可以启用Memcached的详细日志,以便调试和分析问题。

memcached -vv

5.3 使用Memcached的统计信息

可以使用getStats方法获取Memcached服务器的统计信息。

<?php
$stats = $memcached->getStats();
print_r($stats);

6. 示例

6.1 缓存数据库查询结果

在Web应用程序中,缓存数据库查询结果是提高性能的常见方法。

<?php
$query = "SELECT * FROM users WHERE id = 1";
$cache_key = md5($query);// 尝试从缓存获取数据
$data = $memcached->get($cache_key);if ($data === false) {// 缓存未命中,从数据库获取数据$mysqli = new mysqli("localhost", "user", "password", "database");$result = $mysqli->query($query);$data = $result->fetch_assoc();// 将数据存储到缓存$memcached->set($cache_key, $data, 300); // 缓存300秒
}// 使用数据
print_r($data);

6.2 缓存API响应

缓存外部API的响应可以减少对API的请求频率,提高应用程序的响应速度。

<?php
$api_url = "https://api.example.com/data";
$cache_key = md5($api_url);// 尝试从缓存获取数据
$response = $memcached->get($cache_key);if ($response === false) {// 缓存未命中,发起API请求$response = file_get_contents($api_url);// 将响应存储到缓存$memcached->set($cache_key, $response, 600); // 缓存600秒
}// 使用API响应
echo $response;

7. 代码示例与项目实战

7.1 简单的PHP缓存类

我们可以创建一个简单的PHP类来封装Memcached的操作,使其在项目中更易于使用。

<?phpclass Cache
{private $memcached;public function __construct(){$this->memcached = new Memcached();$this->memcached->addServer('localhost', 11211);}public function set($key, $value, $expiration = 60){return $this->memcached->set($key, $value, $expiration);}public function get($key){return $this->memcached->get($key);}public function delete($key){return $this->memcached->delete($key);}public function increment($key, $offset = 1){return $this->memcached->increment($key, $offset);}public function decrement($key, $offset = 1){return $this->memcached->decrement($key, $offset);}public function getStats(){return $this->memcached->getStats();}
}// 使用示例
$cache = new Cache();
$cache->set('key', 'value');
echo $cache->get('key');

7.2 完整的Web应用缓存示例

下面是一个完整的Web应用示例,展示如何在PHP项目中集成Memcached。

<?php
require 'Cache.php';// 数据库连接
$mysqli = new mysqli("localhost", "user", "password", "database");// 缓存实例
$cache = new Cache();// 获取用户数据
function getUser($id)
{global $mysqli, $cache;$cache_key = "user_$id";$user = $cache->get($cache_key);if ($user === false) {$result = $mysqli->query("SELECT * FROM users WHERE id = $id");$user = $result->fetch_assoc();$cache->set($cache_key, $user, 300);}return $user;
}// 显示用户数据
$user = getUser(1);
print_r($user);

8. 总结

在本章中,我们详细介绍了如何在PHP中使用Memcached,包括安装和配置、基本操作、进阶技巧和性能优化等内容。通过这些内容,可以在PHP项目中高效地使用Memcached,提升Web应用程序的性能。

随着对Memcached的深入了解和实践,你会发现它在处理高并发和大数据量的应用场景中具有巨大的优势。在接下来的开发中,结合具体的业务需求和性能要求,灵活运用Memcached的各项功能,将使PHP项目更加高效和稳定。

相关文章:

Memcached开发(八):使用PHP进行操作

目录 1. 安装与配置 1.1 安装Memcached服务器 1.2 安装PHP的Memcached扩展 2. 基本操作 2.1 连接Memcached服务器 2.2 设置与获取数据 2.3 删除数据 2.4 检查数据是否存在 2.5 添加和替换数据 3. 高级操作 3.1 批量操作 3.2 数据计数器 3.3 CAS&#xff08;Check …...

[Spring Boot]Protobuf解析MQTT消息体

简述 本文主要针对在MQTT场景下&#xff0c;使用Protobuf协议解析MQTT的消息体 Protobuf下载 官方下载 https://github.com/protocolbuffers/protobuf/releases网盘下载 链接&#xff1a;https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwdanan 提取码&#xff1a;an…...

什么是Mappers?Mappers的作用是什么?

在软件开发中&#xff0c;“mappers” 通常指的是数据映射器&#xff08;Data Mappers&#xff09;&#xff0c;它们的主要作用是在应用程序的数据持久化层&#xff08;通常是数据库或其他持久化存储&#xff09;与应用程序的业务逻辑之间建立一个映射层。 具体来说&#xff0…...

python-多任务编程

2. 多任务编程 2.1 多任务概述 多任务 即操作系统中可以同时运行多个任务。比如我们可以同时挂着qq&#xff0c;听音乐&#xff0c;同时上网浏览网页。这是我们看得到的任务&#xff0c;在系统中还有很多系统任务在执行,现在的操作系统基本都是多任务操作系统&#xff0c;具备…...

IDEA创建Java工程、Maven安装与建立工程、Web工程、Tomcat配置

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …...

使用工作流产生高质量翻译内容的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

笔记:Few-Shot Learning小样本分类问题 + 孪生网络 + 预训练与微调

内容摘自王老师的B站视频&#xff0c;大家还是尽量去看视频&#xff0c;老师讲的特别好&#xff0c;不到一小时的时间就缕清了小样本学习的基础知识点~Few-Shot Learning (1/3): 基本概念_哔哩哔哩_bilibili Few-Shot Learning&#xff08;小样本分类&#xff09; 假设现在每类…...

初学Mybatis之 CRUD 增删改查

namespace 中的包名要和 Dao/Mapper 接口的包名一致 select&#xff1a;选择&#xff0c;查询语句 同理&#xff0c;还有 insert、update、delete 标签 id&#xff1a;对应的 namespace 中的方法名 resultType&#xff1a;sql 语句执行的返回值 parameterType&#xff1a;…...

Kali Linux APT 设置指南:如何控制软件包更新行为

在我浏览 CSDN 的问答社区时&#xff0c;我发现一篇求助内容是一位用户对于如何在使用 APT 更新时避免更新 Arduino 这个问题感到困惑。这激发了我写这篇博客的灵感。我希望通过这篇文章&#xff0c;帮助那些在 Kali Linux 上使用 APT 管理软件包更新的朋友们&#xff0c;特别是…...

Android 10.0 Settings 加载流程

一、系统设置首页 代码路径&#xff1a;packages/app/Settings/ 1 主界面加载&#xff1a; <!-- Alias for launcher activity only, as this belongs to each profile. --><activity-alias android:name"Settings"android:label"string/settings_la…...

mysql的索引、事务和存储引擎

目录 索引 索引的概念 索引的作用 作用 索引的副作用 创建索引 创建索引的原则和依据 索引的类型 创建索引 查看索引 删除索引 drop 主键索引 普通索引 添加普通索引 唯一索引 添加唯一索引 组合索引 添加组合索引 查询组合索引 全文索引 添加全文索引 …...

基于trace_id实现SpringCloudGateway网关的链路追踪

之前写的两篇关于基于 trace_id 的链路追踪的文章&#xff1a; 基于trace_id的链路追踪&#xff08;含Feign、Hystrix、线程池等场景&#xff09;基于trace_id的链路追踪&#xff08;ForkJoinPool场景&#xff09; 一、引言 在之前的文章中&#xff0c;我们讨论了基于 trace…...

Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)

Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024) Windows 11, version 22H2&#xff0c;企业版 arm64 x64 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…...

【C语言】动态内存管理(上)

文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例&#xff08;malloc和free&#xff09; 3. calloc3.1 calloc例子 前言 本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要&#xff0c;为…...

【BUG】已解决:ModuleNotFoundError: No module named‘ pip‘

已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…...

网络安全-网络安全及其防护措施11

51.网络容量规划 网络容量规划的概念和重要性 网络容量规划&#xff1a; 是指根据业务需求和预期增长&#xff0c;合理规划和设计网络的带宽、设备和资源&#xff0c;以满足未来网络流量和服务质量的需求。通过有效的网络容量规划&#xff0c;确保网络性能稳定和用户体验良好…...

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式&#xff1a;我们的目标是使用IDEA编写lua脚本&#xff0c;所以不需要勾选。后面需要的话&#xff0c;可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…...

CentOS 7 安装MySQL 5.7.30

CentOS 7 安装MySQL卸载&#xff08;离线安装&#xff09; 安装配置MySQL之前先查询是否存在&#xff0c;如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除&#xff08;删除…...

Bash 学习摘录

文章目录 1、变量和参数的介绍&#xff08;1&#xff09;变量替换$(...) &#xff08;2&#xff09;特殊的变量类型export位置参数shift 2、引用&#xff08;1&#xff09;引用变量&#xff08;2&#xff09;转义 3、条件判断&#xff08;1&#xff09;条件测试结构&#xff08…...

GD32 MCU是如何进入中断函数的

用过GD32 MCU的小伙伴们都知道&#xff0c;程序是顺序执行的&#xff0c;但当有中断来的时候程序会跳转到中断函数&#xff0c;执行完中断函数后程序又继续回到原来的位置继续执行&#xff0c;那么你们知道MCU是如何找到中断函数入口的吗&#xff1f; 今天我们就以GD32F303系列…...

Ruby 循环

Ruby 循环 在编程中&#xff0c;循环是一种常用的控制结构&#xff0c;它允许我们重复执行一段代码多次。Ruby 作为一种灵活的编程语言&#xff0c;提供了多种循环方法&#xff0c;包括 while、until、for、each 和 loop 等。本文将详细介绍 Ruby 中的循环机制&#xff0c;并通…...

三字棋游戏(C语言详细解释)

hello&#xff0c;小伙伴们大家好&#xff0c;算是失踪人口回归了哈&#xff0c;主要原因是期末考试完学校组织实训&#xff0c;做了俄罗斯方块&#xff0c;后续也会更新&#xff0c;不过今天先从简单的三字棋说起 话不多说&#xff0c;开始今天的内容 一、大体思路 我们都知…...

H3CNE(计算机网络的概述)

1. 计算机网络的概述 1.1 计算机网络的三大基本功能 1. 资源共享 2. 分布式处理与负载均衡 3. 综合信息服务 1.2 计算机网络的三大基本类型 1.3 网络拓扑 定义&#xff1a; 网络设备连接排列的方式 网络拓扑的类型&#xff1a; 总线型拓扑&#xff1a; 所有的设备共享一…...

【极客日常】Golang一个的slice数据替换的bug排查

上周某天下班前&#xff0c;接到同事转来一个bug要排查&#xff0c;症状是代码重构之后某些业务效果不符合预期&#xff0c;由于代码重构人是笔者&#xff0c;于是blame到笔者这边。经过10min左右的排查和尝试后&#xff0c;解决了这个问题&#xff1a;既往逻辑没有改动&#x…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

UE4-光照重建

当我们拉入新的光源和模型到我们的场景中后&#xff0c;会产生这样的情况&#xff1a; Preview:预览 表示此时由于光照物体所产生的阴影都是预览级别的并不是真正的效果。 方法一&#xff1a; 或者也可以在世界大纲中选中我们的光源&#xff0c;然后将我们的光源改变为可以…...

【2024德国签证】留学面签问题汇总

在去交材料的时候&#xff0c;可能会被随机安排面试。这些面试问题一般都很简单&#xff0c;主要是测试你的基本英文交流能力。无需担心&#xff0c;签证官不会问太专业的问题&#xff0c;因为他们也不懂专业内容。到目前为止&#xff0c;没有一个博士生因为这个面试被拒签。毕…...

知识点大纲

学习方法 学习、整理笔记过程中&#xff0c;顺便整理出一个以问题为模版的大纲&#xff0c;到时候对着问题&#xff0c;就像是在和面试官讲解那样&#xff0c;相当于升级版的费曼学习法 除了看博客&#xff0c;问gpt外&#xff0c;亲自实验也是获取知识及加深印象的关键点 很…...

MySQL:库表操作

MySQL&#xff1a;库表操作 库操作查看创建字符编码集 删除修改备份 表操作创建查看删除修改 库操作 查看 查看存在哪些数据库&#xff1a; show databases;示例&#xff1a; 查看自己当前处于哪一个数据库&#xff1a; select database();示例&#xff1a; 此处由于我不处于任…...

8.3 End-to-end Data Protection (Optional)

8.3 End-to-end Data Protection (Optional) 为了提供从应用程序到NVM介质并返回到应用程序本身的稳健数据保护,可以使用端到端数据保护。如果启用了此可选机制,则将额外的保护信息(例如CRC)添加到逻辑块中,控制器和/或主机软件可以对其进行评估,以确定逻辑块的完整性。…...

用户权限网站/网站关键词在哪里看

TCP协议不是有keep-alive机制吗&#xff0c;那为什么基于TCP的应用还需要在应用层加入心跳包机制&#xff1f; 参考&#xff1a; 为什么基于TCP的应用需要心跳包&#xff08;TCP keep-alive原理分析&#xff09; TCP中已有SO_KEEPALIVE选项&#xff0c;为什么还要在应用层加入…...

建设一个网站的工作方案/关键词优化平台有哪些

刚才安装notebook插件jupyter_contrib_nbextensions&#xff0c;搜了很多教程都没有作用。直到用了这个命令&#xff0c;一行解决。 pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install 打开打开 Jupyter Notebook&#xff0c;可以看到…...

企业网站建设公司/发帖百度秒收录网站分享

1. 创建型模式 工厂模式|抽象工厂模式 单例模式建造者模式原型模式 2. 结构型模式 适配器模式装饰器模式外观模式桥接模式组合模式享元模式 3. 行为型模式 策略模式模板方法模式观察者模式迭代子模式责任链模式命令模式备忘录模式状态模式访问者模式中介者模式解释器模式...

四川城乡建设厅网站/哪些平台可以做推广

C:\Users\home\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup //home为用户名转载于:https://www.cnblogs.com/xyh592/articles/5092967.html...

领动营销网站建设/手机网站排名优化

记得看过一个数据&#xff0c;中国软件企业 50人以下的公司数量达到 70% 以上&#xff0c;规模普遍偏小。我想这 70% 中至少有 80% 还是小作坊的研发模式&#xff0c;"三五个人&#xff0c;十来条枪"&#xff0c;有一部分企业偏居一隅&#xff0c;远离信息技术发达城…...

广州外贸营销型网站建设公司/精准营销通俗来说是什么

GitHub 18k Star 的Java工程师成神之路&#xff0c;不来了解一下吗&#xff01; GitHub 18k Star 的Java工程师成神之路&#xff0c;真的不来了解一下吗&#xff01; GitHub 18k Star 的Java工程师成神之路&#xff0c;真的真的不来了解一下吗&#xff01; 相信很多人对Java中的…...