服务端复杂的数据库查询会严重降低访问速度,我们需要将一些常用的接口数据进行存储,用户在获取数据的时候,直接将数据从内存中读取,不进行数据库查询,可以大大提高服务器性能。存储方式主要有文件存储和内存存储,文件存储通过fs模块写入读取txt文件,不多说;这里使用redis内存存储。
一、下载安装redis软件
1、windows安装,下载目录:https://github.com/MicrosoftArchive/redis/releases,解压,打开redis-server.exe,开启redis服务
2、linux安装
查看系统是否安装redis
yum info redis
如果没有安装,执行以下步骤
安装epel库
yum install epel-release -y
安装redis
yum install redis -y
操作
启动:systemctl start redis
重启:systemctl restart redis
关闭:systemctl stop redis
设置开机启动
systemctl enable redis
3、mac安装
brew install redis
brew services start redis
redis-server /usr/local/etc/redis.conf
二、egg使用redis
1、安装egg-redis依赖
npm i egg-redis -S
2、config/plugin.js中引入插件
exports.redis = {
enable: true,
package: 'egg-redis'
}
3、config.default.js中配置连接地址
config.redis = {
client: {
port: 6379,
host: '127.0.0.1',
password: '',
db: 0
},
}
4、在egg中使用
await this.app.redis.set('userInfo', '张三');
let userInfo = await this.app.redis.get('userInfo');
5、建议封装redis工具,对数据做进一步优化处理。新建一个服务文件redis.js
const Service = require('egg').Service;
class RedisService extends Service {
// 设置
async set(key, value, seconds) {
// seconds 有效时长
let { redis } = this.app;
value = JSON.stringify(value);
if(!seconds){
await redis.set(key, value);
}else{
// 设置有效时间
await redis.set(key, value, 'EX', seconds);
}
}
// 获取
async get(key) {
let { redis } = this.app;
let data = await redis.get(key);
if (!data) return;
data = JSON.parse(data);
return data;
}
// 清空redis
async flushall() {
let { redis } = this.app;
redis.flushall();
return;
}
}
module.exports = RedisService;
6、使用
console.time() // 开始计时
let goodsList = await this.service.redis.get('goodsList');
if (!goodsList) {
console.log('没有redis缓存')
goodsList = await this.app.mysql.select('goods');
this.service.redis.set('goodsList', goodsList);
}
console.timeEnd() // 打印时长
await this.ctx.body = goodsList;
可以看到,第一次访问没有redis缓存,时间是9毫秒,第二次访问,从redis中获取数据,时间是0.6毫秒。这仅仅是一次数据库查询,如果进行复杂的数据库查询以及逻辑处理,耗费的时间会更长,redis可以将速度提升至原来的数十倍甚至数百倍!
7、关闭redis
在config/plugin.js中将redis的enable改为false
exports.redis = {
enable: false,
package: 'egg-redis'
}
在service/redis.js中添加判断,以get方法为例
let { redis } = this.app;
if (redis) { // 开启redis
let data = await redis.get(key);
if (!data) return;
data = JSON.parse(data);
return data;
} else { // 关闭redis,直接返回空
return;
}