PHP实现Redis键值过期提醒,分享高效缓存管理技巧

文章导读
以下是直接可用的PHP代码实现Redis键值过期提醒,使用Redis的keyevent通知功能:$redis = new Redis();$redis->connect('127.0.0.1', 6379);$redis->auth('password');$redis->psubscribe(array('__keyevent@0__:expired'), function($redis, $p
📋 目录
  1. CSDN博客
  2. 博客园文章
  3. SegmentFault
  4. PHP中文网
  5. 开源中国
  6. 知乎专栏
A A

以下是直接可用的PHP代码实现Redis键值过期提醒,使用Redis的keyevent通知功能:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('password');
$redis->psubscribe(array('__keyevent@0__:expired'), function($redis, $pattern, $time, $data) {
echo "Key expired: $data\n";
});
设置键过期:$redis->setex('testkey', 10, 'value'); //10秒过期
高效技巧:批量设置过期时间,避免单个操作;使用pipeline批量命令减少网络开销。

CSDN博客

Redis键过期事件监听,在php中通过psubscribe订阅__keyevent@db__:expired频道,当键过期时会收到通知。代码示例:
$redis->psubscribe(['__keyevent@0__:expired'], function ($redis, $pattern, $time, $chan, $msg) {
file_put_contents('/tmp/redis_expire.log', date('Y-m-d H:i:s') . ': ' . $msg . "\n", FILE_APPEND);
});
注意:Redis服务器需配置notify-keyspace-events Ex。

博客园文章

实现缓存过期提醒的高效方法:结合Redis Pub/Sub和keyevent。PHP客户端订阅频道,服务器端配置:notify-keyspace-events AEx。
示例:
$sub = $redis->psubscribe('__keyevent@0__:expired*', 'callback');
function callback($redis, $pattern, $time, $data) {
$key = $data;
// 发送邮件或推送通知
sendNotify($key);
}

PHP实现Redis键值过期提醒,分享高效缓存管理技巧

SegmentFault

高效缓存管理:使用Redis setex设置带过期时间的键,避免手动删除。监听过期事件清理关联数据。
PHP代码:
// 设置缓存
$redis->setex('user:1:session', 3600, json_encode($session));
// 监听
$redis->subscribe(['__keyevent@0__:expired'], function($message) {
echo "Expired key: " . $message['payload'];
});
技巧:使用scan迭代键,避免keys阻塞。

PHP中文网

Redis缓存优化技巧:1. 合理设置TTL,短命键用setex,长命键用expire。2. 监听keyevent实现自动清理。3. Pipeline批量操作。
监听代码:
$redis->psubscribe(['__key*expired*'], function($r, $p, $t, $k){
logExpiredKey($k);
});

开源中国

PHP Redis过期提醒完整示例:
class RedisExpireListener {
public function listen() {
$redis = new Redis();
$redis->pconnect('127.0.0.1');
$redis->psubscribe(['__keyevent@0__:expired'], [$this, 'onExpire']);
}
public function onExpire($r, $p, $t, $k) {
echo "Key $k expired at " . date('Y-m-d H:i:s') . "\n";
}
}
配置redis.conf: notify-keyspace-events Ex

PHP实现Redis键值过期提醒,分享高效缓存管理技巧

知乎专栏

缓存雪崩预防:设置不同过期时间,使用随机TTL。PHP实现:
$ttl = 3600 + rand(0, 1800);
$redis->setex($key, $ttl, $value);
过期提醒用Lua脚本原子操作更高效。

FAQ
Q: Redis如何开启键空间通知?
A: 在redis.conf添加 notify-keyspace-events Ex,重启Redis。
Q: PHP监听会阻塞主进程吗?
A: 是,使用psubscribe会阻塞,建议用单独进程或Swoole协程。
Q: setex和expire+set区别?
A: setex原子性更好,一条命令完成设置+过期。
Q: 如何处理高并发过期通知?
A: 用消息队列解耦,如将过期键推送到RabbitMQ处理。