redis.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import * as redis from 'redis';
  2. import { getLogger } from './loggers';
  3. const logger = getLogger('redis');
  4. export default class {
  5. private client: redis.RedisClient;
  6. private expireAfter: number;
  7. constructor(opt: IRedisConfig) {
  8. this.client = redis.createClient({
  9. host: opt.redisHost,
  10. port: opt.redisPort,
  11. });
  12. this.expireAfter = opt.redisExpireTime;
  13. logger.info(`loaded redis service at ${opt.redisHost}:${opt.redisPort}`);
  14. }
  15. private chatAsString = (chat: IChat) => `${chat.chatType}:${chat.chatID.toString()}`;
  16. public cacheContent = (contentId: string, content: string) =>
  17. new Promise<'OK'>((resolve, reject) =>
  18. this.client.set(`content/${contentId}`, content, 'EX', 3600 * 24, (err, res) =>
  19. err ? reject(err) : resolve(res)
  20. )
  21. ).then(res => {
  22. logger.debug(`cached content ${contentId}, result: ${res}`);
  23. }).catch((err: Error) => {
  24. logger.error(`failed to cache content ${contentId}, error: ${err}`);
  25. });
  26. public cacheForChat = (postId: string, target: IChat) => {
  27. const targetStr = this.chatAsString(target);
  28. return new Promise<'OK'>((resolve, reject) =>
  29. this.client.set(`sent/${targetStr}/${postId}`, 'true', 'EX', this.expireAfter, (err, res) =>
  30. err ? reject(err) : resolve(res)
  31. )
  32. ).then(res => {
  33. logger.debug(`cached post ${postId} for ${targetStr}, result: ${res}`);
  34. }).catch((err: Error) => {
  35. logger.error(`failed to cache post ${postId} for ${targetStr}, error: ${err}`);
  36. });
  37. };
  38. public getContent = (contentId: string) =>
  39. new Promise<string>((resolve, reject) =>
  40. this.client.get(`content/${contentId}`, (err, res) => err ? reject(err) : resolve(res))
  41. ).then(res => {
  42. logger.debug(`retrieved cached content ${contentId}, result: ${res}`);
  43. return res;
  44. }).catch((err: Error) => {
  45. logger.error(`failed to retrieve cached content ${contentId}, error: ${err}`);
  46. throw err;
  47. });
  48. public isCachedForChat = (postId: string, target: IChat) => {
  49. const targetStr = this.chatAsString(target);
  50. return new Promise<number>((resolve, reject) =>
  51. this.client.exists(`sent/${targetStr}/${postId}`, (err, res) => err ? reject(err) : resolve(res))
  52. ).then(res => {
  53. logger.debug(`retrieved status of post ${postId} for ${targetStr}, result: ${res}`);
  54. return Boolean(res);
  55. }).catch((err: Error) => {
  56. logger.error(`failed to retrieve status of post ${postId} for ${targetStr}, error: ${err}`);
  57. return false;
  58. });
  59. };
  60. }