summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Ostler <scottbot9000@gmail.com>2011-01-03 23:50:37 -0500
committerScott Ostler <scottbot9000@gmail.com>2011-01-03 23:50:37 -0500
commit2890fd426aafbfe63d94bb1e327eaef1ddefceb1 (patch)
tree2d784af57177a9b47d876e145fdd609410367da2
parent1b06b06e7e0351dea457b1e96faecd2c705d91c2 (diff)
refactored redis/datalayer code
-rw-r--r--src/datalayer.clj36
-rw-r--r--src/redisload.clj14
-rw-r--r--src/site.clj73
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]
+ ["&#9823;" "&#9822;" "&#9821;" "&#9820;" "&#9819;" "&#9818;" "&#9760;"]))
+
+(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]
- ["&#9823;" "&#9822;" "&#9821;" "&#9820;" "&#9819;" "&#9818;" "&#9760;"]))
-
-(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))