当前位置: 首页 > 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系列…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...