1. 消息队列(任务队列)
原理: 利用 Redis 列表 List 结构实现。
PHP 示例:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// 生产者:添加任务到队列(左侧)
$redis->lPush('queue:tasks', 'task_data');
// 消费者:从队列的右侧取出任务
$task = $redis->rPop('queue:tasks');
if ($task) {
// 处理任务
echo "处理任务: $task";
}
2. 排行榜(有序集合 Sorted Set)
原理: 利用 ZSET 结构可对分数排序。
PHP 示例:
// 添加/更新用户分数
$redis->zAdd('leaderboard', 1500, 'user:alex');
// 增加分数
$redis->zIncrBy('leaderboard', 200, 'user:alex');
// 获取前10名用户及分数
$top = $redis->zRevRange('leaderboard', 0, 9, true);
foreach ($top as $user => $score) {
echo "$user : $score\n";
}
3. 计数器与限流
原理: 用字符串/value类型,INCR、INCRBY 原子递增。
PHP 示例:
// 访问页面计数器
$count = $redis->incr('page:view:home');
echo "今日首页访问量:$count";
// 限流(每分钟最多5次)
$key = "rate_limit:user:42:minute";
if ($redis->incr($key) == 1) {
$redis->expire($key, 60);
}
if ($redis->get($key) > 5) {
echo "超出访问限制!";
} else {
echo "请求允许";
}
4. 分布式锁
原理: 利用 SETNX 和 EXPIRE 或直接使用 SET ... NX EX。
PHP 示例:
$lockKey = 'lock:order:123';
$lockValue = uniqid('', true); // 推荐用随机字符串做锁值
$acquired = $redis->set($lockKey, $lockValue, ['nx', 'ex'=>30]); // 30秒过期
if ($acquired) {
// 获得锁,执行业务逻辑
// ...操作
// 解锁
if ($redis->get($lockKey) === $lockValue) {
$redis->del($lockKey);
}
} else {
echo "操作太频繁,请稍候重试";
}
5. Session 会话管理
原理: User session 存 Redis,支持分布式共享登录。
PHP 示例:
$sessionId = 'sess_' . session_id();
$userData = ['uid' => 1, 'username' => 'alex', 'email' => 'alex@xxx.com'];
$redis->setex("session:$sessionId", 1800, json_encode($userData)); // 30分钟过期
// 取回session
$data = $redis->get("session:$sessionId");
$userInfo = $data ? json_decode($data, true) : null;
6. 地理位置计算(Geo)
原理: GEOADD、GEORADIUS 等命令。
PHP 示例:
// 添加地点坐标
$redis->geoAdd('geo:city', 116.397128, 39.916527, 'Tiananmen');
$redis->geoAdd('geo:city', 121.473701, 31.230416, 'TheBund');
// 查询指定坐标5公里范围内的地点
$results = $redis->rawCommand('GEORADIUS', 'geo:city', 116.397128, 39.916527, 5, 'km');
foreach ($results as $place) {
echo "附近地点: $place\n";
}
7. 发布/订阅(Pub/Sub)
原理: publish/subscribe 消息通知。
PHP 示例(伪代码):
发布端:
$redis->publish('news', '今日头条消息');
订阅端(需要开启长连接、一般实际用 CLI 脚本)���
$redis->subscribe(['news'], function($redis, $chan, $msg) {
echo "收到消息: $msg\n";
});
8. 唯一性校验与防重(Set/布隆过滤器)
原理: SADD 判断新增成员是否重复。
PHP 示例:
// 防止用户多次签到
if ($redis->sAdd('sign:20260127', 'user:42')) {
echo "签到成功";
} else {
echo "请勿重复签到";
}
9. 延迟队列(zset实现定时任务)
PHP 示例:
// 添加带到期时间戳的任务
$now = time();
$runTime = $now + 60; // 一分钟后
$redis->zAdd('delayQueue', $runTime, 'taskId_123');
// 消费者查找到期任务
$tasks = $redis->zRangeByScore('delayQueue', 0, $now);
foreach ($tasks as $taskId) {
// 处理任务...
// 处理完从队列移除
$redis->zRem('delayQueue', $taskId);
}
总结
Redis 远不止缓存功能,结合 PHP 等语言其消息队列、排行榜、计数器、分布式锁等应用可以极大提升项目的性能和可靠性。根据业务场景合理设计数据结构和命令调用,就能充分挖掘 Redis 的强大优势。