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

PHP数据缓存策略与更新模式

PHP数据缓存策略与更新模式

缓存是提升应用性能最有效的手段。今天说说各种缓存策略和缓存更新模式。

旁路缓存是最常用的模式。

```php
class CacheAside
{
private Redis $redis;
private PDO $pdo;

public function __construct(Redis $redis, PDO $pdo)
{
$this->redis = $redis;
$this->pdo = $pdo;
}

public function get(string $key, callable $loader, int $ttl = 3600): mixed
{
$cached = $this->redis->get($key);
if ($cached !== false) return unserialize($cached);

$value = $loader();
$this->redis->setex($key, $ttl, serialize($value));
return $value;
}

public function delete(string $key): void
{
$this->redis->del($key);
}
}
?>

先更新数据库后删除缓存的策略。

```php
class CacheConsistency
{
private Redis $redis;
private PDO $pdo;

public function updateUser(int $id, array $data): void
{
// 先更新数据库
$sets = [];
$params = [];
foreach ($data as $key => $value) {
$sets[] = "{$key} = ?";
$params[] = $value;
}
$params[] = $id;
$this->pdo->prepare("UPDATE users SET " . implode(', ', $sets) . " WHERE id = ?")->execute($params);

// 再删除缓存
$this->redis->del("user:{$id}");
}
}
?>

缓存穿透、击穿、雪崩的防护。

```php
class CacheProtection
{
private Redis $redis;

public function __construct(Redis $redis)
{
$this->redis = $redis;
}

// 防止缓存穿透
public function get(string $key, callable $loader, int $ttl = 3600): mixed
{
$cached = $this->redis->get($key);
if ($cached === 'NULL') return null;
if ($cached !== false) return unserialize($cached);

$value = $loader();
if ($value === null) {
$this->redis->setex($key, 60, 'NULL');
} else {
$this->redis->setex($key, $ttl, serialize($value));
}
return $value;
}

// 防止缓存击穿
public function getWithLock(string $key, callable $loader, int $ttl = 3600): mixed
{
$cached = $this->redis->get($key);
if ($cached !== false) return unserialize($cached);

$lockKey = "lock:{$key}";
if ($this->redis->setnx($lockKey, 1)) {
$this->redis->expire($lockKey, 10);
$value = $loader();
$this->redis->setex($key, $ttl + rand(0, 300), serialize($value));
$this->redis->del($lockKey);
return $value;
}

usleep(100000);
return $this->getWithLock($key, $loader, $ttl);
}
}
?>

缓存在提升性能方面立竿见影。但不是所有数据都适合缓存。频繁变化的数据、每次请求都不同的数据、对实时性要求高的数据就不适合缓存。先分析业务场景,再选择合适的缓存策略,效果才会好。

http://www.rkmt.cn/news/1479848.html

相关文章:

  • 2026邢台黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • Quartus II 5.0在Windows系统安装与破解全攻略
  • 信阳黄金回收白银回收铂金回收去哪卖?5 家实地探访靠谱门店汇总 2026 - 中业金奢再生回收中心
  • 抖音视频下载终极指南:10分钟掌握douyin-downloader完整教程
  • 网络技术19-TLS/SSL握手协议——数据传输的“加密隧道“
  • 手机抓包总失败?保姆级教程:从关闭防火墙到配置代理,一步步解决Charles连接手机的各种坑
  • 2026最新岳阳黄金回收白银回收铂金回收攻略,实地甄选五家优质实体店 - 诚金汇钻回收公司
  • 如何免费实现Windows实时语音转文字:TMSpeech离线字幕完整指南
  • 2026宜昌黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • PHP数据结构链表与栈队列实现
  • 5分钟解锁Adobe全家桶:开源破解工具GenP 3.0终极指南
  • 宜宾黄金回收白银回收铂金回收哪家靠谱?2026 实地测评 5 家高人气实体门店 - 信誉隆金银铂奢回收
  • WinForms中DataGridView单元格自由合并与双级表头实现方案
  • 2026宿州黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • WarcraftHelper终极指南:3步解锁魔兽争霸300帧+宽屏完美体验
  • 3分钟掌握全国高铁数据:Parse12306完全指南
  • STM32F103C8T6驱动蜂鸣器/喇叭演奏《晴天》的可运行工程(含OLED显示与完整HAL/标准库支持)
  • MATLAB GUI里两个实用时间控件:实时系统时钟显示 + 5秒倒计时功能演示
  • 2026年6月GEO服务商哪家好?为什么GEO要找头部公司合作?技术、效果、合规三维度深度选型与评测 - 互联网科技品牌测评
  • 2026宜春黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • 2026 泰州漏水维修攻略|苏易修缮推荐:卫生间 / 阳台 / 外墙 / 屋顶 / 地下室漏水|靠谱防水门店推荐 - 苏易修缮
  • 2026最新伊犁黄金回收白银回收铂金回收攻略,实地甄选五家优质实体店 - 诚金汇钻回收公司
  • 2026武威黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • AMD锐龙SDT调试工具深度解析:底层硬件参数调优实战指南
  • 2026渭南黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • MEMS传感器原理全解析:从电容、压阻到热学与陀螺仪
  • 2026最新长沙黄金回收白银回收铂金回收攻略,实地甄选五家优质实体店 - 诚金汇钻回收公司
  • 巴法云MQTT接入避坑指南:用Python paho-mqtt库时,别忘了处理这几个隐藏的断开重连问题
  • 如何快速实现PC游戏本地多人分屏:Nucleus Co-Op的完整指南
  • GEO地理空间公司是什么?GEO优化公司是什么?两者谁是主流?2026年权威GEO公司TOP5推荐排行榜 - 互联网科技品牌测评