diff options
| author | Scott Ostler <scottbot9000@gmail.com> | 2011-01-03 23:50:37 -0500 |
|---|---|---|
| committer | Scott Ostler <scottbot9000@gmail.com> | 2011-01-03 23:50:37 -0500 |
| commit | 2890fd426aafbfe63d94bb1e327eaef1ddefceb1 (patch) | |
| tree | 2d784af57177a9b47d876e145fdd609410367da2 /src | |
| parent | 1b06b06e7e0351dea457b1e96faecd2c705d91c2 (diff) | |
refactored redis/datalayer code
Diffstat (limited to 'src')
| -rw-r--r-- | src/datalayer.clj | 36 | ||||
| -rw-r--r-- | src/redisload.clj | 14 | ||||
| -rw-r--r-- | src/site.clj | 73 |
3 files changed, 41 insertions, 82 deletions
diff --git a/src/datalayer.clj b/src/datalayer.clj index 711dc65..24c162a 100644 --- a/src/datalayer.clj +++ b/src/datalayer.clj @@ -10,8 +10,6 @@ user utils)) - - ;;;; Message lookup (defn recent-posts-query [user-id] @@ -81,6 +79,9 @@ WHERE u.nick = ANY(?)" ;;;; Popular Posts +(defn redis-popular-key [nick] + (str "popular:" nick)) + (def popular-dumps-qry " select u.nick, u.avatar, r.key, m.message_id, m.content, m.created_on, count(*) as count, array_agg(u2.nick) as user_nicks @@ -101,9 +102,10 @@ order by count desc limit ? offset ?") :favorited (some #(= % viewer-nick) favers))))) (defn fetch-popular-dumps-redis [nick viewer-nick] - (let [rkey (str "popular:" nick) - msg-ids (redis/with-server redis-server - (redis/zrevrange rkey 0 (dec num-popular-dumps))) + (let [msg-ids (redis/with-server redis-server + (redis/zrevrange (redis-popular-key nick) + 0 + (dec num-popular-dumps))) msg-ids (map maybe-parse-int msg-ids)] (if-not (empty? msg-ids) (sort-by @@ -113,11 +115,29 @@ order by count desc limit ? offset ?") ;;;; Redis Favscores +(def score-piece-map + (zipmap + [:pawn :knight :bishop :rook :queen :king :skull] + ["♟" "♞" "♝" "♜" "♛" "♚" "☠"])) + +(defn score-to-piece [score] + (cond (= score -1) :skull + (= score 0) :pawn + (< score 50) :knight + (< score 150) :bishop + (< score 300) :rook + (< score 1000) :queen + :else :king)) + +(def score-to-entity (comp score-piece-map score-to-piece)) + +(def redis-favscores-key "favscores") + (defn fetch-redis-directory [page num] (vec (for [t (with-jedis #(.zrevrangeWithScores % - "favscores" + redis-favscores-key (* page num) (dec (* (inc page) num))))] {:nick (.getElement t) @@ -144,10 +164,12 @@ order by count desc limit ? offset ?") ;;;; Redis Hall of Fame +(def redis-hall-key "hall") + (defn fetch-redis-hall [viewer-nick] (let [ids (map maybe-parse-int (redis/with-server redis-server - (redis/zrevrange "hall" 0 (dec num-hall-dumps))))] + (redis/zrevrange redis-hall-key 0 (dec num-hall-dumps))))] (if-not (empty? ids) (sort-by #(* -1 (:count %)) diff --git a/src/redisload.clj b/src/redisload.clj index 31a25f0..8796d9e 100644 --- a/src/redisload.clj +++ b/src/redisload.clj @@ -9,6 +9,8 @@ (defn redis-days [n] (* 24 60 60)) +;;;; Tag counters + (def tag-query " SELECT u.nick as author, @@ -65,7 +67,7 @@ WHERE (defn transmit-popular [] (doseq [[nick msgs] @popular-map] (let [sorted-msgs (sort #(>= (second %1) (second %2)) msgs) - userkey (str "popular:" nick)] + userkey (redis-popular-key nick)] (redis/atomically (redis/del key) (doseq [[msg-id score] (take (* num-popular-dumps 2) @@ -75,19 +77,19 @@ WHERE (defn transmit-favscores [] (redis/atomically - (redis/del "favscores") + (redis/del redis-favscores-key) (doseq [[nick score] @score-map] - (redis/zadd "favscores" score (lower-case nick)))) + (redis/zadd redis-favscores-key score (lower-case nick)))) (println "cached favscores for " (count @score-map) "users")) (defn transmit-hall [] (let [scores (take (* 2 num-hall-dumps) (sort #(>= (second %1) (second %2)) @hall-map))] (redis/atomically - (redis/del "hall") + (redis/del redis-hall-key) (doseq [[msg-id score] scores] - (redis/zadd "hall" score msg-id))))) - + (redis/zadd redis-hall-key score msg-id))) + (println "cached hall-of-fame"))) (println "streaming tags") (stream-tags [update-popular]) diff --git a/src/site.clj b/src/site.clj index 3ec07a5..663a6df 100644 --- a/src/site.clj +++ b/src/site.clj @@ -306,65 +306,6 @@ WHERE user_id IN [(session-assoc-from-db db-user) (resp-success "OK")]))))) -;; Fav scores - -(def *score-query* " -SELECT u.user_id, - u.nick, - COUNT(*) AS cnt -FROM tags t, - messages m, - users u -WHERE t.message_id = m.message_id - AND m.user_id != t.user_id - AND m.user_id = u.user_id -GROUP BY u.user_id, u.nick -ORDER BY cnt DESC -") - -(defn build-score-list [] - (let [res (vec (do-select [*score-query*]))] - {:list res - :map (zipmap (map :nick res) (map :cnt res))})) - -;; sostler: stop score refresh until redis cache can be added -(def *scores-refresh-period-sec* (* 29 60 9999999)) - -(def *user-scores* - (scheduled-agent build-score-list - *scores-refresh-period-sec* - [])) - -(def *piece-map* - (zipmap - [:pawn :knight :bishop :rook :queen :king :skull] - ["♟" "♞" "♝" "♜" "♛" "♚" "☠"])) - -(defn score-to-piece [score] - (cond (= score -1) :skull - (= score 0) :pawn - (< score 50) :knight - (< score 150) :bishop - (< score 300) :rook - (< score 1000) :queen - :else :king)) - -(def score-to-entity (comp *piece-map* score-to-piece)) - -(defn lookup-score [nick] - (if (= (lower-case nick) "scottbot") - -1 - (let [scores (:map (poll *user-scores*))] - (get scores nick 0)))) - -(defn get-user-ranking [offset num] - (if-let [ranking (:list (poll *user-scores*))] - (let [cnt (count ranking)] - (subvec ranking - (min cnt (* offset num)) - (min cnt (* (inc offset) num)))))) - - ;; Profile (defn pull-random-dump-images [dumps num] @@ -375,8 +316,6 @@ ORDER BY cnt DESC (comp take-images :content) dumps)))))) -(def use-redis-favscore true) - (defn profile ([session profile-nick] (profile session profile-nick "profile")) ([session profile-nick template] @@ -386,9 +325,7 @@ ORDER BY cnt DESC nick (:nick session) logger (make-time-logger) is-home (and nick (= nick profile-nick)) - score (if use-redis-favscore - (fetch-redis-favscore profile-nick) - (lookup-score profile-nick)) + score (fetch-redis-favscore profile-nick) dumps (logger tags/fetch-dumps :user-tag-id (:user_id session) :nick profile-nick @@ -457,9 +394,7 @@ ORDER BY cnt DESC (defn build-mini-profile [user-info] (let [st (fetch-template-fragment "mini_profile") nick (user-info :nick) - score (if use-redis-favscore - (fetch-redis-favscore nick) - (lookup-score nick))] + score (fetch-redis-favscore nick)] (doseq [a [:nick :avatar :contact :bio]] (let [v (user-info a)] (.setAttribute st (name a) @@ -1441,7 +1376,7 @@ ORDER BY cnt DESC (start-user-flusher!) (start-session-pruner!) -(if (not= *server-url* "http://dump.fm") - (start! random-poster)) +;(if (not= *server-url* "http://dump.fm") +; (start! random-poster)) |
