设置log缓存_node多级缓存之redis缓存

在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)中查看:

cabdb3f676ff895f121289df0a4b1d90.png

页面上对应的部分:

15a956e04b95a2fdcfdab44b2c42b0fb.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/508317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++实现决策树分类汽车评估数据集_R有监督机器学习-分类方法

当我们说机器学习的的时候&#xff0c;我们在说什么&#xff1f;来源于mlr3包的作者&#xff1a;https://mlr3book.mlr-org.com/basics.html上图解释了完整的机器学习流程&#xff0c;包括构建任务、准备训练数据集及测试数据集、选择学习方法&#xff08;leaner&#xff09;、…

lingo编程的主要方法_java并发编程 --并发问题的根源及主要解决方法

并发问题的根源在哪首先&#xff0c;我们要知道并发要解决的是什么问题&#xff1f;并发要解决的是单进程情况下硬件资源无法充分利用的问题。而造成这一问题的主要原因是CPU-内存-磁盘三者之间速度差异实在太大。如果将CPU的速度比作火箭的速度&#xff0c;那么内存的速度就像…

Mysql中Drop删除用户的名字_mysql5.5 使用drop删除用户

在说这个问题之前我们先讨论下关于在mysql中删除用户的方法和问题&#xff1a;其实在以前我删除mysql中的账号的时候用delete&#xff0c;一直没注意其实用这个命令删除账号会有一个问题就是使用delete删除账号后&#xff0c;只会清除user表的&#xff0c;在其它表中的信息还是…

docker建多个mysql_《容器化系列二》利用Docker容器化技术安装多个mysql

前提说明安装的Linux系统版本为Centos7.x一、安装docker并测试1、安装yum相关工具包///安装yum相关工具包yum install -y yum-utils device-mapper-persistent-data lvm2//发些报错&#xff0c;关闭刚刚睡眠中的进程kill -9 13312//再次执行yum install -y yum-utils device-ma…

mysql 元数据获取_[MySQL] 获取元数据的步骤

[MySQL] 获取元数据的方法 MySQL提供了以下三种方法用于获取数据库对象的元数据&#xff1a; 1)show语句 2)从INFORMATION_SCHEMA数据库里查询相关表 3)命令行程序&#xff0c;如mysqlshow, mysqldump 用SHOW语句获取元数据 MySQL用show语句获取元数据是最常用的方法&#xff0…

在模糊查询中怎样事先加载页面_8种信息类型,中后台产品功能自查清单

产品经理在梳理产品需求文档时需要把每一个功能的逻辑关系、交互方式都整理全面&#xff0c;为了避免疏漏&#xff0c;与开发评审前&#xff0c;建议每位产品都 Check 几遍文档。本文整理了一份中后台产品功能自查清单&#xff0c;供大家参考&#xff0c;如有不全欢迎提建议~中…

mysql 8.0 手动安装教程_mysql 8.0.13手动安装教程

本文为大家分享了mysql 8.0.13手动安装教程&#xff0c;供大家参考&#xff0c;具体内容如下一、步骤解读1.下载MySQL下载地址选择 Downloads-->Community-->MySQL Community Server&#xff0c;然后拉到页面的最低端&#xff0c;点击“下载”。此时一般会提示登陆&#…

gff3转mysql_科学网-把GFF3文件导入MySQL数据库-闫双勇的博文

什么是GFF3?这个一种序列注释文件的格式&#xff0c;基因组注释数据常常会用这种格式来记录序列注释信息&#xff0c;关于这种格式的更多信息&#xff0c;可以在这里学习&#xff1a;http://www.sequenceontology.org/gff3.shtml这里简单说下&#xff0c;怎样把GFF3文件导入My…

mysql时间字段不走索引_MySQL使用=或=范围查询时不走索引

2020-02-27最近一个日志页面查询很慢&#xff0c;然后去跟踪了查询sql&#xff0c;发现日期字段上即使建了索引&#xff0c;查询还是很慢&#xff0c;执行语句还是使用了全表扫描&#xff0c;于是继续分析下去。查询语句类似:select * from logs where createtime > 2020-01…

指数函数中x的取值范围_指数函数x的取值范围是

1、指数函数x的取值范围是a>0且a不1&#xff1b;2、指数函数是重要的基本初等函数之一。一般地&#xff0c;yax函数(a为常数且以a>0&#xff0c;a≠1)叫做指数函数&#xff0c;函数的定义域是 R &#xff1b;3、&#xff0c;在指数函数的定义表达式中&#xff0c;在ax前的…

java excutorthread_JAVA 线程池ThreadPoolExcutor原理探究

概论线程池(英语&#xff1a;thread pool)&#xff1a;一种线程使用模式。线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线程&#xff0c;等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程…

websocket连接mysql_websocket 使用 spring 的service层 ,进而调用里面的 dao层 来操作数据库 ,包括redis、mysql等通用...

1.前言描述一下今天用websocket踩得坑 ---》空指针异常&#xff01;我想在websocket里面使用service 层的接口&#xff0c;从中获取数据库的一些信息 &#xff0c;使用 Autowired 注解 接口 &#xff0c;报错 空指针异常 &#xff01;&#xff01;&#xff01;查过资料才发…

世上最简单的mysql_最简单易懂的mysql安装教程

今天安装MySQL花了蛮长时间的&#xff0c;感觉坑还是挺多的&#xff0c;写遍文章总结一下。一、安装1.解压zip包到安装目录先从MySQL官网 下载mysql最新的免安装版压缩包解压之后变成这个样子&#xff1a;里面的文件是这个样子下面开始了&#xff0c;请注意2.配置文件在安装目录…

aix系统升级失败提示java_AIX系统补丁升级失败处理

问题描述&#xff1a;现网一台IBM P550小型机&#xff0c;初始版本通过oslevel –r命令检查为5300-02&#xff0c;在IBM官方网站下载5300-06补丁并升级到5300-06后系统报错&#xff0c;缺少sysmgt.websm.apps 5.3.0.60&#xff0c;sysmgt.websm.rte 5.3.0.60两个文件问题处理&a…

java arraylist char,Java基础学习笔记六 Java基础语法之类和ArrayList详解

引用数据类型引用数据类型分类&#xff0c;提到引用数据类型(类)&#xff0c;其实我们对它并不陌生&#xff0c;如使用过的Scanner类、Random类。我们可以把类的类型为两种&#xff1a;第一种&#xff0c;Java为我们提供好的类&#xff0c;如Scanner类&#xff0c;Random类等&a…

matlab 数值解 期权顶级啊,潮盈期权院高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍...

主题&#xff1a;高胜率交易技巧系列之二----期权交易策略及基于MATLAB统计套利介绍会场流程&#xff1a;13:30--14:00&#xff1a;参会嘉宾到场签名14:00--14:45&#xff1a;期权知识14:45--15:25&#xff1a;期权交易策略使用15:25--15:35&#xff1a;茶歇15:35--16:35&#…

php的用例图箭头怎么画,需求中如何画用例图 - china008的个人空间 - OSCHINA - 中文开源技术交流社区...

UML用例图用例图主要用来图示化系统的主事件流程&#xff0c;它主要用来描述客户的需求&#xff0c;即用户希望系统具备的完成一定功能的动作&#xff0c;通俗地理解用例就是软件的功能模块&#xff0c;所以是 设计系统分析阶段的起点&#xff0c;设计人员根据客户的需求来创建…

oracle学习数据,Oracle从入门到精通的学习笔记

本次知识点:1.认识SQL的介绍2.掌握scott用户的数据结构3.查询语句之简单查询1.SQL:SQL是指结构化查询语言,在80年代的时候,基本存在80多种数据库,每一种数据库都有自己的的操作命令,也就导致了程序员从一个数据库到另一个数据库的转化时变的极为麻烦,基本就要从新学习.在70年代…

强行更改linux服务器时间,加强Linux服务器安全的20项建议

一般情况下用 Linux 做桌面在默认配置下是很安全的&#xff0c;我在一定程度上同意这个说法(很值得商榷的话题)。不过 Linux 内置的安全模型和工具做得确实很到位&#xff0c;用户只需进行简单的调整和自定义就可以加强 Linux 服务器安全。与恶意用户做斗争对于所有 Linux 系统…

linux终端提示符含义,Linux:终端提示符 (prompt) 不如期生效原因

前言先来简单介绍下, prompt是什么鬼? 顾名思义就是提示符的意思, 看起来和我们遥远, 但实际上只要是每个接触shell的童鞋, 都有看到, 那就是我们在输命令时前面的那串提示符.例如:当然, 这个样式是可以修改的, 这就涉及到我们的PS1和PS2了, 有经验或者以前有设置过的童鞋估计…