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系列…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
