当前位置: 首页 > 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.jsqmd.com/news/968095/

相关文章:

  • RS-485总线上下拉电阻设计:原理、计算与工程实践指南
  • 3步为Windows 11 LTSC系统安装微软商店:终极完整指南
  • 抖音视频下载终极指南:10分钟掌握douyin-downloader完整教程
  • 2026最新岳阳黄金回收白银回收铂金回收攻略,实地甄选五家优质实体店 - 诚金汇钻回收公司
  • 电路误差分析:从偏微分到蒙特卡洛的工程实践
  • 封号≠权益清零,CSDN AI营销权限保留机制深度解析,附官方未公开的3层申诉权重算法
  • 2026最新遵义黄金回收白银回收铂金回收攻略,实地甄选五家优质实体店 - 诚金汇钻回收公司
  • 网络技术19-TLS/SSL握手协议——数据传输的“加密隧道“
  • Diablo Edit2终极指南:5步快速掌握暗黑2角色编辑器完整教程
  • 宜春市2026年上门黄金回收白银回收铂金回收测评,五家全城可上门实体店整理 - 干豆腐啊
  • 手机抓包总失败?保姆级教程:从关闭防火墙到配置代理,一步步解决Charles连接手机的各种坑
  • 2026最新伊春黄金回收白银回收铂金回收攻略,实地甄选五家优质实体店 - 诚金汇钻回收公司
  • 终极OBS多平台直播解决方案:5分钟实现高效同步推流
  • FPGA IO设计实战:Cyclone II引脚配置、高速接口与信号完整性解析
  • 从胜利VC8045-II拆解看经典台式万用表的设计哲学与维修要点
  • 如何免费实现Windows实时语音转文字:TMSpeech离线字幕完整指南
  • 2026宜昌黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • 2026年6月最新国内十大主流头部GEO优化服务商推荐全汇总:实力、交付、案例攻略全指南分享 - 互联网科技品牌测评
  • 岳阳市2026年上门黄金回收白银回收铂金回收测评,五家全城可上门实体店整理 - 干豆腐啊
  • 工程师如何通过原版英文媒体资源提升技术英语与行业视野
  • 2026咸阳黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收
  • PCB设计铺铜实战指南:从Protel规则设置到高速电路应用
  • 041、闭环 AF 的对焦算法:爬山搜索、相位检测与混合对焦的工程实现
  • 松原黄金回收白银回收铂金回收哪家靠谱?2026 实地测评 5 家高人气实体门店 - 信誉隆金银铂奢回收
  • 高速PCB设计实战:Allegro约束管理与信号完整性优化
  • PCIE AC耦合电容设计避坑指南:从原理到实战的完整解析
  • 5分钟解锁Adobe全家桶:开源破解工具GenP 3.0终极指南
  • 枣庄黄金回收白银回收铂金回收哪家靠谱?2026 实地测评 5 家高人气实体门店 - 信誉隆金银铂奢回收
  • PHP数据结构链表与栈队列实现
  • 2026宿州黄金回收白银回收铂金回收怎么变现?实地探访 5 家本地老牌回收店铺 - 中安检金银铂钻回收