@@ -18,8 +18,9 @@ import (
18
18
)
19
19
20
20
var (
21
- child bool
22
- db * pgxpool.Pool
21
+ child bool
22
+ db * pgxpool.Pool
23
+ cachedWorlds Worlds
23
24
)
24
25
25
26
const (
@@ -28,7 +29,7 @@ const (
28
29
helloworld = "Hello, World!"
29
30
worldselectsql = "SELECT id, randomNumber FROM World WHERE id = $1"
30
31
worldupdatesql = "UPDATE World SET randomNumber = $1 WHERE id = $2"
31
- worldcachesql = "SELECT * FROM World"
32
+ worldcachesql = "SELECT * FROM World LIMIT $1 "
32
33
fortuneselectsql = "SELECT id, message FROM Fortune"
33
34
)
34
35
@@ -112,7 +113,7 @@ func ReleaseWorld(w *World) {
112
113
// WorldsPool ...
113
114
var WorldsPool = sync.Pool {
114
115
New : func () interface {} {
115
- return make (Worlds , 0 , 512 )
116
+ return make (Worlds , 0 , 500 )
116
117
},
117
118
}
118
119
@@ -144,6 +145,27 @@ func initDatabase() {
144
145
if err != nil {
145
146
panic (err )
146
147
}
148
+ populateCache ()
149
+ }
150
+
151
+ // this will populate the cached worlds for the cache test
152
+ func populateCache () {
153
+ worlds := make (Worlds , worldcount )
154
+ rows , err := db .Query (context .Background (), worldcachesql , worldcount )
155
+ if err != nil {
156
+ panic (err )
157
+ }
158
+ for i := 0 ; i < worldcount ; i ++ {
159
+ w := & worlds [i ]
160
+ if ! rows .Next () {
161
+ break
162
+ }
163
+ if err := rows .Scan (& w .ID , & w .RandomNumber ); err != nil {
164
+ panic (err )
165
+ }
166
+ //db.QueryRow(context.Background(), worldselectsql, RandomWorld()).Scan(&w.ID, &w.RandomNumber)
167
+ }
168
+ cachedWorlds = worlds
147
169
}
148
170
149
171
// jsonHandler :
@@ -226,26 +248,15 @@ func plaintextHandler(c *fiber.Ctx) {
226
248
c .SendString (helloworld )
227
249
}
228
250
229
- var cachePopulated = false
230
- var catchedWorlds []World
231
-
232
- func populateCache () {
233
- worlds := AcquireWorlds ()[:500 ]
234
- for i := 0 ; i < 500 ; i ++ {
235
- w := & worlds [i ]
236
- db .QueryRow (context .Background (), worldselectsql , RandomWorld ()).Scan (& w .ID , & w .RandomNumber )
237
- }
238
- catchedWorlds = worlds
239
- cachePopulated = true
240
- }
241
-
242
251
// cachedHandler :
243
252
func cachedHandler (c * fiber.Ctx ) {
244
- if ! cachePopulated {
245
- populateCache ()
246
- }
247
253
n := QueriesCount (c )
248
- c .JSON (catchedWorlds [:n ])
254
+ worlds := AcquireWorlds ()[:n ]
255
+ for i := 0 ; i < n ; i ++ {
256
+ worlds [i ] = cachedWorlds [RandomWorld ()- 1 ]
257
+ }
258
+ c .JSON (worlds )
259
+ ReleaseWorlds (worlds )
249
260
}
250
261
251
262
// RandomWorld :
0 commit comments