LRU cache for note pages added
This commit is contained in:
+2
-1
@@ -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"]
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
+18
-3
@@ -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))))
|
||||||
|
|
||||||
|
|||||||
@@ -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)))
|
||||||
|
|||||||
@@ -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"))
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user