Redis场景应用:详细实现网站粉丝关注与展示的功能

在这里插入图片描述

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。多年电商行业从业经验,对系统架构,数据分析处理等大规模应用场景有丰富经验。
🏆本文已收录于PHP专栏:PHP进阶实战教程
🏆另有专栏PHP入门基础教程,希望各位大佬多多支持❤️。


🚀一、背景

在一个社交网络系统中,关注功能是非常重要的功能之一。用户可以关注其他用户,并查看自己关注了哪些人,以及哪些人关注了自己。如下面就是CSDN我关注的人。

在这里插入图片描述

本篇博文将详细介绍如何利用PHP、Redis和MySQL来实现关注功能,并给出具体的实现步骤和代码。

🚀二、数据库结构设计

在写代码之前,我们需要两张表,一张是用户表(users),另一张是关注关系表(follows)。来表示关注与被关注之间的关系。因为Redis主要是作为缓存使用,在大规模访问前提下,Redis用于缓存数据来使用,为了保证数据的安全性,最终还是要把关注关系写入到数据库,这个后面会讲到。

🔎2.1 用户表(users)

字段名类型描述
idint(11)用户ID
namevarchar(255)用户名称

🔎2.2 关注关系表(follows)

字段名类型描述
idint(11)关注关系ID
follower_idint(11)被关注者ID
following_idint(11)关注者ID
created_atdatetime关注关系创建时间

关注关系表中,follower_id 表示被关注者ID,following_id表示关注者ID。

🚀三、实现步骤和代码

🔎3.1 创建数据库和表

首先,我们需要创建一个数据库,并创建两张表 users 和 follows。可以使用以下的SQL语句来创建相应的数据库和表:

CREATE TABLE users (
    id INT(11) AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE follows (
    id INT(11) AUTO_INCREMENT PRIMARY KEY,
    follower_id INT(11),
    following_id INT(11),
    created_at DATETIME
);

🔎3.2 安装 Redis 和相关 PHP 扩展

为了实现关注功能,我们需要使用 Redis 来存储关注数据,并利用 PHP 扩展来操作 Redis。首先,我们需要安装 Redis 扩展,如果已经存在此扩展,可以省略这个步骤。

查看是否安装了这个扩展可以通过php -m命令进行查看当前PHP生效的扩展。

然后,我们需要安装 PHP 的 Redis 扩展来连接 Redis 服务器。可以使用以下命令来安装 Redis 扩展:

pecl install redis

安装完成后,编辑 php.ini 文件,添加以下内容:

extension=redis.so

重启你的 web 服务器使配置生效。

🔎3.3 编写 PHP 代码

🍁3.3.1 连接 Redis 和 MySQL 数据库

首先,我们需要在 PHP 代码中连接 Redis 和 MySQL 数据库。可以创建一个 config.php 配置文件,用于存储数据库连接的相关信息。示例 config.php 内容如下:

<?php

$redis_host = '127.0.0.1';
$redis_port = 6379;
$redis_password = null;
$mysql_host = 'localhost';
$mysql_user = 'root';
$mysql_password = 'password';
$mysql_db = 'social_network';

$redis = new Redis();
$redis->connect($redis_host, $redis_port);
if ($redis_password) {
    $redis->auth($redis_password);
}

$pdo = new PDO("mysql:host=$mysql_host;dbname=$mysql_db", $mysql_user, $mysql_password);

🍁3.3.2 关注功能实现

接下来,我们将编写 PHP 代码来实现关注功能。示例代码如下:

<?php

require_once 'config.php';

function followUser($followerId, $followingId)
{
    global $redis, $pdo;

    // 将关注关系存储到 Redis set 中
    $redis->sAdd("following:$followerId", $followingId);
    $redis->sAdd("followers:$followingId", $followerId);
}

function unfollowUser($followerId, $followingId)
{
    global $redis, $pdo;

    // 从 Redis set 中删除关注关系
    $redis->sRem("following:$followerId", $followingId);
    $redis->sRem("followers:$followingId", $followerId);
}

function getFollowing($userId)
{
    global $redis, $pdo;

    // 从 Redis set 中获取我关注的人的 ID 列表
    $followingIds = $redis->sMembers("following:$userId");

    if (empty($followingIds)) {
        return [];
    }
}

function getFollowers($userId)
{
    global $redis, $pdo;

    // 从 Redis set 中获取关注我的人的 ID 列表
    $followerIds = $redis->sMembers("followers:$userId");

    if (empty($followerIds)) {
        return [];
    }
}

🍁3.3.3 定时同步关注数据到数据库

为了保证 Redis 中的关注关系数据与 MySQL 数据库中的数据一致,我们可以使用定时任务来定期将关注数据同步到数据库中(文件命名为sync.php)。放入如下代码:

<?php

require_once 'config.php';

function syncFollowData()
{
    global $redis, $pdo;

    // 获取 Redis set 中的所有关注关系
    $follows = $redis->smembers("follows");

    if (empty($follows)) {
        return;
    }

    // 清空 MySQL 数据库中的关注关系表
    $pdo->query('TRUNCATE TABLE follows');

    // 将关注关系存储到 MySQL 数据库中
    foreach ($follows as $follow) {
        list($followerId, $followingId) = explode(':', $follow);
        $stmt = $pdo->prepare('INSERT INTO follows (follower_id, following_id, created_at) VALUES (?, ?, NOW())');
        $stmt->execute([$followerId, $followingId]);
    }
}

syncFollowData();

上述的代码是一个核心的演示,实际应用的场景过程中,可能关注的量非常大,要采取增量插入或者按照用户区分关注列表处理,请结合实际情况灵活应用,不可完全按照上面代码设计。

🍁3.3.4 定时任务设置

最后,我们需要设置定时任务来定期执行关注数据的同步。这里我们通过使用 cron 表达式来指定执行时间间隔。例如,每小时执行一次同步操作的 cron 表达式为 0 * * * *

根据你的服务器环境不同,设置定时任务的方法也会有所不同。以 Linux 系统为例,可以使用以下命令来编辑 crontab:

crontab -e

然后,在 crontab 文件中添加以下内容:

0 * * * * /usr/bin/php /path/to/sync.php

保存并退出编辑器,即可完成定时任务的设置。

🚀四、总结

本篇博文详细介绍了如何利用 PHP、Redis 和 MySQL 来实现关注功能,并给出了具体的实现步骤和代码。通过 Redis 存储关注数据,可以提高查询效率和扩展性,而使用 MySQL 存储关注数据则更适合持久化存储和数据备份。实际过程中可能遇到的情况更加多样,不过核心的逻辑就是这些了。
在这里插入图片描述
后面将会分享更多的实战经验,我们下次见。

评论 77
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑夜开发者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值