第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,
    });
  }
};
相关推荐
jiunian_cn41 分钟前
【Redis】list数据类型相关指令
数据库·redis·list
Big Cole1 小时前
PHP面试题(Redis核心知识篇)
开发语言·redis·php
TracyCoder1231 小时前
Redis分布式限流技术原理与实战
redis
小北方城市网1 小时前
MongoDB 分布式存储与查询优化:从副本集到分片集群
java·spring boot·redis·分布式·wpf
xxxmine14 小时前
redis学习
数据库·redis·学习
qq_54702617914 小时前
Redis 常见问题
数据库·redis·mybatis
知识即是力量ol15 小时前
基于 Redis 实现白名单,黑名单机制详解及应用场景
数据库·redis·缓存
CoLiuRs15 小时前
语义搜索系统原理与实现
redis·python·向量·es
fengxin_rou17 小时前
Redis 从零到精通:第一篇 初识redis
数据库·redis·缓存
陌上丨20 小时前
Redis内存使用率在95%以上,请问是什么原因?如何解决?
数据库·redis·缓存