I'd like to save database results in memory because my database only changes 
between long time intervals.  By building a minimum application, I see my 
cache-strategy seems to work per servlet: by opening a new browser, the first 
request yields a cache-miss.

Looking through the documentation, I got the idea that perhaps I should 
serve/servlet using

   #:servlet-namespace '("shared-model.rkt")

where shared-model.rkt is the module that talks to the database and implements 
the caching-strategy.  But adding this keyword to serve/servlet did not make 
any perceived difference.

What should I do to save results in memory across all requests?

--- server.rkt
--------------------------------------------------------------------------
#lang racket/base
(require
web-server/servlet
web-server/servlet-env
(prefix-in model: "shared-model.rkt"))

(define-values (dispatch url)
  (dispatch-rules
   (("main") db->response)
   (("update" (string-arg)) update->response)))

(define (update->response r s)
  (define str (model:in-memory-db-set-and-get s))
  (displayln str)
  (string->response str))

(define (db->response r)
  (string->response (model:get-in-memory-results)))
;; no more api endpoints ==/==

(define (string->response s)
  (response/full 200 #"Okay" (current-seconds)
                 TEXT/HTML-MIME-TYPE '() (list (string->bytes/utf-8 s))))

(define (file-not-found r)
  (response/xexpr "File not found."))

(module+ main
  (file-stream-buffer-mode (current-output-port) 'line)
  (define (main)
    (displayln "Now serving...")
    (serve/servlet dispatch
                   ;; #:servlet-namespace '("shared-model.rkt")
                   #:stateless? #t
                   #:log-file (build-path "logs/httpd.log")
                   #:port 1111
                   #:listen-ip "127.0.0.1"
                   #:servlet-path "/"
                   #:servlet-regexp #rx""
                   #:extra-files-paths (list (build-path "pub/"))
                   #:server-root-path (build-path "/")
                   #:file-not-found-responder file-not-found))
  (main))
---------------------------------------------------------------------------

--- shared-model.rkt
---------------------------------------------------------------------------
#lang racket/base
(define in-memory-database (make-parameter #f))
(define (in-memory-db-set-and-get x)
  (in-memory-database (format "~a: data to be shared across servlets" x))
  (in-memory-database))

(define (get-in-memory-results [refresh? #f])
  (if refresh?
      (begin (displayln "database: force refresh")
             (in-memory-db-set-and-get "forced"))
      (let ([in-memory-db (in-memory-database)])
        (if in-memory-db
            (begin (displayln "database: cache hit")
                   in-memory-db)
            (begin (displayln "database: cache miss")
                   (in-memory-db-set-and-get "miss"))))))
(provide (all-defined-out))
---------------------------------------------------------------------------

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/Xuxg1t5egDEkFLVsH-Ch9KZyTqtLjhATNOPD-HeXZgcOc2mXr8qlXS3fZTZRh90xd2kvhdILhNjKwUllUirBcnTrEzPDTiw_hJDVEp5FjpM%3D%40protonmail.com.

Reply via email to