#clojure #redis #ring
#clojure #redis #кольцо
Вопрос:
Я использую следующий код для установки ключей в redis
(defn save-to-redis[key value]
(let [str-value (json/generate-string value)]
(redis/with-server {:host "127.0.0.1" :port 6379 :db 0}
(redis/set key str-value))))
но когда я проверяю установленное там значение, запустив redis-cli, я вижу, что он возвращает длину str-значения, а не str-value
Это я сократил до:
(defn save-to-redis[key value]
(redis/with-server {:host "127.0.0.1" :port 6379 :db 0}
(redis/set "foo" "bar")))
и когда я использую «redis-cli> get foo», он отвечает «3»
Я смотрю на пример наhttp://devender.wordpress.com/2010/06/13/redis-and-clojure / и даже копирование и вставка его примера завершается неудачей. Я пытаюсь:
(defn test-redis []
(println "testing redis")
(redis/with-server {:host "127.0.0.1" :port 6379 :db 0}
(do
(redis/set "foo" "bar")
(println (redis/get "foo")))))
и я получаю
testing redis
Exception: java.lang.Exception: Server error: ERR unknown command 'bar'
internal.clj:123 redis.internal/eval1198[fn]
MultiFn.java:163 clojure.lang.MultiFn.invoke
internal.clj:114 redis.internal/read-reply
internal.clj:112 redis.internal/read-reply
redis.clj:75 redis/get
core.clj:65 spendy.core/test-redis[fn]
internal.clj:48 redis.internal/with-server*
core.clj:62 spendy.core/test-redis
core.clj:74 spendy.core/respond-to-ajax
routes.clj:16 spendy.routes/fn
core.clj:39 compojure.core/if-route[fn]
core.clj:24 compojure.core/if-method[fn]
core.clj:98 compojure.core/routing[fn]
core.clj:2053 clojure.core/some
core.clj:98 compojure.core/routing
RestFn.java:140 clojure.lang.RestFn.applyTo
core.clj:542 clojure.core/apply
core.clj:103 compojure.core/routes[fn]
keyword_params.clj:21 ring.middleware.keyword-params/wrap-keyword-params[fn]
nested_params.clj:64 ring.middleware.nested-params/wrap-nested-params[fn]
params.clj:76 ring.middleware.params/wrap-params[fn]
multipart_params.clj:80 ring.middleware.multipart-params/wrap-multipart-params[fn]
session.clj:40 ring.middleware.session/wrap-session[fn]
cookies.clj:132 ring.middleware.cookies/wrap-cookies[fn]
middleware.clj:12 hiccup.middleware/wrap-base-url[fn]
Var.java:365 clojure.lang.Var.invoke
stacktrace.clj:15 ring.middleware.stacktrace/wrap-stacktrace-log[fn]
stacktrace.clj:79 ring.middleware.stacktrace/wrap-stacktrace-web[fn]
reload_modified.clj:15 ring.middleware.reload-modified/wrap-reload-modified[fn]
stacktrace.clj:15 ring.middleware.stacktrace/wrap-stacktrace-log[fn]
stacktrace.clj:79 ring.middleware.stacktrace/wrap-stacktrace-web[fn]
jetty.clj:16 ring.adapter.jetty/proxy-handler[fn]
(Unknown Source) ring.adapter.jetty.proxy$org.mortbay.jetty.handler.AbstractHandler$0.handle
HandlerWrapper.java:152 org.mortbay.jetty.handler.HandlerWrapper.handle
Server.java:326 org.mortbay.jetty.Server.handle
HttpConnection.java:542 org.mortbay.jetty.HttpConnection.handleRequest
HttpConnection.java:945 org.mortbay.jetty.HttpConnection$RequestHandler.content
HttpParser.java:756 org.mortbay.jetty.HttpParser.parseNext
HttpParser.java:218 org.mortbay.jetty.HttpParser.parseAvailable
HttpConnection.java:404 org.mortbay.jetty.HttpConnection.handle
SocketConnector.java:228 org.mortbay.jetty.bio.SocketConnector$Connection.run
QueuedThreadPool.java:582 org.mortbay.thread.QueuedThreadPool$PoolThread.run
Я в тупике. Если это поможет, вот моя форма ns:
(ns spendy.core
(:use [hiccup core page-helpers])
(:require redis
[clj-json.core :as json]))
Комментарии:
1. кстати, я попробовал поместить в базу данных несколько других значений, и она всегда указывала их длину. Даже числа без кавычек, так что (redis / set «foo» 4459) приведет к тому, что «foo» будет установлено в «4» в базе данных.
2. У меня так и не получилось, чтобы это сработало, даже самотестирование clojure-redis не удалось (не используя ни один из моих кодов) Переключился на использование Jedis, что было прямо с этим постом в блоге в качестве примера: gist.github.com/997393/a31516b339f1f63cd532edd7f2e0851d1be28dd6
Ответ №1:
Какую версию redis-clojure вы используете? Он отлично работает с этим:https://github.com/tavisrudd/redis-clojure
Ответ №2:
Попробуйте это (от mmcgrana и technomancy — двух гуру Clojure). Он просто оборачивает Jedis — клиент Java redis:
Комментарии:
1. Вот еще один ztellman.github.com/aleph/aleph.redis-api.html неблокирующий стиль nio.
2. и один из немногих примеров, которые я смог найти в использовании aleph.redis: bitbucket.org/sjl/newseasons/src/e3e497ef8f62/src/newseasons /…