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操作后,可以使用getResultCode和getResultMessage方法检查操作结果。
<?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(Check …...
[Spring Boot]Protobuf解析MQTT消息体
简述 本文主要针对在MQTT场景下,使用Protobuf协议解析MQTT的消息体 Protobuf下载 官方下载 https://github.com/protocolbuffers/protobuf/releases网盘下载 链接:https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwdanan 提取码:an…...
什么是Mappers?Mappers的作用是什么?
在软件开发中,“mappers” 通常指的是数据映射器(Data Mappers),它们的主要作用是在应用程序的数据持久化层(通常是数据库或其他持久化存储)与应用程序的业务逻辑之间建立一个映射层。 具体来说࿰…...
python-多任务编程
2. 多任务编程 2.1 多任务概述 多任务 即操作系统中可以同时运行多个任务。比如我们可以同时挂着qq,听音乐,同时上网浏览网页。这是我们看得到的任务,在系统中还有很多系统任务在执行,现在的操作系统基本都是多任务操作系统,具备…...
IDEA创建Java工程、Maven安装与建立工程、Web工程、Tomcat配置
《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …...
使用工作流产生高质量翻译内容的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
笔记:Few-Shot Learning小样本分类问题 + 孪生网络 + 预训练与微调
内容摘自王老师的B站视频,大家还是尽量去看视频,老师讲的特别好,不到一小时的时间就缕清了小样本学习的基础知识点~Few-Shot Learning (1/3): 基本概念_哔哩哔哩_bilibili Few-Shot Learning(小样本分类) 假设现在每类…...
初学Mybatis之 CRUD 增删改查
namespace 中的包名要和 Dao/Mapper 接口的包名一致 select:选择,查询语句 同理,还有 insert、update、delete 标签 id:对应的 namespace 中的方法名 resultType:sql 语句执行的返回值 parameterType:…...
Kali Linux APT 设置指南:如何控制软件包更新行为
在我浏览 CSDN 的问答社区时,我发现一篇求助内容是一位用户对于如何在使用 APT 更新时避免更新 Arduino 这个问题感到困惑。这激发了我写这篇博客的灵感。我希望通过这篇文章,帮助那些在 Kali Linux 上使用 APT 管理软件包更新的朋友们,特别是…...
Android 10.0 Settings 加载流程
一、系统设置首页 代码路径:packages/app/Settings/ 1 主界面加载: <!-- 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 的链路追踪的文章: 基于trace_id的链路追踪(含Feign、Hystrix、线程池等场景)基于trace_id的链路追踪(ForkJoinPool场景) 一、引言 在之前的文章中,我们讨论了基于 trace…...
Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)
Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024) Windows 11, version 22H2,企业版 arm64 x64 请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。 作者…...
【C语言】动态内存管理(上)
文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例(malloc和free) 3. calloc3.1 calloc例子 前言 本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要,为…...
【BUG】已解决:ModuleNotFoundError: No module named‘ pip‘
已解决:ModuleNotFoundError: No module named‘ pip‘ 目录 已解决:ModuleNotFoundError: No module named‘ pip‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰…...
网络安全-网络安全及其防护措施11
51.网络容量规划 网络容量规划的概念和重要性 网络容量规划: 是指根据业务需求和预期增长,合理规划和设计网络的带宽、设备和资源,以满足未来网络流量和服务质量的需求。通过有效的网络容量规划,确保网络性能稳定和用户体验良好…...
使用IDEA编写lua脚本并运行
下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式:我们的目标是使用IDEA编写lua脚本,所以不需要勾选。后面需要的话,可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…...
CentOS 7 安装MySQL 5.7.30
CentOS 7 安装MySQL卸载(离线安装) 安装配置MySQL之前先查询是否存在,如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除(删除…...
Bash 学习摘录
文章目录 1、变量和参数的介绍(1)变量替换$(...) (2)特殊的变量类型export位置参数shift 2、引用(1)引用变量(2)转义 3、条件判断(1)条件测试结构(…...
GD32 MCU是如何进入中断函数的
用过GD32 MCU的小伙伴们都知道,程序是顺序执行的,但当有中断来的时候程序会跳转到中断函数,执行完中断函数后程序又继续回到原来的位置继续执行,那么你们知道MCU是如何找到中断函数入口的吗? 今天我们就以GD32F303系列…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
