掘金 后端 ( ) • 2024-04-28 21:59

打造智能视频推荐引擎:深度解析Node.js与Redis结合实现热度驱动的视频推荐机制

在本次技术分享中,我们将深入探讨如何实现一个视频平台的热门视频推荐机制。通过结合用户行为,如观看、点赞、评论和收藏,我们可以为每个视频计算一个热度值,并基于此值推荐热门视频。

1. 定义热门视频机制

首先,我们需要定义一个规则来衡量视频的热度。在这个例子中,我们决定:

  • 观看视频:热度 +1
  • 点赞视频:热度 +2(因为点赞通常意味着用户对视频有更高的满意度)
  • 发表评论:热度 +2
  • 收藏视频:热度 +3(收藏通常表示用户对视频有较强的兴趣)

2. 封装Redis操作

为了高效地处理这些操作,我们将使用Redis,一个高性能的键值存储数据库。我们将封装一些Redis操作以便于在应用中重复使用。

Redis配置

首先,在项目的配置文件config.default.js中定义Redis连接信息:

// config.default.js
exports.redisClient = {
  path: '127.0.0.1',
  port: 6379,
};

Redis操作封装

然后,创建一个Redis操作模块model/redis/index.js

// index.js
const Redis = require('ioredis');
const { redisClient } = require('../../config/config.default');

const redis = new Redis(redisClient.port, redisClient.path);

redis.on('error', err => {
  console.error('Redis连接错误');
  console.error(err);
  redis.quit();
});

redis.on('ready', () => {
  console.log('Redis连接成功');
});

exports.redis = redis;

3. 封装热门推荐逻辑

接下来,我们将封装一个函数来增加视频的热度值。创建一个新文件redisHotsInc.js

// redisHotsInc.js
exports.hotInc = async (videoId, incNum) => {
  try {
    let currentScore = await redis.zscore('videoHots', videoId);
    let inc;
    if (currentScore !== null) {
      inc = await redis.zincrby('videoHots', incNum, videoId);
    } else {
      inc = await redis.zadd('videoHots', incNum, videoId);
    }
    return inc;
  } catch (error) {
    console.error('更新视频热度时出错:', error);
    throw error;
  }
};

4. 使用封装好的热度函数

现在,我们可以在应用的不同部分使用hotInc函数来增加视频的热度。

收藏视频

const { hotInc } = require("../model/redis/redisHotsInc");

exports.collect = async (req, res) => {
  // 省略其他逻辑...
  const myCollect = await collectModel({
    user: userId,
    video: videoId
  }).save();

  if (myCollect) {
    await hotInc(videoId, 3);
  }
  // 省略其他逻辑...
};

点赞视频

exports.likeVideo = async (req, res) => {
  // 省略其他逻辑...
  if (doc && doc.like === 1) {
    await doc.deleteOne();
    isLike = false;
  } else if (doc && doc.like === -1) {
    doc.like = 1;
    await doc.save();
    await hotInc(videoId, 2);
  } else {
    await new VideoLike({
      user: userId,
      video: videoId,
      like: 1
    }).save();
    await hotInc(videoId, 2);
  }
  // 省略其他逻辑...
};

发表评论

exports.comment = async (req, res) => {
  // 省略其他逻辑...
  const comment = await new VideoComment({
    content: req.body.content,
    video: videoId,
    user: req.user.userinfo._id
  }).save();
  await hotInc(videoId, 2);
  // 省略其他逻辑...
};

观看视频

exports.video = async (req, res) => {
  // 省略其他逻辑...
  await hotInc(videoId, 1);
  res.status(200).json(videoInfo);
};

5. 验证热度增加

最后,为了验证我们的热度推荐机制是否有效,我们可以使用Postman等工具模拟用户行为,如评论、收藏、点赞等操作,并使用Redis终端检查videoHots集合来确认热度值是否正确增加。

通过这种方式,我们不仅能够增加视频的热度,还能基于这些数据为用户推荐热门视频,从而提高用户参与度和平台活跃度。


以上就是实现视频热门推荐机制的全过程。希望这篇技术博客能够帮助你理解如何通过用户行为来驱动视频推荐系统。如果你有任何问题或想要进一步讨论,请随时在评论区留下你的想法