在node项目开发过程中,缓存常常被用来解决高性能、高并发等问题。在我们的实际项目中,运用缓存的思路是内存缓存-->接口-->文件缓存。前面的总结中已经详细的说明了怎么实现和封装内存缓存和文件缓存。虽然二级缓存已经基本能够满足现在的所有场景需求,但现在我们再加一级redis缓存,从而使我们的项目更加稳定。

redis的封装:

const redis = require('redis');const myredis = {  client:null,  connect: function () {    let RDS_PORT = 6379,        //端口号      RDS_HOST = '94.191.**.**',    //服务器IP      RDS_PWD = '**********',    //密码          RDS_OPTS = {};            //设置项    this.client = redis.createClient(RDS_PORT, RDS_HOST, RDS_OPTS);    let c: any = this.client;    c.auth(RDS_PWD, function () {    console.log('通过认证');    });    c.on('error', function (err:any) {      console.log('redisCache Error ' + err);    });    c.on('ready', function () {      console.log('redisCache connection succeed');    });  },  init: function () {    this.connect(); // 创建连接    const instance:any = this.client;    // 主要重写了一下三个方法。可以根据需要定义。    const get = instance.get;    const set = instance.set;    const setex = instance.setex;    instance.set = function (key:any, value:any, callback:any) {      if (value !== undefined) {        set.call(instance, key, JSON.stringify(value), callback);      }    };    instance.get = function (key: any, callback: any) {      return new Promise(function(resolve,reject){        get.call(instance, key, (err: any, val: any) => {          resolve(JSON.parse(val))        })      })    };    instance.setex = function (key: any, value: any, callback: any) {      if (value !== undefined) {        setex.call(instance, key, 30*60*1000, JSON.stringify(value), callback);      }    };    return instance;  },};export default myredis.init();

为了满足更多场景的使用,我们这里对redis的set和get方法进行了重写,并在结尾导出了新的redisclient实例 instance ,在get 方法中,为了在外部调用的过程中直接拿到数据,我们使用了 Promise 封装了一下get方法。

使用:

.............import rediscache from "../redis";.............async function apiCache(input_options: apicache_options): Promise<any> { ............  let key: string  if (options.keystr != '') {    key = encryption.sha1('apicache:' + options.keystr)  }  else if (options.postdata != null) {    key = encryption.sha1('apicache:' + options.url + ';data:' + object_hash(options.postdata))  }  else {    key = encryption.sha1('apicache:' + options.url)   //根据页面路径生成key  }  //redis缓存  let redis_cache = await rediscache.get(key);  if (redis_cache != null){    return redis_cache;  };  //内存缓存  let api_memery_cache = memorycache.get(key)  if (api_memery_cache != null) {    return api_memery_cache.body  }  else {  //文件缓存     let api_file_cache = await filecache.get(key) //尝试文件缓存     // console.log(api_file_cache)    if (api_file_cache != null) {      // console.info('走文件')      memorycache.put(key, api_file_cache) //写入内存      refreshCache(key, api_file_cache.time, options)      return api_file_cache.body    }  }  // console.info('直接调接口')  try {    let aoptions: any = {      method: options.method,      url: options.url,      timeout: options.timeout,      data: options.postdata,      headers: options.headers    }    if (options.is_stream) {      aoptions.responseType = 'arraybuffer'      aoptions.responseEncoding = 'binary'    }    let back = await axios(aoptions)    // console.log(back)    let backdata = back.data;    if (options.error_replace && options.check_callback) {      if (options.check_callback(backdata)) {      }      else {        logger.error({          'error_message': '接口返回数据验证失败',          'url': options.url        })        backdata = options.error_replace      }    }    let cache_content = {      time: Date.now(),      body: backdata    }    rediscache.set(key, cache_content)        memorycache.put(key, cache_content)    filecache.put(key, cache_content)    if (options.success_log) {      logger.info({        url: options.url,        back: backdata      })    }    return backdata  } catch (error) {    logger.error({      'error_message': error.message,      'url': options.url    })    if (options.error_replace !== undefined) {      return options.error_replace    }    else {      throw error    }  }}export default apiCache

完整的缓存中间件就不赘述,可看以前的总结web建站小结 ,在上面的删减版的代码中,为了方便观察,将redis缓存的读写放在了最上面,启动项目,在redis桌面管理工具(RedisDesktopManager)中查看:

页面上对应的部分:

设置log缓存_node多级缓存之redis缓存相关推荐

  1. python redis缓存原理_python笔记-12 redis缓存

    一.redis引入 1.简要概括redis 1.1 redis默认端口:6379 1.2 redis实现的效果:资源共享 1.3 redis实现的基本原理:不同的进程和一个公共的进程之间建立socke ...

  2. java用redis缓存的步骤_Java 使用Redis缓存工具的图文详细方法

    开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. (1)Java的安装配置可以参考我们的 Java ...

  3. Spring Boot Redis缓存

    Spring Boot Redis缓存 目录[ 隐藏 ] 1 Spring Boot Redis缓存 1.1 Spring Boot Redis项目设置 1.2 Spring Boot Redis缓存 ...

  4. redis专题:redis缓存穿透、缓存击穿、缓存雪崩等问题如何解决?

    文章目录 1. 缓存穿透 1.1 缓存空对象 1.2 布隆过滤器 2. 缓存击穿(失效) 3. 缓存雪崩 在高并发项目中,redis作为热门中间件,在为项目带来便利性的同时,也存在一些隐患,比如缓存穿 ...

  5. Spring Boot整合Redis缓存(Lettuce)

    spring-boot-demo-cache-redis 此 demo 主要演示了 Spring Boot 如何整合 redis,操作redis中的数据,并使用redis缓存数据.连接池使用 Lett ...

  6. 京东java多级缓存_多级缓存设计详解 | 给数据库减负,刻不容缓!

    来这里找志同道合的小伙伴! 作 者 简 介 王梓晨 自古兵家多谋,<谋攻篇>,"故上兵伐谋,其次伐交,其次伐兵,其下攻城.攻城之法,为不得已",可见攻城之计有很多种,而 ...

  7. Redis缓存预热、缓存穿透、缓存击穿、缓存雪崩,Redis布隆过滤器怎么实现?

    目录 一.缓存预热 1.缓存预热常见步骤 2.代码实现 二.缓存雪崩 1.什么情况会发生缓存雪崩? 2.Redis缓存集群实现高可用 3.如何避免Redis缓存雪崩? 三.缓存穿透 1.什么情况会发生 ...

  8. 面试官:谈谈Redis缓存和MySQL数据一致性问题

    前言 对于Web来说,用户量和访问量增一定程度上推动项目技术和架构的更迭和进步.可能会有以下的一些状况: 页面并发量和访问量并不多,MySQL足以支撑自己逻辑业务的发展.那么其实可以不加缓存.最多对静 ...

  9. Redis 缓存常见问题 :缓存雪崩,缓存击穿,缓存穿透,缓存预热

    文章目录 缓存雪崩 缓存击穿 缓存穿透 缓存预热 缓存雪崩 缓存雪崩指的是在短时间内,有大量缓存的键同时过期,由于缓存过期,导致此时所有的请求就直接查询数据库,而数据库很难抵挡这样巨大的压力,严重情况 ...

最新文章

  1. 怎样用python画雪花_python使用turtle库与random库绘制雪花
  2. pycharm多光标设置
  3. ASP.NET Core CORS 简单使用
  4. swingworker_使用SwingWorker的Java Swing中的多线程
  5. 管理系统 c++图形界面_锁螺母ERP系统,一站式各国语言管理系统
  6. 春秋时期被误解的人才。
  7. win10系统资源管理器打开反应很慢如何解决
  8. Linux文件默认权限——umask
  9. 流式计算storm应用场景简介
  10. leecode - 入门 -- 双指针总结
  11. Android - 资源(resource)转换为String
  12. 终于等到你——ggplot2树状图
  13. 关于float与double区别
  14. 天联高级版服务器信息怎么查,天联高级版
  15. java数组排序函数
  16. 做微信小程序商城需要什么材料?
  17. 英特尔核心显卡控制面板设置自定义分辨率
  18. 教程:QuickTime 录屏的同时录制电脑中播放的声音,播放的歌曲等
  19. python查找元素在列表中位置
  20. Hazelcast IMDG参考中文版手册-第三章-概述

热门文章

  1. cuda tensorflow版本对应_Windows10下安装tensorflow-gpu(2.2.0)安装教程(避坑+保姆式教学)...
  2. arm shellcode 编写详析1
  3. 限流算法(漏桶算法、令牌桶算法)对比
  4. Xcode中的-ObjC和-all_load
  5. 小孔成像实验探究的软件_探究小孔成像实验报告.doc
  6. 反函数连续性定理 反三角_高中数学:三角函数诱导公式及诱导公式口诀
  7. Android studio的Activity详解
  8. el-table 树形表格 自定义展开图标_[shell脚本]表格数据在终端可视化输出
  9. python tkinter画笑脸_Python3 tkinter基础 Canvas create_polygon 画三角形
  10. 怎么判断一个字符串的最长回文子串是否在头尾_每日一道算法题,让你的头脑更活跃(寻找最长回文子串)...