首页 / 技术分享 / Redis 入门及实战案例 /
Redis 除了做缓存还能做什么

Redis 除了做缓存还能做什么

码不停提

2026-01-27
20 次浏览
0 条评论

本文介绍 Redis 在缓存之外的常见应用场景,并提供 PHP 示例代码,便于快速入门。

Redis 入门及实战案例
Redis
分享:

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 的强大优势。


评论区 (0)

你需要先 登录 后才能发表评论。
还没有人评论,赶快成为第一个吧。