node-redis
support operation redis server in nodejs.
We use nuxt.js formwork in my team, when need cache data we create class to implement redis api like read
, write
, fetch
methods let's show you code
// redis.js const Redis = require('redis') const { promisify } = require("util"); const DEFAULT_URL = 'redis://127.0.0.1:6379' const PREFIX = '__prefix:' const DEFAULT_EXPIRES = '7d' export class Redis { constructor(url, options={} ) { this.url = url || DEFAULT_URL this.store = Redis.createClient({ url: this.url, prefix: PREFIX, }) this.client = { get: key => { const start = new Date() const getAsync = promisify(this.store.get).bind(this.store) return getAsync(key).finally(console.log({ action: 'READ', key, start })) }, set: (key, val) => { const start = new Date() const setAsync = promisify(this.store.set).bind(this.store) return setAsync(key, val).finally(console.log({ action: 'WRITE', key, start })) }, setex: (key, expires, val) => { const start = new Date() const setexAsync = promisify(this.store.setex).bind(this.store) return setexAsync(key, expires, val).finally(console.log({ action: 'WRITE', key, start, expires })) }, } } disconnect(callback) { this.store.quit(callback) } async read(key) { const res = await this.client.get(key) if (!res) { return null } try { return JSON.parse(res) } catch (ex) { return null } } async write(key, value, expires) { if (!expires) { expires = DEFAULT_EXPIRES } await this.client.setex(key, expires, JSON.stringify(value)) } async fetch(key, expires, callback) { let obj = await this.read(key) if (obj) { return obj } obj = await callback() await this.write(key, obj, expires) return obj } }
We can use redis cache more readable.
import Vue from 'vue' const cache = ()=>{ if(!Vue.$redis){ Vue.$redis = new Redis(process.env.REDIS_URL, options) } return Vue.$redis } const list = cache().fetch('cache-key', async ()=>{ const resp = await fetch('api/products') if(resp.err){ return [] }else{ return resp.data } })
Call Vue.$redis
fetch
method first find if havs cache in redis with key cache-key
.
If no cache found, fetch
method just call callback
fetch api/products
then return the response and cache it.
If call fetch
with cach-key
again will return the data from redis.
Hope help you :)
Top comments (1)
where do you call it? i'm trying to do this but getting error :
These dependencies were not found: