适合用来存储用户登录信息,存储执行任务的信息。

多进程内存模型

多核 CPU 擅长处理多进程任务,所有 web server 也都是多进程的,无论 PM2 、nginx 还是其他.但进程之间有内存隔离(操作系统的基本功能),所以需要第三方缓存服务。

比如用户第一次访问进入的是进程1,第二次访问进入的是进程2,因为进程之前的数据是隔离的。所以redis缓存就显得特别重要。

image.png

安装

brew services stop redis

  1. - **前台启动**
  2. ```javascript
  3. redis-server // 它是个可执行文件

node项目中添加redis缓存

  • 配置redis客户端 ```javascript redisConf= { port: “6379”, host: “127.0.0.1”, }
  1. ```javascript
  2. const { port, host, password } = redisConf;
  3. const opt = {};
  4. if (password) {
  5. opt.password = password; // prd 环境需要密码
  6. }
  7. const redisClient = createClient(port, host, opt);
  8. redisClient.on("error", (err) => console.log("Redis Client Error", err));
  9. module.exports = redisClient;
  • 封装缓存方法 ```javascript const redisClient = require(‘../db/redis’)

/**

  • redis set
  • @param {string} key key
  • @param {string|Object} val val
  • @param {number} timeout 过期时间,单位 s ,默认 1h / function cacheSet(key, val, timeout = 60 60) { let formatVal if (typeof val === ‘object’) {
    1. formatVal = JSON.stringify(val)
    } else {
    1. formatVal = val
    } redisClient.set(key, formatVal) redisClient.expire(key, timeout) //设置缓存时间,默认一小时 }

/**

  • redis get
  • @param {string} key key */ function cacheGet(key) { const promise = new Promise((resolve, reject) => {

    1. redisClient.get(key, (err, val) => {
    2. if (err) {
    3. reject(err)
    4. return
    5. }
    6. if (val == null) {
    7. resolve(null)
    8. return
    9. }
    10. try {
    11. resolve(JSON.parse(val))
    12. } catch (ex) {
    13. resolve(val)
    14. }
    15. })

    }) return promise }

module.exports = { cacheSet, cacheGet, }

  1. - 测试redis缓存读写正常
  2. ```javascript
  3. const { cacheGet, cacheSet } = require('../cache/index')
  4. // 测试数据库连接
  5. router.get('/api/db-check', async (ctx, next) => {
  6. // 测试 redis 连接
  7. cacheSet('name', 'biz editor sever OK - by redis')
  8. const redisTestVal = await cacheGet('name')
  9. ctx.body = {
  10. errno: 0,
  11. data: {
  12. // ENV,
  13. redisConn: redisTestVal != null,
  14. },
  15. }
  16. })

在egg.js中使用redis