redis与jest基本使用方法

redis

  • 内存数据库(mysql是硬盘数据库)
  • redis相关基础知识(安装、使用、node链接redis)可参考这篇博客

nodejs操作redis

  1. 进入weibo项目中,安装redisnpm i redis --save --registry=https://registry.npm.taobao.org
  2. 获取全局环境参数,src下新建utils-env.jsutils-env.js
  3. 配置数据库(包括redis、mysql)的连接信息:在src下新建conf-db.jsconf-db.js根据全局环境参数来配置线上和线下的链接信息(现在先都用线下的来模拟)
  4. 连接redis并提供对redis中数据的读取方法(get/set),在src下新建cache-_redis.js_的意思:该文件是内部文件,不对外公开):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    /**
    * @description 链接redis,提供读取redis数据的方法(get set)
    * @author hlz
    */

    const redis = require('redis')
    const { REDIS_CONF } = require('../conf/db')

    // 创建客户端
    const redisClient = redis.createClient(REDIS_CONF.port, REDIS_CONF.host)
    redisClient.on('error', err => {
    console.log('redis error', err)
    })

    /**
    * redis set方法
    * @param {string} key 键
    * @param {string} val 值
    * @param {number} timeout 过期时间,单位s
    */
    function set(key, val, timeout = 60 * 60) {
    if (typeof val === 'object') {
    val = JSON.stringify(val)
    }
    redisClient.set(key, val)
    redisClient.expire(key, timeout) // 处理过期数据
    }

    /**
    * redis get方法
    * @param {string} key 键
    */
    function get(key) {
    const promise = new Promise((resolve, reject) => {
    redisClient.get(key, (err, val) => {
    if (err) {
    console.error(err)
    return
    }
    if (val === null) {
    resolve(null)
    return
    }
    try {
    resolve(JSON.parse(val))
    } catch (ex) {
    resolve(val)
    }
    })
    })
    return promise
    }

    module.exports = {
    set,
    get
    }
  • 注意
    1. set()参数3数据有效时间(秒),过时即数据无效,到达指定时间后redis将自动清除数据
    2. 定义函数后在函数顶部输入jsDoc注释函数的jsDoc注释写上注释的函数在被调用时鼠标移上去就会出现提示
    3. set()的参数1、2都是字符串格式的,所以使用set()时需要判断参数2是否为引用类型,如果参数是引用类型就要先使用JSON.stringify()将其转换为字符串类型的数组/对象,否则会自动使用toString()方法进行转换,那结果会很麻烦。
    4. redis客户端的expire()用于处理过期数据
    5. get请求需要node向redis请求后获取一个redis返回的值,这是IO操作,而在node中IO操作是异步的。所以需要使用Promise对象对获取数据的过程进行封装
    6. 由于之前存储数据时我们将对象转为JSON字符串了,所以输出数据时要先尝试将JSON字符串转回为JSON对象,而非JSON字符串则直接输出即可。同时要注意获取的值不存在时就返回空对象。

3-4

,