设置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,一经查实,立即删除!

相关文章

gazebo 直接获取传感器数据_【ROS-Gazebo】IMU插件使用与数据采集——以四足机器人pigot为例...

最近在琢磨别的事情&#xff0c;Gazebo探索上面进展不大&#xff0c;但也有一些收获&#xff0c;秉承慢慢写的佛系态度记录一下&#xff1a;pigot四足项目的步态改进&#xff0c;前行换成了摆线步态&#xff0c;加入了斜向步态Gazebo-IMU(惯性测量单元)插件的用法利用rqt_plot绘…

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

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

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

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

bootstrap框架过时了吗_为何前端都不愿意用bootstrap框架

Bootstrap框架属于UI框架&#xff0c;这个和jQuery不太一样&#xff0c;其实准确的描述Bootstrap框架属于css框架而非javascript框架&#xff0c;但是它本身也使用javascript来完善Bootstrap框架的视觉效果。此外&#xff0c;Bootstrap框架十分超前&#xff0c;在支持html5和cs…

go语言mysql框架_超级详细:Go语言框架Gin和Gorm实现一个完整的待办事项微服务...

前言本文通过一步一步的设计&#xff0c;最终实现一个完善的todo应用。我们使用GO框架Gin用户路由控制和返回数据。使用Gorm用于操作数据库。读者可根据本教程操作&#xff0c;最终实现列出的各项功能。技术清单本文中所涉及的技术内容主要有以下几种&#xff1a;Gin&#xff1…

ef mysql 外键 一对一_MySQL 外键 一对一 一对多 多对多 复制

#外键## 1,学习外键首先要明白表与表之间的关系​ 首先要换位思考 在考虑了这边 还要考虑另一边​ 然后在下定论### 判断表关系的语法#### 图书与出版社​ 一本书可不可以有多个出版社 不可以​ 一个出版社可不可以出版多本书 可以​ 这就是一对多关系#### 图书与作者​ 一本书…

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…

ai如何置入_ai图片(ai怎么把图片嵌入到图形里)

怎样将Ai格式的图片转换成常用的jpg&#xff0c;用什么软件转换&#xff1f;ai后缀的图片是指通过Illustrator(简称ai )软件储存得到的图片格式 这种格式的图片是矢量的&#xff0c;也就是说像freehand,Coredraw那样子的图片可以随意放大但不失真的那种 .在AI中&#xff0c;插入…

在模糊查询中怎样事先加载页面_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…

php mysql关键技术_中高级PHP开发者应该掌握哪些技术?

1.Linux能够流畅的使用Shell脚本来完成很多自动化的工作&#xff1b;awk/sed/perl 也操作的不错&#xff0c;能够完成很多文本处理和数据统计等工作&#xff1b;基本能够安装大 部分非特殊的Linux程序(包括各种库、包、第三方依赖等等&#xff0c;比如MongoDB/Redis/Sphinx/Lun…

python 简单socket_Python 简单socket

OSI七层模型(Open System Interconnection&#xff0c;开放式系统互联)应用层表示层回话层传输层 tcp,udp网络层 ip,icmp数据链路层 mac地址物理层 物理网卡服务端&#xff1a;import socket#实例化&#xff0c;绑定&#xff0c;监听&#xff0c;等待&#xff0c;解构(标识,ip-…

wxpython有哪些基本功能_用Python中的wxPython实现最基本的浏览器功能

通常&#xff0c;大多数应用程序通过保持 HTML 简单来解决大多数浏览器问题 ― 或者说&#xff0c;根据最低共同特性来编写。然而&#xff0c;即便如此&#xff0c;也仍然存在字体和布局的问题&#xff0c;发行新浏览器和升级现有浏览器时&#xff0c;也免不了测试应用程序的痛…

python增删改查mysql_python对数据库mysql的操作(增删改查)

#codingutf-8import pymysql# #查询# def connMySQL():# try:# connpymysql.connect(‘localhost‘,‘root‘,‘admin‘)# conn.select_db(‘five‘)# except Exception as e:# return e.args# else:# curconn.cursor()# cur.execute("select * from users")# datacu…

指数函数中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创建response对象_创建一个HttpResponse对象

创建一个HttpResponse对象HttpResponse类实现了javax.servlet.http.HttpServletResponse。跟随它的是一个叫做 HttpResponseFacade的faade类。Figure 3.3显示了HttpResponse类和它的相关类的UML图。在第2章中&#xff0c;你使用的是一个部分实现的HttpResponse类。例如&#xf…