第9章 Node框架实战篇 - Redis 缓存

Node.js集成Redis实现视频缓存与推荐
不同操作系统中安装Redis

https://blog.youkuaiyun.com/m0_65096391/article/details/149471678

Redis列表操作

https://blog.youkuaiyun.com/shulianghan/article/details/129085961

使用Node操作Redis

https://blog.51cto.com/u_16213388/12334789

视频收藏功能实现

model\videoCollectModel.js

新建视频收藏Model

const mongoose = require('mongoose');
const baseSchema = require('./baseModel');

const videocollectSchema = new mongoose.Schema({
  video: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: 'Video',
  },
  user: {
    type: mongoose.Schema.Types.ObjectId,
    required: true,
    ref: 'User',
  },
  ...baseSchema,
});

module.exports = videocollectSchema;

model\index.js

VideoCollect: mongoose.model('VideoCollect', require('./videoCollectModel')),

router\video.js

新建收藏视频路由

// 收藏视频
router.post('/collect/:videoId', verifyToken(), videoController.collectVideo);

controller\videoController.js

实现收藏视频逻辑

// 收藏视频
exports.collectVideo = async (req, res) => {
  var { videoId } = req.params;
  var userId = req.user.user._id;
  try {
    var video = await Video.findById(videoId);
    if (!video) {
      return res.status(404).send({
        code: 404,
        message: '视频不存在',
      });
    }
    // 是否已收藏
    var isCollect = await VideoCollect.findOne({
      video: videoId,
      user: userId,
    });
    if (isCollect) {
      return res.status(400).send({
        code: 400,
        message: '已收藏',
      });
    }
    // 收藏视频
    const videoCollectModel = new VideoCollect({
      video: videoId,
      user: userId,
    });
    await videoCollectModel.save();
    res.status(200).send({
      code: 200,
      message: '收藏成功',
      data: videoCollectModel,
    });
  } catch (error) {
    console.log('error', error);
    res.status(500).send({
      code: 500,
      message: '收藏失败',
      data: error,
    });
  }
};

实现视频热门推荐机制

config\config.default.js

redis 连接配置

module.exports.redisClient = {
  path: '127.0.0.1', //192.168.0.106
  port: 6379,
  options: {}, //password: 'root'
};

model\redis\index.js

创建 redis 连接工具类

const Redis = require('ioredis');
const { redisClient } = require('../../config/config.default');
const redis = new Redis({
  port: redisClient.port,
  host: redisClient.path,
});

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

redis.on('error', (err) => {
  if (err) {
    console.log('redis连接失败');
    console.log(err);
    redis.quit();
  }
});

module.exports = redis;

model\redis\redishotsinc.js

实现视频热度管理

const redis = require('./index');

exports.hotInc = async (videoId, incNum) => {
  var data = await redis.zscore('hot_video', videoId);
  if (data) {
    var inc = await redis.zincrby('hot_video', incNum, videoId);
  } else {
    var inc = await redis.zadd('hot_video', incNum, videoId);
  }
  return inc;
};

controller\videoController.js

在视频点赞、评论、收藏、获取视频详情成功后调用视频热度管理工具函数

获取推荐的热门视频

model\redis\redishotsinc.js

从 redis 获取热门视频

// 获取热门视频
exports.topHots = async (num) => {
  var data = await redis.zrevrange('hot_video', 0, -1, 'withscores');
  var newarr = data.slice(0, num * 2);
  var obj = {};
  for (let i = 0; i < newarr.length; i++) {
    if (i % 2 === 0) {
      obj[newarr[i]] = newarr[i + 1];
    }
  }
  return obj;
};

router\video.js

创建获取热门视频路由


// 获取热门视频
router.get('/tophots/:num', videoController.topHots);

controller\videoController.js

实现获取热门视频逻辑

// 获取热门视频
exports.topHots = async (req, res) => {
  var { num = 10 } = req.params;
  try {
    var dbBack = await topHots(num);
    res.status(200).send({
      code: 200,
      message: '获取热门视频成功',
      data: dbBack,
    });
  } catch (error) {
    res.status(500).send({
      code: 500,
      message: '获取热门视频失败',
      data: error,
    });
  }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值