1.1.0 • Published 8 months ago

@playding/redis-cacher v1.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

interface-cacher

master

A simple cacher based on ioredis.

usage

npm i @playding/redis-cacher
const Cacher = require('@playding/redis-cacher');
const cacher = new Cacher();

const data = await cacher.get({
  key: 'ding',
  executor: async () => {
    // logic
    return 'dingding;
  },
});

changelogs

20220913 lru mem cache

const data = await cache.get({
  key: 'ding',
  executor: () => 'dingding',
  // 启用内存缓存
  mem: true,
});

有些场景下,缓存数据是静态的。例如首页广告位,在运营配置后一般短时间不会改变,也不会随着入参变化。

在之前的版本中,数据从执行函数中生成后,通过 json stringify 变为 string 放到 redis 中。而后的其他服务实例可以通过固定的 key 从 redis 获取该 string,反过来通过 json parse 解析到实际数据如 object|array。

对于静态数据,此时反序列化成为了最耗时的操作,特别是对于大对象。通过内存二级缓存,减少 json parse,降低 cpu 时间,提速操作。

需要注意的是,该特性是通过增加内存资源消耗来实现,所以如果 mem.max 放的很高,或者 cache obj 很大,会带来比较明显的内存使用增加。

JSDoc

Table of Contents

constructor

Parameters

  • payload

    • payload.redis Object? 用于 redis 的连接

      • payload.redis.host string host ip of redis (optional, default localhost)
      • payload.redis.port number port of redis (optional, default 6379)
      • payload.redis.db number cache db of redis (optional, default 12)
    • payload.prefix string key 的默认前缀 (optional, default cache.)

    • payload.expire number key 的有效期,单位 s (optional, default 5)
    • payload.mem (object | boolean)? 内存缓存配置,传 false 表示不启用。全部参数可以看这个文档说明

      • payload.mem.minRedisTtl number? 最小可放内存的 redis 过期时间阈值 ms。默认 1000ms,redis.ttl 结果小于 1000ms 的就不会放到内存。0 代表有效 ttl 会全放。
      • payload.mem.max number? 内存缓存 keys 数量上限

get

使用 redis 为接口加缓存

Parameters

  • payload Object

    • payload.key string 要查找的 key
    • payload.executor function 如果未击中,要执行的方法
    • payload.expire number 失效时间, 单位 s
    • payload.raw boolean 是否不用 decode/encode 数据 (optional, default false)
    • payload.mem boolean 是否对当前 key 启用内存缓存,默认不启用 (optional, default false)

Examples

说明:以给getShops接口加缓存为例
要点:executor为一个返回bluebird 的promise
getShops接口如下:
const getShops = (type) => {
  if (type === 0) {
    return Promise.reject(new Error('bad params'));
  }
  return Promise.resolve(['shop01', 'shop02']);
};

使用方式:
const Cacher = require('interface-cacher');

const cacher = new Cacher();

const payload = {
  key: 'getShops',
  executor: getShops.bind(null, 1),
  expire: 100
};

cacher.get(payload)
 .then((data) => {
   // process the data
 })
 .catch((err) => {
   // handle the exception when encounter with error
 });

const data = await cacher.get({
  key: 'getShopes'
  executor: getShops.bind(null, 1),
  // 启用内存缓存,如果内存命中自己返回内存结果
  // 如果内存没有,就会获取 redis 结果,解析后放到内存中
  mem: true
}

Returns Promise[Object](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object) 缓存中数据(击中) 或 executor 返回数据(未击中)

delete

删除指定缓存

Parameters

Returns Promise[number](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number) n 删除的 key 的数量, 同 ioredis.del