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

不同操作系统中安装Redis

https://blog.csdn.net/m0_65096391/article/details/149471678

Redis列表操作

https://blog.csdn.net/shulianghan/article/details/129085961

使用Node操作Redis

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

视频收藏功能实现

model\videoCollectModel.js

新建视频收藏Model

javascript 复制代码
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

javascript 复制代码
VideoCollect: mongoose.model('VideoCollect', require('./videoCollectModel')),

router\video.js

新建收藏视频路由

javascript 复制代码
// 收藏视频
router.post('/collect/:videoId', verifyToken(), videoController.collectVideo);

controller\videoController.js

实现收藏视频逻辑

javascript 复制代码
// 收藏视频
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 连接配置

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

model\redis\index.js

创建 redis 连接工具类

javascript 复制代码
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

实现视频热度管理

javascript 复制代码
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 获取热门视频

javascript 复制代码
// 获取热门视频
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

创建获取热门视频路由

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

controller\videoController.js

实现获取热门视频逻辑

javascript 复制代码
// 获取热门视频
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,
    });
  }
};
相关推荐
q***01651 小时前
Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
服务器·http·node.js
m***56721 小时前
docker下搭建redis集群
redis·docker·容器
f***68601 小时前
docker compose安装redis
redis·docker·容器
SoleMotive.9 小时前
如果用户反映页面跳转得非常慢,该如何排查
jvm·数据库·redis·算法·缓存
e***193510 小时前
docker compose安装redis
redis·docker·容器
v***160210 小时前
Linux安装Redis以及Redis三种启动方式
linux·redis·bootstrap
c***727410 小时前
Node.js NativeAddon 构建工具:node-gyp 安装与配置完全指南
node.js
w***741710 小时前
使用Node.js搭配express框架快速构建后端业务接口模块Demo
node.js·express
q***046310 小时前
node.js下载、安装、设置国内镜像源(永久)(Windows11)
node.js