mirror of
https://github.com/wassname/talk.git
synced 2026-06-28 22:54:39 +08:00
62 lines
1.3 KiB
JavaScript
62 lines
1.3 KiB
JavaScript
const cache = require('./cache');
|
|
const debug = require('debug')('talk:services:hcache');
|
|
|
|
const kf = (key) => `hcache:${key}`;
|
|
|
|
const hcache = module.exports = {};
|
|
|
|
hcache.get = async (key, field = '__default__') => {
|
|
|
|
// Get the current value from redis.
|
|
const reply = await cache.client.hget(kf(key), field);
|
|
|
|
if (typeof reply !== 'undefined' && reply !== null) {
|
|
return JSON.parse(reply);
|
|
}
|
|
|
|
return null;
|
|
};
|
|
|
|
hcache.set = async (key, field = '__default__', value, expiry = 60) => {
|
|
|
|
// Serialize the value as JSON.
|
|
let reply = JSON.stringify(value);
|
|
|
|
return cache.client
|
|
.pipeline()
|
|
.hset(kf(key), field, reply)
|
|
.expire(kf(key), expiry)
|
|
.exec();
|
|
};
|
|
|
|
hcache.del = async (key, field = null) => {
|
|
if (field === null) {
|
|
return cache.client.del(kf(key));
|
|
}
|
|
|
|
return cache.client.hdel(kf(key), field);
|
|
};
|
|
|
|
hcache.wrap = async (key, field, expiry, work) => {
|
|
let value = await hcache.get(key, field);
|
|
if (value !== null) {
|
|
debug('wrap: hit', kf(key));
|
|
return value;
|
|
}
|
|
|
|
debug('wrap: miss', kf(key));
|
|
|
|
value = await work();
|
|
|
|
process.nextTick(async () => {
|
|
try {
|
|
await hcache.set(key, field, value, expiry);
|
|
debug('wrap: set complete');
|
|
} catch (err) {
|
|
console.error(err);
|
|
}
|
|
});
|
|
|
|
return value;
|
|
};
|