;(add-classpath "file:///Users/ragge/Projects/clojure/redis-clojure/src/") (ns redis (:refer-clojure :exclude [get set type keys sort]) (:use redis.internal)) ;(set! *warn-on-reflection* true) (defmacro with-server "Evaluates body in the context of a new connection to a Redis server then closes the connection. server-spec is a map with any of the following keys: :host hostname (default \"127.0.0.1\") :port port (default 6379) :db database to use (default 0)" [server-spec & body] `(with-server* ~server-spec (fn [] (do (redis/select (:db *server*)) ~@body)))) ;; ;; Reply conversion functions ;; (defn int-to-bool "Convert integer reply to a boolean value" [int] (= 1 int)) (defn string-to-keyword "Convert a string reply to a keyword" [string] (keyword string)) (defn string-to-seq "Convert a space separated string to a sequence of words" [#^String string] (if (empty? string) nil (re-seq #"\S+" string))) (defn string-to-map "Convert strings with format 'key:value\r\n'+ to a map with {key value} pairs" [#^String string] (let [lines (.split string "(\\r\\n|:)")] (apply hash-map lines))) (defn int-to-date "Return a Date representation of a UNIX timestamp" [int] (new java.util.Date (long int))) (defn seq-to-set [sequence] (clojure.core/set sequence)) ;; ;; Commands ;; (defcommands ;; Connection handling (auth [] :inline) (quit [password] :inline) (ping [] :inline) ;; String commands (set [key value] :bulk) (get [key] :inline) (getset [key value] :bulk) (setnx [key value] :bulk int-to-bool) (incr [key] :inline) (incrby [key integer] :inline) (decr [key] :inline) (decrby [key integer] :inline) (exists [key] :inline int-to-bool) (mget [key & keys] :inline) (del [key] :inline int-to-bool) ;; Key space commands (type [key] :inline string-to-keyword) (keys [pattern] :inline string-to-seq) (randomkey [] :inline) (rename [oldkey newkey] :inline) (renamenx [oldkey newkey] :inline int-to-bool) (dbsize [] :inline) (expire [key seconds] :inline int-to-bool) (ttl [key] :inline) ;; List commands (rpush [key value] :bulk) (lpush [key value] :bulk) (llen [key] :inline) (lrange [key start end] :inline) (ltrim [key start end] :inline) (lindex [key index] :inline) (lset [key index value] :bulk) (lrem [key count value] :bulk) (lpop [key] :inline) (rpop [key] :inline) ;; Set commands (sadd [key member] :bulk int-to-bool) (srem [key member] :bulk int-to-bool) (spop [key] :inline) (smove [srckey destkey member] :bulk int-to-bool) (scard [key] :inline) (sismember [key member] :bulk int-to-bool) (sinter [key & keys] :inline seq-to-set) (sinterstore [destkey key & keys] :inline) (sunion [key & keys] :inline seq-to-set) (sunionstore [destkey key & keys] :inline) (sdiff [key & keys] :inline seq-to-set) (sdiffstore [destkey key & keys] :inline) (smembers [key] :inline seq-to-set) ;; Multiple database handling commands (select [index] :inline) (move [key dbindex] :inline) (flushdb [] :inline) (flushall [] :inline) ;; Sorting (sort [key & options] :sort) ;; Persistence (save [] :inline) (bgsave [] :inline) (lastsave [] :inline int-to-date) (shutdown [] :inline) ;; Remote control (info [] :inline string-to-map) ;;(monitor [] :inline)) )