利用nodejs+redis做熱門查看排行榜

邏輯比較簡單,大概是用戶點擊商品,對應(yīng)的為每個商品統(tǒng)計一下被點擊次數(shù),然后根據(jù)商品的次數(shù)降序排序得到一個熱門查看排行榜。

邏輯挺簡單,只是考慮排行榜的數(shù)據(jù)屬于熱點數(shù)據(jù),并發(fā)過多時,直接到數(shù)據(jù)庫可能會引起性能問題,所以這邊用redis隊列方式進行統(tǒng)計,所以數(shù)據(jù)還是會延遲更新到到數(shù)據(jù)庫的,生成排行榜時依舊是走數(shù)據(jù)庫(其實就是一種思路嘗鮮)。

所以這邊通過redis的List作為消息隊列,多個進程向隊列寫,一個進程讀取隊列,并將其更新到數(shù)據(jù)庫中,然后通過nodejs事件的方式進行消息的消化:

import * as events from "events";
import { RedisService } from "./redis.service";

export default class TestEvent extends events.EventEmitter {
  static client: TestEvent;

  private constructor() {
    super();
    this.setMaxListeners(0);
    this.on("cache_record", this.cacheRecord);
  }

  async cacheRecord(result: { result: any}) {
    // 將消息從右邊壓入隊列
    await RedisService.rpush("cache:key", values);
  }

  static getClient() {
    if (!TestEvent.client) {
      TestEvent.client = new TestEvent();
    }
    return TestEvent.client;
  }
}

通過事件把消息緩存到redis:

import TestEvent from "./test.event";

@Path("/detail")
export default class TestController {
  @GET("/:id")
  async searchPlant(req: Request, res: Response, next: NextFunction): Promise<void> {
    try {
        // 處理完業(yè)務(wù)邏輯后,通過事件將用戶點擊行為緩存到redis
        TestEvent.getClient().emit("cache_record", "");
        res.send();
    } catch (e) {
      console.log(e);
      next(new ErrorResponse("system error"));
    }
  }
}

現(xiàn)在消息的添加已經(jīng)有了,下一步進行消息緩存,通過setImmediate()去不斷的消費數(shù)據(jù):

// 通過redis包封裝的一些redis指令service
import { RedisService } from "./redis.service";

export async function persistenceRecord() {
  if (INSTANCE_ID === 0) {
    return setImmediate(persistenceRecord);
  }
  try {
    // 從隊列里取出消息,進行相應(yīng)處理
    // 這里需要注意,blpop是阻塞指令,不要和非阻塞指令共用一個連接
    const record: string = await RedisService.blpop(cache:key, 1800);
  } catch (e) {
    console.log(e);
  }
  // 自注冊,進行下一次消費
  setImmediate(persistenceRecord);
}

由于是用pm2開啟的cluster模式,所以必須通過pm2定義的cluster實例ID:INSTANCE_ID進行指定某個進程進行消息消費(詳情配置可看這里)。
至于blpop為什么不要和非阻塞指令共用一個連接,看這里。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原帖地址:http://www.itdecent.cn/p/2f14bc570563 redis概述 Redis...
    onlyHalfSoul閱讀 2,227評論 0 28
  • 五種數(shù)據(jù)結(jié)構(gòu)簡介 Redis是使用C編寫的,內(nèi)部實現(xiàn)了一個struct結(jié)構(gòu)體redisObject對象,通過結(jié)構(gòu)體...
    彥幀閱讀 7,153評論 0 14
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)、高可擴展、高可用、大數(shù)據(jù)存儲問題而產(chǎn)生的數(shù)據(jù)庫解決方...
    克魯?shù)吕?/span>閱讀 5,700評論 0 36
  • 使用緩存是系統(tǒng)性能優(yōu)化的第一黃金法則。 緩存的設(shè)計和使用對一個系統(tǒng)的性能至關(guān)重要,平時接觸到項目無論多少也都會在某...
    刀刃丿閱讀 1,388評論 0 6
  • 1、什么是Redis? Redis本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached,整個數(shù)據(jù)...
    為你變乖_09e6閱讀 1,028評論 0 20

友情鏈接更多精彩內(nèi)容