Browse Source

LRU cache for note pages added

master
Christian Mueller 12 years ago
parent
commit
e659e98b13
  1. 3
      project.clj
  2. 1
      src/notehub/api.clj
  3. 21
      src/notehub/handler.clj
  4. 7
      src/notehub/storage.clj
  5. 3
      src/notehub/views.clj
  6. 15
      test/notehub/test/storage.clj

3
project.clj

@ -1,6 +1,7 @@
(defproject NoteHub "2.0.0" (defproject NoteHub "2.0.0"
:description "A free and anonymous hosting for markdown pages." :description "A free and anonymous hosting for markdown pages."
:dependencies [[org.clojure/clojure "1.5.1"] :dependencies [[org.clojure/clojure "1.6.0"]
[org.clojure/core.cache "0.6.3"]
[hiccup "1.0.0"] [hiccup "1.0.0"]
[zeus "0.1.0"] [zeus "0.1.0"]
[iokv "0.1.1"] [iokv "0.1.1"]

1
src/notehub/api.clj

@ -87,6 +87,7 @@
(defn get-note [{:keys [noteID]}] (defn get-note [{:keys [noteID]}]
(if (storage/note-exists? noteID) (if (storage/note-exists? noteID)
(let [note (storage/get-note noteID)] (let [note (storage/get-note noteID)]
(storage/increment-note-view noteID)
{:note note {:note note
:title (derive-title note) :title (derive-title note)
:longURL (get-path noteID) :longURL (get-path noteID)

21
src/notehub/handler.clj

@ -6,6 +6,7 @@
[clojure.string :rename {replace sreplace} :only [replace]] [clojure.string :rename {replace sreplace} :only [replace]]
[clojure.core.incubator :only [-?>]]) [clojure.core.incubator :only [-?>]])
(:require (:require
[clojure.core.cache :as cache]
[hiccup.util :as util] [hiccup.util :as util]
[compojure.handler :as handler] [compojure.handler :as handler]
[compojure.route :as route] [compojure.route :as route]
@ -13,6 +14,9 @@
[notehub.storage :as storage] [notehub.storage :as storage]
[cheshire.core :refer :all])) [cheshire.core :refer :all]))
; note page cache
(def C (atom (cache/lru-cache-factory {})))
; TODO: make sure the status is really set to the response!!!! ; TODO: make sure the status is really set to the response!!!!
(defn- response (defn- response
"Sets a custom message for each needed HTTP status. "Sets a custom message for each needed HTTP status.
@ -56,7 +60,10 @@
(return-content-type "text/plain; charset=utf-8" md-text))) (return-content-type "text/plain; charset=utf-8" md-text)))
(GET "/:year/:month/:day/:title/stats" [year month day title] (GET "/:year/:month/:day/:title/stats" [year month day title]
(when-let [resp (api/get-note {:noteID (api/build-key year month day title)})] (let [note-id (api/build-key year month day title)
resp {:statistics (storage/get-note-statistics note-id)
:note (storage/get-note note-id)
:noteID note-id}]
(statistics-page resp))) (statistics-page resp)))
(GET "/:year/:month/:day/:title/edit" [year month day title] (GET "/:year/:month/:day/:title/edit" [year month day title]
@ -69,7 +76,13 @@
:year year :month month :day day :title title) :year year :month month :day day :title title)
note-id (api/build-key year month day title)] note-id (api/build-key year month day title)]
(when (storage/note-exists? note-id) (when (storage/note-exists? note-id)
(note-page note-id (storage/create-short-url note-id params))))) (if (cache/has? @C note-id)
(do
(swap! C cache/hit note-id)
(storage/increment-note-view note-id))
(swap! C cache/miss note-id
(note-page note-id (storage/create-short-url note-id params))))
(cache/lookup @C note-id))))
(GET "/:short-url" [short-url] (GET "/:short-url" [short-url]
(when-let [params (storage/resolve-url short-url)] (when-let [params (storage/resolve-url short-url)]
@ -103,7 +116,9 @@
:signature :signature
(storage/sign pid psk noteID note password)))] (storage/sign pid psk noteID note password)))]
(if (get-in resp [:status :success]) (if (get-in resp [:status :success])
(redirect (:longURL resp)) (do
(swap! C cache/evict noteID)
(redirect (:longURL resp)))
(response 403))) (response 403)))
(response 500)))) (response 500))))

7
src/notehub/storage.clj

@ -80,9 +80,10 @@
(defn get-note [noteID] (defn get-note [noteID]
(when (note-exists? noteID) (when (note-exists? noteID)
(do (unzip (redis :hget :note noteID))))
(redis :hincrby :views noteID 1)
(unzip (redis :hget :note noteID))))) (defn increment-note-view [noteID]
(redis :hincrby :views noteID 1))
(defn short-url-exists? [url] (defn short-url-exists? [url]
(= 1 (redis :hexists :short-url url))) (= 1 (redis :hexists :short-url url)))

3
src/notehub/views.clj

@ -8,7 +8,8 @@
[hiccup.element] [hiccup.element]
[hiccup.util :only [escape-html]] [hiccup.util :only [escape-html]]
[hiccup.page :only [include-js html5]]) [hiccup.page :only [include-js html5]])
(:require [notehub.api :as api])) (:require
[notehub.api :as api]))
(def get-message (get-map "messages")) (def get-message (get-map "messages"))

15
test/notehub/test/storage.clj

@ -33,16 +33,17 @@
(delete-short-url url) (delete-short-url url)
(is (not (short-url-exists? url)))))) (is (not (short-url-exists? url))))))
(testing "of correct note creation" (testing "of correct note creation"
(is (= (do (is (= (let [note-id (build-key date test-title)]
(add-note (build-key date test-title) test-note "testPID") (add-note note-id test-note "testPID")
(is (= 2 (redis :scard (str (build-key date test-title) :urls)))) (is (= 2 (redis :scard (str note-id :urls))))
(create-short-url (build-key date test-title) metadata) (create-short-url note-id metadata)
(is (= 3 (redis :scard (str (build-key date test-title) :urls)))) (is (= 3 (redis :scard (str note-id :urls))))
(get-note (build-key date test-title))) (increment-note-view note-id)
(get-note note-id))
test-note)) test-note))
(is (= "1" (get-note-views (build-key date test-title)))) (is (= "1" (get-note-views (build-key date test-title))))
(is (= (do (is (= (do
(get-note (build-key date test-title)) (increment-note-view (build-key date test-title))
(get-note-views (build-key date test-title))) (get-note-views (build-key date test-title)))
"2"))) "2")))
(testing "of note update" (testing "of note update"

Loading…
Cancel
Save