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

news2024/7/6 19:59:09

在这里插入图片描述

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

文章目录

  • 🚀一、背景
  • 🚀二、数据库结构设计
    • 🔎2.1 用户表(users)
    • 🔎2.2 关注关系表(follows)
  • 🚀三、实现步骤和代码
    • 🔎3.1 创建数据库和表
    • 🔎3.2 安装 Redis 和相关 PHP 扩展
    • 🔎3.3 编写 PHP 代码
      • 🍁3.3.1 连接 Redis 和 MySQL 数据库
      • 🍁3.3.2 关注功能实现
      • 🍁3.3.3 定时同步关注数据到数据库
      • 🍁3.3.4 定时任务设置
  • 🚀四、总结


🚀一、背景

在一个社交网络系统中,关注功能是非常重要的功能之一。用户可以关注其他用户,并查看自己关注了哪些人,以及哪些人关注了自己。如下面就是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 存储关注数据则更适合持久化存储和数据备份。实际过程中可能遇到的情况更加多样,不过核心的逻辑就是这些了。
在这里插入图片描述
后面将会分享更多的实战经验,我们下次见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/822421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Linux下 i2c-tool工具的使用方法 包括i2cdetect、i2cget、i2cset、i2cdump、i2ctransfer

要想用Linux i2c-tools必须安装如下套件&#xff0c;安装后就可以使用i2cdetect、i2cdump、i2cset、i2cget、i2ctransfer了。 sudo apt install i2c-tools -yi2cdetect命令 该命令用于扫描I2C总线上的设备。 语法&#xff1a;i2cdetect [-y] [-a] [-q|-r] i2cbus [first las…

[论文笔记] chatgpt系列 2.6 DeepSpeed-chat 数据集

一、FT数据集 & Reward model数据集 Deepspeed-chat 源代码的数据集: Dahoas/rm-static: 这是一个用于强化学习的静态环境数据集,包含了一个机器人在一个固定环境中的运动轨迹。该数据集旨在用于评估强化学习算法在静态环境下的表现。 Dahoas/full-hh-rlhf: 这是一个用于…

二十三种设计模式第二十四篇--访问者模式(完结撒花)

在访问者模式&#xff08;Visitor Pattern&#xff09;中&#xff0c;我们使用了一个访问者类&#xff0c;它改变了元素类的执行算法。 通过这种方式&#xff0c;元素的执行算法可以随着访问者改变而改变。 这种类型的设计模式属于行为型模式。根据模式&#xff0c;元素对象已接…

openGauss学习笔记-27 openGauss 高级数据管理- JOIN

文章目录 openGauss学习笔记-27 openGauss 高级数据管理- JOIN27.1 交叉连接27.2 内连接27.3 左外连接27.4 右外连接27.5 全外连接 openGauss学习笔记-27 openGauss 高级数据管理- JOIN JOIN子句用于把来自两个或多个表的行结合起来&#xff0c;基于这些表之间的共同字段。 在…

SLA探活工具EaseProbe

工具介绍 EaseProbe可以做三种工作&#xff1a;探测、通知和报告。 项目地址&#xff1a;https://github.com/megaease/easeprobe 1、安装 [rootlocalhost ]# yum -y install unzip go [rootlocalhost ]# unzip easeprobe-main.zip [rootlocalhost ]# cd easeprobe-main [r…

如祺出行冲刺自动驾驶商业化,人少的地方机会多?

网约车&#xff0c;正在迎来让人“不明觉厉”的新一轮竞赛。 网约车监管信息交互系统的数据显示&#xff0c;截至今年6月30日&#xff0c;全国共有318家网约车平台公司取得网约车平台经营许可&#xff0c;环比增加5家&#xff1b;网约车监管信息交互系统6月份共收到订单信息7.…

作为新手小白,你应该了解的五个3DMAX的使用干货小技巧!

3Dmax是一款著名的三维建模和动画制作软件&#xff0c;广泛应用于建筑设计、影视特效、游戏开发等领域。对于初学者来说&#xff0c;熟练掌握一些干货小技巧&#xff0c;可以帮助大家更快地上手和使用这款强大的软件。 一、学习基础操作技巧 首先&#xff0c;你需要学习一些基…

留存测试数据,Apipost接口用例详解

接口用例可以在不影响源接口数据的情况下对接口添加多个用例&#xff0c;方便测试并保存测试数据。 创建用例 左侧目录选择接口后进入接口用例页面&#xff0c;点击添加用例 在弹出窗口中修改各种参数。如登录接口&#xff0c;可修改用户名为空&#xff0c;并添加断言。 执行…

【phaser微信抖音小游戏开发006】给文本增加点击事件

新建st006&#xff0c;为文本增加点击事件。 我们加了一个计数的count&#xff0c;点击一次增加一下&#xff0c;并显示到屏幕上去。 效果如下图&#xff1a; 其它的对象以此类推即可&#xff0c;先置inputEnable为true,然后再增加一个inputDown事件即可。

IO进程线程day4(2023.8.1)

一、Xmind整理&#xff1a; 进程的五态图&#xff1a; 内存分布图&#xff1a; 注&#xff1a;栈区&#xff1a;存储局部变量&#xff0c;形参&#xff08;上边打错了&#xff01;&#xff01;&#xff01;&#xff09; 虚拟内存和物理内存&#xff1a; 进程的STAT&#xff1a…

C++设计模式之装饰者模式

文章目录 C装饰者设计模式什么是装饰者模式优缺点优点缺点 如何使用 C装饰者设计模式 什么是装饰者模式 装饰者模式是一种设计模式&#xff0c;它允许我们动态地将行为附加到对象上&#xff0c;而无需改变对象本身的定义。它将一个对象的行为包装在一个独立的的对象中&#xf…

数据库事务--数据库事务隔离级别实战

2、演示环境 数据库及工具 ➢MySQL版本 5.5.47 ➢数据库工具 Navicat for MySQL 数据库命令 ➢查看数据库版本: select version();➢查看数据库现在的隔离级别: select session.tx_ isolation;➢修改隔离级别: set session.tx_ _isolation级别参数;➢级别参数: READ-UN…

内网横向移动—非约束委派约束委派

内网横向移动—非约束委派&约束委派 1. 委派攻击介绍1.1. 约束委派分类 2. 非约束委派2.1. 配置非约束委派2.1.1. 域内主机配置2.1.2. 注册对象2.1.3. 域内用户配置 2.2. 案例测试2.2.1. 查询服务账户2.2.2. 查询机器账户2.2.3. 机器通讯2.2.4. 导出票据2.2.5. 导入票据2.2…

算法题--二叉树(二叉树的最近公共祖先、重建二叉树、二叉搜索树的后序遍历序列)

目录 二叉树 题目 二叉树的最近公共祖先 原题链接 解析 二叉搜索树的最近公共节点 核心思想 答案 重建二叉树 题目链接 解析 核心思想 答案 二叉搜索树的后序遍历序列 原题链接 解析 核心思想 答案 二叉树 该类题目的解决一般是通过节点的遍历去实现&#x…

edge://settings/defaultbrowser default ie

Microsoft Edge 中的 Internet Explorer 模式 有些网站专为与 Internet Explorer 一起使用&#xff0c;它们具有 Microsoft Edge 等新式浏览器不支持的功能。 如果你需要查看其中的某个网站&#xff0c;可使用 Microsoft Edge 中的 Internet Explorer 模式。 大多数网站在新…

优先级队列 (堆)

目录 一&#xff0c;堆的概念 二&#xff0c; 堆的存储结构 三&#xff0c; 堆的实现 3.1 shiftDown() 3.2 shiftUp() 3.3 shiftDown 与 shiftUp 的时间复杂度 四&#xff0c;堆排序 一&#xff0c;堆的概念 堆常用于实现优先队列&#xff08;Priority Queue&#xff0…

【算法训练营】求最小公倍数+另类加法+走方格的方案数

7月31日 求最小公倍数题目题解代码 另类加法题目题解代码 走方格的方案数题目题解| 1 | 2 | 3 || 4 | 5 | 6 || 7 | 8 | 9 |代码 求最小公倍数 题目 点击跳转: 求最小公倍数 题解 最小公倍数 两数之积除以最大公约数&#xff0c;这里使用碾转相除法进行最大公约数的求解&am…

学习盒模型

1.是什么 2.标准模型 3.怪异模型 一、是什么 一个盒子由四部分组成&#xff1a; content、padding、border、margin 在CSS中&#xff0c;盒子模型可以分成&#xff1a; W3C 标准盒子模型IE 怪异盒子模型 默认情况下&#xff0c;盒子模型为W3C标准盒模型 二、标准盒模型 盒子总…

NetApp FAS存储系统磁盘更换详细步骤

说起更换磁盘&#xff0c;都会说非常简单&#xff0c;但无数次的血淋淋的教训让我们再次来审视一下更换磁盘的专业步骤。本文就是介绍最专业的也是最简单的磁盘更换步骤。常在河边走哪有不湿鞋&#xff0c;希望做了几十年攻城狮的你不要在这里翻船。 本文介绍的内容适用于Onta…

ELK日志管理平台架构和使用说明

一、部署架构 二、服务注册 2.1 日志解析服务 服务名&#xff1a;日志解析服务&#xff08;Logstash&#xff09; 服务默认端口&#xff1a;9600 2.2 日志查询服务 服务名&#xff1a;日志查询服务&#xff08;Kibana&#xff09; 服务默认端口&#xff1a;5601 三、对接…