redis
- 内存数据库(mysql是硬盘数据库)
- redis相关基础知识(安装、使用、node链接redis)可参考这篇博客
nodejs操作redis
- 进入weibo项目中,安装redis:
npm i redis --save --registry=https://registry.npm.taobao.org
- 获取全局环境参数,src下新建utils-env.js:
- 配置数据库(包括redis、mysql)的连接信息:在src下新建conf-db.js:根据全局环境参数来配置线上和线下的链接信息(现在先都用线下的来模拟)
- 连接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
}
- 注意:
- set()的参数3是数据有效时间(秒),过时即数据无效,到达指定时间后redis将自动清除数据
- 定义函数后在函数顶部输入jsDoc注释:写上注释的函数在被调用时鼠标移上去就会出现提示
- set()的参数1、2都是字符串格式的,所以使用set()时需要判断参数2是否为引用类型,如果参数是引用类型就要先使用
JSON.stringify()
将其转换为字符串类型的数组/对象,否则会自动使用toString()
方法进行转换,那结果会很麻烦。 - redis客户端的expire()用于处理过期数据
- get请求需要node向redis请求后获取一个redis返回的值,这是IO操作,而在node中IO操作是异步的。所以需要使用Promise对象对获取数据的过程进行封装。
- 由于之前存储数据时我们将对象转为JSON字符串了,所以输出数据时要先尝试将JSON字符串转回为JSON对象,而非JSON字符串则直接输出即可。同时要注意获取的值不存在时就返回空对象。
3-4