@@ -20,6 +20,7 @@ import (
2020 pgxzap "github.com/jackc/pgx-zap"
2121 "github.com/jackc/pgx/v5/pgxpool"
2222 "github.com/jackc/pgx/v5/tracelog"
23+ "github.com/maypok86/otter"
2324 "github.com/segmentio/encoding/json"
2425 "go.uber.org/zap"
2526 "go.uber.org/zap/zapcore"
@@ -80,19 +81,35 @@ func NewApiServer(config config.Config) *ApiServer {
8081
8182 pool , err := pgxpool .NewWithConfig (context .Background (), connConfig )
8283 if err != nil {
83- logger .Error ("db connect failed" , zap .Error (err ))
84+ logger .Fatal ("db connect failed" , zap .Error (err ))
85+ }
86+
87+ resolveHandleCache , err := otter.MustBuilder [string , int32 ](50_000 ).
88+ CollectStats ().
89+ Build ()
90+ if err != nil {
91+ panic (err )
92+ }
93+
94+ resolveWalletCache , err := otter.MustBuilder [string , int32 ](50_000 ).
95+ CollectStats ().
96+ Build ()
97+ if err != nil {
98+ panic (err )
8499 }
85100
86101 app := & ApiServer {
87- fiber .New (fiber.Config {
102+ App : fiber .New (fiber.Config {
88103 JSONEncoder : json .Marshal ,
89104 JSONDecoder : json .Unmarshal ,
90105 ErrorHandler : errorHandler (logger ),
91106 }),
92- pool ,
93- dbv1 .New (pool ),
94- logger ,
95- time .Now (),
107+ pool : pool ,
108+ queries : dbv1 .New (pool ),
109+ logger : logger ,
110+ started : time .Now (),
111+ resolveHandleCache : resolveHandleCache ,
112+ resolveWalletCache : resolveWalletCache ,
96113 }
97114
98115 app .Use (recover .New (recover.Config {
@@ -218,10 +235,12 @@ func NewApiServer(config config.Config) *ApiServer {
218235
219236type ApiServer struct {
220237 * fiber.App
221- pool * pgxpool.Pool
222- queries * dbv1.Queries
223- logger * zap.Logger
224- started time.Time
238+ pool * pgxpool.Pool
239+ queries * dbv1.Queries
240+ logger * zap.Logger
241+ started time.Time
242+ resolveHandleCache otter.Cache [string , int32 ]
243+ resolveWalletCache otter.Cache [string , int32 ]
225244}
226245
227246func (app * ApiServer ) home (c * fiber.Ctx ) error {
@@ -246,10 +265,13 @@ func decodeIdList(c *fiber.Ctx) []int32 {
246265}
247266
248267func (app * ApiServer ) resolveUserHandleToId (handle string ) (int32 , error ) {
249- // todo: can do some in memory cache here
268+ if hit , ok := app .resolveHandleCache .Get (handle ); ok {
269+ return hit , nil
270+ }
250271 var userId int32
251272 sql := `select user_id from users where handle_lc = lower($1)`
252273 err := app .pool .QueryRow (context .Background (), sql , handle ).Scan (& userId )
274+ app .resolveHandleCache .Set (handle , userId )
253275 return userId , err
254276}
255277
0 commit comments