訪問 Redis 也好、MySQL 都是一種網路通信,屬於 IO 密集型的任務。
任務中,若能在最小 IO 操作次數的條件下完成任務是最好。
我今天一個 api 不算訪問 DB 的話,跟 Redis 有 6-8 次的連接,包含了 tryLock 跟 unLock,明天計畫要用 Lua 腳本看可不可以只用一次連接把結果都聚合後再到 Java 做 CPU 密集型的任務。
預計這樣會在高併發的環境下降低不少的效能消耗,我蠻期待的。
另外 TX 的範圍也要縮小,需要重新規劃一下,不然現在同一個 TX 下要做的操作太多了,交易時間會拉很長。交易時間很長的話,其他想要存取相同資源的線程就會等很久,整個系統變很慢,有點像鎖的概念吧,DB 連線被佔用,後面來的請求就沒有連線可以用。
再來就是整個交易期間一定會有更多資料被載入 JVM,不管是物件還是什麼,時間拉越長這些東西就會一直清不掉,因為在交易結束前是不會 GC 這些東西的,這樣會增加記憶體負擔。