第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,
    });
  }
};
相关推荐
前端双越老师4 小时前
如何以前端视角(非0基础)学 Java ?
java·node.js·全栈
ShiXZ2135 小时前
Redis docker-compose 部署指南
redis·docker·eureka
青山木8 小时前
Redis 缓存一致性全解:从 Cache Aside 到延迟双删、Canal+MQ 的进阶之路
java·数据库·redis·后端·缓存
Kel8 小时前
Node.js 没那么复杂
人工智能·node.js·全栈
YDS8298 小时前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
星栈独行8 小时前
Node 接口该写同步还是异步?
服务器·开发语言·后端·程序人生·node.js
星栈1 天前
Node 接口该写同步还是异步?
后端·node.js
爬也要爬着前进1 天前
redis主从搭建
数据库·redis·缓存
用户095367515831 天前
在系统的学习 redis 前的疑惑
redis·go
半个落月1 天前
用 LangChain 连接远程 MCP:从工具发现到多轮调用闭环
人工智能·后端·node.js