Giter VIP home page Giter VIP logo

celtuce's Introduction

celtuce

An idiomatic Clojure Redis client wrapping the Java client Lettuce.

Usage

Clojars Project to include all modules.

Or pick up only the ones you need:

Redis Connectors

Connectors are available for both Redis Server and Cluster. They are defined in celtuce.connector namespace of celtuce-core module.

(require '[celtuce.connector :as conn])

(conn/redis-server "redis://localhost:6379")

(conn/redis-cluster "redis://localhost:30001")

Redis URI synthax details can be found in Lettuce Wiki.

Serialization defaults to Nippy, but other serializers are available in celtuce.codec. Especially Lettuce original String serializer can be used as follows:

(conn/redis-server
  "redis://localhost:6379"
  :codec (celtuce.codec/utf8-string-codec))

Other connector options:

  • :conn-options a map of connection options

    • :timeout timeout for executing commands
    • :unit corresponding TimeUnit in keyword (i.e. :milliseconds, etc)
    • :auto-flush automatically flush commands on the underlying Netty connection
  • :client-options: a map of client options

Note that you can find options default values in the tests.

Redis Commands

All Redis commands are implemented using protocols in celtuce.commands namespace of celtuce-core module.

(require '[celtuce.commands :as redis])

Sync Commands

(def connector (conn/redis-server "redis://localhost:6379"))
(def cmds (conn/commands-sync connector))

(redis/set cmds :foo "bar")
(redis/get cmds :foo)

(conn/shutdown connector)

PubSub Commands

Redis prevents publishing and subscribing on the same connection. The following contrive example demonstrates pubsub usage with two connections.

;; note that conn/as-pubsub also works on cluster connectors
(def conn-pub (conn/as-pubsub (conn/redis-server "redis://localhost:6379")))
(def conn-sub (conn/as-pubsub (conn/redis-server "redis://localhost:6379")))

(def pub (conn/commands-sync conn-pub))
(def sub (conn/commands-sync conn-sub))

(conn/add-listener! 
 conn-sub
 (reify redis/PubSubListener
   (message [_ channel message]
     (println "received message" message "from channel" channel))
   (message [_ pattern channel message])
   (subscribed [_ channel count]
     (println "new subscriber !"))
   (unsubscribed [_ channel count]
     (println "a subscriber left..."))
   (psubscribed [_ pattern count])
   (punsubscribed [_ pattern count])))

(redis/subscribe sub "foo-chan")
(redis/publish pub "foo-chan" "bar-msg")
(redis/unsubscribe sub "foo-chan")

(conn/shutdown conn-pub)
(conn/shutdown conn-sub)

Dynamic Commands

Starting from Lettuce 5 it is now possible to define commands dynamically by extending a Commands interface. Such commands are obtained as follows.

(conn/commands-dynamic connector some.interface.extending.Commands)

You can find basic examples in the tests.

Tests

To run unit tests you need to have both a redis server running on a localhost:6379, and a redis cluster running on localhost:30001.

Then build artifacts and run tests:

(cd modules/celtuce-core/; lein do clean, install)
(cd modules/celtuce-pool/; lein do clean, install)
(cd modules/celtuce-manifold/; lein do clean, install)

lein test

License

celtuce's People

Contributors

florin-va-oltean avatar lerouxrgd avatar pgarrett-twc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

celtuce's Issues

Shared client resources

I am creating several Redis connections to different servers from the same application; currently, each connection creates a set of NIO threads. It is possible in Java Lettuce to use the concept of shared resources via class io.lettuce.core.resource.ClientResource and share the same NIO infrastructure for all connections.

However, this is not implemented in celtuce , as the methods redis-server or redis-cluster does not allow to pass the shared resource.

I would like to make a pull request on this topic, but I would like first to confirm if indeed there is no way to use shared resources without a change in code; can you confirm?

Lazy requires are not thread safe

One of the first thing our application does is start a connection pool. In some cases, the application immediately starts hitting redis in parallel. We occasionally see issues like the following:

           java.lang.IllegalAccessError: output-type is not public
clojure.lang.Compiler$CompilerException: Syntax error compiling at (celtuce/impl/server.clj:1:1).
    data: #:clojure.error{:phase :compile-syntax-check,
                          :line 1,
                          :column 1,
                          :source "celtuce/impl/server.clj"}
java.util.concurrent.ExecutionException: Syntax error compiling at (celtuce/impl/server.clj:1:1).

and

java.lang.IllegalArgumentException: No implementation of method: :evalsha of protocol: #'celtuce.commands/ScriptingCommands found for class: com.sun.proxy.$Proxy7
Exception in thread "main" Syntax error compiling at (celtuce/impl/cluster.clj:1:1).

It can be tricky and a race condition to reproduce. We suspect the error is the lazy requires which are not thread safe.

...
  RedisConnector
  (commands-sync [this]
    (require '[celtuce.impl.server])
...
And other locations where it calls (require ...)

I'm not sure I fully follow the reason the lazy requires are necessary though I suspect it has to do with extending types and manifold but I wonder if there is a slightly more eager place this can be placed.

It may make sense to do some locking similar to how clojure.core/serialized-require works on Clojure 1.10+.

(locking clojure.lang.RT/REQUIRE_LOCK
    (require '[blah.blah]))

Using `defrecord` and `defprotocol` got compiling error: java.lang.IllegalArgumentException.

redis.clj:

(ns proj.redis
  (:require
   [celtuce.connector :as conn]
   [taoensso.timbre :as log]
   [mount.core :as mount]
   [proj.global :as g]))

(mount/defstate redis-client
  :start (let [port (get-in @g/config [:port :redis])
               connector (conn/redis-server (str "redis://localhost:" port))]
           (log/info (str "redis connection established on port: " port "."))
           connector)
  :stop (do
          (conn/shutdown redis-client)
          (log/info "redis connection closed.")))

(def cmds
  (conn/commands-sync redis-client))

$ lein uberjar

java.lang.IllegalArgumentException: No implementation of method: :commands-sync of protocol: #'celtuce.connector/RedisConnector found for class: mount.core.DerefableState, compiling:(redis.clj:24:3)
Exception in thread "main" java.lang.IllegalArgumentException: No implementation of method: :commands-sync of protocol: #'celtuce.connector/RedisConnector found for class: mount.core.DerefableState, compiling:(redis.clj:24:3)

It seems syntax checking not passed when compiling.

image

image

I also found redis-client is a celtuce.connector.RedisServer, and (def cmds (conn/commands-sync redis-client)) can be run in repl, but cannot be compiled.

JDK11 Issue

When starting up Celtuce under JDK11 (Amazon Corretto in my case), I'm seeing the following appear during startup. Everything appears to function as normal, however. I may be able to help debug a little bit later but just wanted to log this for now.

19-12-11 19:39:59 runner-0f13da64-project-413-concurrent-0 DEBUG [io.netty.util.internal.PlatformDependent0:871] - Java version: 11
19-12-11 19:39:59 runner-0f13da64-project-413-concurrent-0 DEBUG [io.netty.util.internal.PlatformDependent0:120] - sun.misc.Unsafe.theUnsafe: available
19-12-11 19:39:59 runner-0f13da64-project-413-concurrent-0 DEBUG [io.netty.util.internal.PlatformDependent0:144] - sun.misc.Unsafe.copyMemory: available
19-12-11 19:39:59 runner-0f13da64-project-413-concurrent-0 DEBUG [io.netty.util.internal.PlatformDependent0:182] - java.nio.Buffer.address: available
19-12-11 19:39:59 runner-0f13da64-project-413-concurrent-0 DEBUG [io.netty.util.internal.PlatformDependent0:252] - direct buffer constructor: unavailable
                                          clojure.main.main                    main.java:   38
                                                        ...                                   
                                               user/eval138                     user.clj:    1
                               user/eval138/loading--auto--                     user.clj:    1
                                                        ...                                   
                                       clojure.core/require                     core.clj: 6007 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                     clojure.core/load-libs                     core.clj: 5969
                                     clojure.core/load-libs                     core.clj: 5985
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                      clojure.core/load-lib                     core.clj: 5928
                                      clojure.core/load-lib                     core.clj: 5947
                                   clojure.core/load-lib/fn                     core.clj: 5948
                                      clojure.core/load-one                     core.clj: 5908
                                                        ...                                   
                                          clojure.core/load                     core.clj: 6109
                                          clojure.core/load                     core.clj: 6125
                                       clojure.core/load/fn                     core.clj: 6126
                                                        ...                                   
                                       clojure.core/require                     core.clj: 6007 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                     clojure.core/load-libs                     core.clj: 5969
                                     clojure.core/load-libs                     core.clj: 5985
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                      clojure.core/load-lib                     core.clj: 5928
                                      clojure.core/load-lib                     core.clj: 5947
                                   clojure.core/load-lib/fn                     core.clj: 5948
                                      clojure.core/load-one                     core.clj: 5908
                                                        ...                                   
                                          clojure.core/load                     core.clj: 6109
                                          clojure.core/load                     core.clj: 6125
                                       clojure.core/load/fn                     core.clj: 6126
                                                        ...                                   
                                                        ...                                   
                                       clojure.core/require                     core.clj: 6007 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                     clojure.core/load-libs                     core.clj: 5969
                                     clojure.core/load-libs                     core.clj: 5985
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                      clojure.core/load-lib                     core.clj: 5928
                                      clojure.core/load-lib                     core.clj: 5947
                                   clojure.core/load-lib/fn                     core.clj: 5948
                                      clojure.core/load-one                     core.clj: 5908
                                                        ...                                   
                                          clojure.core/load                     core.clj: 6109
                                          clojure.core/load                     core.clj: 6125
                                       clojure.core/load/fn                     core.clj: 6126
                                                        ...                                   
                                    java.lang.Class.forName                   Class.java:  398
                                   java.lang.Class.forName0                    Class.java     
                     celtuce.connector.RedisPubSub/<clinit>                connector.clj:  304
                                                        ...                                   
                                    java.lang.Class.forName                   Class.java:  398
                                   java.lang.Class.forName0                    Class.java     
               io.lettuce.core.AbstractRedisClient.<clinit>     AbstractRedisClient.java:   70
            io.netty.buffer.PooledByteBufAllocator.<clinit>  PooledByteBufAllocator.java:   98
          io.netty.util.internal.PlatformDependent.<clinit>       PlatformDependent.java:   80
         io.netty.util.internal.PlatformDependent.isAndroid       PlatformDependent.java:  212
         io.netty.util.internal.PlatformDependent0.<clinit>      PlatformDependent0.java:  218
                java.security.AccessController.doPrivileged         AccessController.java     
            io.netty.util.internal.PlatformDependent0$4.run      PlatformDependent0.java:  224
     io.netty.util.internal.ReflectionUtil.trySetAccessible          ReflectionUtil.java:   31
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled

19-12-11 19:39:59 runner-0f13da64-project-413-concurrent-0 DEBUG [io.netty.util.internal.PlatformDependent0:313] - java.nio.Bits.unaligned: available, true
19-12-11 19:39:59 runner-0f13da64-project-413-concurrent-0 DEBUG [io.netty.util.internal.PlatformDependent0:372] - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable
                                          clojure.main.main                    main.java:   38
                                                        ...                                   
                                               user/eval138                     user.clj:    1
                               user/eval138/loading--auto--                     user.clj:    1
                                                        ...                                   
                                       clojure.core/require                     core.clj: 6007 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                     clojure.core/load-libs                     core.clj: 5969
                                     clojure.core/load-libs                     core.clj: 5985
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                      clojure.core/load-lib                     core.clj: 5928
                                      clojure.core/load-lib                     core.clj: 5947
                                   clojure.core/load-lib/fn                     core.clj: 5948
                                      clojure.core/load-one                     core.clj: 5908
                                                        ...                                   
                                          clojure.core/load                     core.clj: 6109
                                          clojure.core/load                     core.clj: 6125
                                       clojure.core/load/fn                     core.clj: 6126
                                                        ...                                   
                                                        ...                                   
                                       clojure.core/require                     core.clj: 6007 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                     clojure.core/load-libs                     core.clj: 5969
                                     clojure.core/load-libs                     core.clj: 5985
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                      clojure.core/load-lib                     core.clj: 5928
                                      clojure.core/load-lib                     core.clj: 5947
                                   clojure.core/load-lib/fn                     core.clj: 5948
                                      clojure.core/load-one                     core.clj: 5908
                                                        ...                                   
                                          clojure.core/load                     core.clj: 6109
                                          clojure.core/load                     core.clj: 6125
                                       clojure.core/load/fn                     core.clj: 6126
                                                        ...                                   
                                                        ...                                   
                                       clojure.core/require                     core.clj: 6007 (repeats 2 times)
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                     clojure.core/load-libs                     core.clj: 5969
                                     clojure.core/load-libs                     core.clj: 5985
                                         clojure.core/apply                     core.clj:  667
                                                        ...                                   
                                      clojure.core/load-lib                     core.clj: 5928
                                      clojure.core/load-lib                     core.clj: 5947
                                   clojure.core/load-lib/fn                     core.clj: 5948
                                      clojure.core/load-one                     core.clj: 5908
                                                        ...                                   
                                          clojure.core/load                     core.clj: 6109
                                          clojure.core/load                     core.clj: 6125
                                       clojure.core/load/fn                     core.clj: 6126
                                                        ...                                   
                                    java.lang.Class.forName                   Class.java:  398
                                   java.lang.Class.forName0                    Class.java     
                     celtuce.connector.RedisPubSub/<clinit>                connector.clj:  304
                                                        ...                                   
                                    java.lang.Class.forName                   Class.java:  398
                                   java.lang.Class.forName0                    Class.java     
               io.lettuce.core.AbstractRedisClient.<clinit>     AbstractRedisClient.java:   70
            io.netty.buffer.PooledByteBufAllocator.<clinit>  PooledByteBufAllocator.java:   98
          io.netty.util.internal.PlatformDependent.<clinit>       PlatformDependent.java:   80
         io.netty.util.internal.PlatformDependent.isAndroid       PlatformDependent.java:  212
         io.netty.util.internal.PlatformDependent0.<clinit>      PlatformDependent0.java:  325
                java.security.AccessController.doPrivileged         AccessController.java     
            io.netty.util.internal.PlatformDependent0$6.run      PlatformDependent0.java:  334
                                                        ...                                   
  jdk.internal.reflect.Reflection.newIllegalAccessException              Reflection.java:  361
java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @60659f12

ZRANGE needs new signatures

ZRANGEBYLEX and ZRANGEBYSCORE are deprecated and recommend the following:

https://redis.io/commands/zrange/

ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count]
  [WITHSCORES]

There should probably be new functions/signatures of the zrange calls to support the above argument permutations.

separate async/sync part in "modules"/subprojects.

I am tempted to use this lib but we use mostly core.async in our projects. I could just bite the bullet and build utils to convert the manifold bits to c.async equivalents but it feels a bit dirty/wasteful. Would you consider shipping the manifold dependent code separately?

That would mean have an artifact for celtuce (basically everything not async, and building blocks for the rest), another for celtuce-manifold and I would gladly provide celtuce-core-async (I do something similar in my own projects https://github.com/mpenet/alia/tree/master/modules).

Thanks for the lib! Cheers

implementation of sscan command seems to have a mistake, not passing down the scan arguments to java class

Hi,

When using scan arguments (celtuce.commands/scan-args :limit 1 :match "whatever*") with function sscan , the scan arguments are not passed down to java class implementing sscan.

In the namespace "celtuce.impl.server":

 (sscan 
      ([this k]
        (.sscan this k))
      ([this k ^ScanCursor c]
        (.sscan this k c))
      ([this k ^ScanCursor c args]
        (.sscan this k c)))

This definition should be changed to something like:

 (sscan 
      ([this k]
        (.sscan this k))
      ([this k ^ScanCursor c]
        (.sscan this k c))
      ([this k ^ScanCursor c ^ScanArgs args]
        (.sscan this k c args)))

evalsha on cluster mode fails

As I want to run Lua scripts, I loaded the following script into a Redis cluster: script load "return 2", in order to test celtuce's script interface.
For evaluating the respective SHA (7f923f79fe76194c868d7e1d0820de36700eb649), I am running:

(require '[celtuce.connector :as conn])
(require '[celtuce.commands :as redis])
(def connector (conn/redis-cluster "redis://SOME_REDIS_CLUSTER"))
(def cmds (conn/commands-sync connector))

(redis/evalsha cmds "7f923f79fe76194c868d7e1d0820de36700eb649" :integer "testing")

(conn/shutdown connector)

Which fails with the message 'CROSSSLOT Keys in request don't hash to the same slot. Please note I ran it against a Redis server as well, and it works fine
In order to be sure that's not Lettuce's problem, I ran the following Java code (against the same Lettuce version), which I considered equivalent:

import io.lettuce.core.cluster.RedisClusterClient;
import io.lettuce.core.cluster.api.StatefulRedisClusterConnection;
import io.lettuce.core.ScriptOutputType;
import io.lettuce.core.api.sync.RedisScriptingCommands;


public class RedisTesting {
  public static void main(String[] args) {
    RedisClusterClient client = RedisClusterClient.create("redis://SOME_REDIS_CLUSTER");
    StatefulRedisClusterConnection<String, String> connection = client.connect();
    RedisScriptingCommands sync = connection.sync();
    Object value = sync.evalsha("7f923f79fe76194c868d7e1d0820de36700eb649",
                                 ScriptOutputType.INTEGER);

    System.out.println(value);

    connection.close();
    client.shutdown();
  }
}

Which works just fine. I am not sure whether this is a problem related to the cluster setup or the evalsha function. Based on the error message, though, it seems more of a cluster related issue.

In order to make sure it wasn't because this script has no keys (btw, celttuce doesn't accept 0 keys), I also tried script load "return KEYS[1]". Same result.
I am running that against a Redis 5.0.3 cluster on AWS.

Support for Multi-Exec and BLPOP

Based on the following:

It appears that you should not use a shared connection when you are making MULTI - EXEC (transaction) or BLPOP (blocking list pop) calls.

From what I understand from the above docs, the application will need a non-shared connection for these calls.

This could be done either by creating new connector instances (possibly isolated to some worker thread) or via a connection pool if these calls are dynamic (not already isolated to some worker thread that contains its own connection).

Getting UnsupportedOperationException warning

Every command is working perfectly but the issue is whenever I'm executing any command I'm getting below thing then I got the preferred output and that's because (def connector (conn/redis-server "redis://localhost:6379")) this, I tested it using REPL because of this line I'm getting the below thing.

Is there any way to get rid of this? Thank you so much in advance.

2020-06-30 11:21:50,284 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
2020-06-30 11:21:50,326 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.level: simple
2020-06-30 11:21:50,327 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.util.ResourceLeakDetector - -Dio.netty.leakDetection.targetRecords: 4
2020-06-30 11:21:50,376 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - Platform: Windows
2020-06-30 11:21:50,379 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - -Dio.netty.noUnsafe: false andler.feed=>
2020-06-30 11:21:50,379 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - Java version: 13
2020-06-30 11:21:50,382 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - sun.misc.Unsafe.theUnsafe: available
2020-06-30 11:21:50,386 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - sun.misc.Unsafe.copyMemory: available
2020-06-30 11:21:50,390 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - java.nio.Buffer.address: available
2020-06-30 11:21:50,397 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - direct buffer constructor: unavailable
java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled
at io.netty.util.internal.ReflectionUtil.trySetAccessible(ReflectionUtil.java:31)
at io.netty.util.internal.PlatformDependent0$4.run(PlatformDependent0.java:233)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at io.netty.util.internal.PlatformDependent0.(PlatformDependent0.java:227)
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:289)
at io.netty.util.internal.PlatformDependent.(PlatformDependent.java:92)
at io.netty.buffer.PooledByteBufAllocator.(PooledByteBufAllocator.java:111)
at io.lettuce.core.AbstractRedisClient.(AbstractRedisClient.java:69)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:416)
at clojure.lang.RT.classForName(RT.java:2211)
at clojure.lang.RT.classForName(RT.java:2220)
at celtuce.connector.RedisPubSub.(connector.clj:304)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:416)
at clojure.lang.RT.classForName(RT.java:2211)
at clojure.lang.RT.classForName(RT.java:2220)
at clojure.lang.Compiler.resolveIn(Compiler.java:7395)
at clojure.lang.Compiler.resolve(Compiler.java:7358)
at clojure.lang.Compiler.analyzeSymbol(Compiler.java:7319)
at clojure.lang.Compiler.analyze(Compiler.java:6768)
at clojure.lang.Compiler.analyze(Compiler.java:6745)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6120)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6436)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7107)
at clojure.lang.Compiler.analyze(Compiler.java:6789)
at clojure.lang.Compiler.analyze(Compiler.java:6745)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6120)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5467)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4029)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7105)
at clojure.lang.Compiler.analyze(Compiler.java:6789)
at clojure.lang.Compiler.eval(Compiler.java:7174)
at clojure.lang.Compiler.load(Compiler.java:7636)
at clojure.lang.RT.loadResourceScript(RT.java:381)
at clojure.lang.RT.loadResourceScript(RT.java:372)
at clojure.lang.RT.load(RT.java:459)
at clojure.lang.RT.load(RT.java:424)
at clojure.core$load$fn__6839.invoke(core.clj:6126)
at clojure.core$load.invokeStatic(core.clj:6125)
at clojure.core$load.doInvoke(core.clj:6109)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5908)
at clojure.core$load_one.invoke(core.clj:5903)
at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
at clojure.core$load_lib.invokeStatic(core.clj:5947)
at clojure.core$load_lib.doInvoke(core.clj:5928)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$load_libs.invokeStatic(core.clj:5985)
at clojure.core$load_libs.doInvoke(core.clj:5969)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$require.invokeStatic(core.clj:6007)
at clojure.core$require.doInvoke(core.clj:6007)
at clojure.lang.RestFn.invoke(RestFn.java:551)
at qitab.handler.feed$eval24697$loading__6721__auto____24698.invoke(feed.clj:1)
at qitab.handler.feed$eval24697.invokeStatic(feed.clj:1)
at qitab.handler.feed$eval24697.invoke(feed.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:7177)
at clojure.lang.Compiler.eval(Compiler.java:7166)
at clojure.lang.Compiler.load(Compiler.java:7636)
at clojure.lang.RT.loadResourceScript(RT.java:381)
at clojure.lang.RT.loadResourceScript(RT.java:372)
at clojure.lang.RT.load(RT.java:459)
at clojure.lang.RT.load(RT.java:424)
at clojure.core$load$fn__6839.invoke(core.clj:6126)
at clojure.core$load.invokeStatic(core.clj:6125)
at clojure.core$load.doInvoke(core.clj:6109)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5908)
at clojure.core$load_one.invoke(core.clj:5903)
at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
at clojure.core$load_lib.invokeStatic(core.clj:5947)
at clojure.core$load_lib.doInvoke(core.clj:5928)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$load_libs.invokeStatic(core.clj:5985)
at clojure.core$load_libs.doInvoke(core.clj:5969)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:669)
at clojure.core$use.invokeStatic(core.clj:6093)
at clojure.core$use.doInvoke(core.clj:6093)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at user$eval24693.invokeStatic(form-init16241559492696790981.clj:1)
at user$eval24693.invoke(form-init16241559492696790981.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:7177)
at clojure.lang.Compiler.eval(Compiler.java:7132)
at clojure.core$eval.invokeStatic(core.clj:3214)
at clojure.core$eval.invoke(core.clj:3210)
at clojure.main$repl$read_eval_print__9086$fn__9089.invoke(main.clj:437)
at clojure.main$repl$read_eval_print__9086.invoke(main.clj:437)
at clojure.main$repl$fn__9095.invoke(main.clj:458)
at clojure.main$repl.invokeStatic(main.clj:458)
at clojure.main$repl.doInvoke(main.clj:368)
at clojure.lang.RestFn.invoke(RestFn.java:1523)
at nrepl.middleware.interruptible_eval$evaluate.invokeStatic(interruptible_eval.clj:79)
at nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:55)
at nrepl.middleware.interruptible_eval$interruptible_eval$fn__22649$fn__22653.invoke(interruptible_eval.clj:142)
at clojure.lang.AFn.run(AFn.java:22)
at nrepl.middleware.session$session_exec$main_loop__22750$fn__22754.invoke(session.clj:171)
at nrepl.middleware.session$session_exec$main_loop__22750.invoke(session.clj:170)
at clojure.lang.AFn.run(AFn.java:22)
at java.base/java.lang.Thread.run(Thread.java:830)
2020-06-30 11:21:50,425 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - java.nio.Bits.unaligned: available, true
2020-06-30 11:21:50,428 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable
java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module java.base) because module java.base does not export jdk.internal.misc to unnamed module @60b573c7
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:376)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:642)
at java.base/java.lang.reflect.Method.invoke(Method.java:559)
at io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:347)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:312)
at io.netty.util.internal.PlatformDependent0.(PlatformDependent0.java:338)
at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.java:289)
at io.netty.util.internal.PlatformDependent.(PlatformDependent.java:92)
at io.netty.buffer.PooledByteBufAllocator.(PooledByteBufAllocator.java:111)
at io.lettuce.core.AbstractRedisClient.(AbstractRedisClient.java:69)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:416)
at clojure.lang.RT.classForName(RT.java:2211)
at clojure.lang.RT.classForName(RT.java:2220)
at celtuce.connector.RedisPubSub.(connector.clj:304)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:416)
at clojure.lang.RT.classForName(RT.java:2211)
at clojure.lang.RT.classForName(RT.java:2220)
at clojure.lang.Compiler.resolveIn(Compiler.java:7395)
at clojure.lang.Compiler.resolve(Compiler.java:7358)
at clojure.lang.Compiler.analyzeSymbol(Compiler.java:7319)
at clojure.lang.Compiler.analyze(Compiler.java:6768)
at clojure.lang.Compiler.analyze(Compiler.java:6745)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6120)
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6436)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7107)
at clojure.lang.Compiler.analyze(Compiler.java:6789)
at clojure.lang.Compiler.analyze(Compiler.java:6745)
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6120)
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5467)
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4029)
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7105)
at clojure.lang.Compiler.analyze(Compiler.java:6789)
at clojure.lang.Compiler.eval(Compiler.java:7174)
at clojure.lang.Compiler.load(Compiler.java:7636)
at clojure.lang.RT.loadResourceScript(RT.java:381)
at clojure.lang.RT.loadResourceScript(RT.java:372)
at clojure.lang.RT.load(RT.java:459)
at clojure.lang.RT.load(RT.java:424)
at clojure.core$load$fn__6839.invoke(core.clj:6126)
at clojure.core$load.invokeStatic(core.clj:6125)
at clojure.core$load.doInvoke(core.clj:6109)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5908)
at clojure.core$load_one.invoke(core.clj:5903)
at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
at clojure.core$load_lib.invokeStatic(core.clj:5947)
at clojure.core$load_lib.doInvoke(core.clj:5928)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$load_libs.invokeStatic(core.clj:5985)
at clojure.core$load_libs.doInvoke(core.clj:5969)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$require.invokeStatic(core.clj:6007)
at clojure.core$require.doInvoke(core.clj:6007)
at clojure.lang.RestFn.invoke(RestFn.java:551)
at qitab.handler.feed$eval24697$loading__6721__auto____24698.invoke(feed.clj:1)
at qitab.handler.feed$eval24697.invokeStatic(feed.clj:1)
at qitab.handler.feed$eval24697.invoke(feed.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:7177)
at clojure.lang.Compiler.eval(Compiler.java:7166)
at clojure.lang.Compiler.load(Compiler.java:7636)
at clojure.lang.RT.loadResourceScript(RT.java:381)
at clojure.lang.RT.loadResourceScript(RT.java:372)
at clojure.lang.RT.load(RT.java:459)
at clojure.lang.RT.load(RT.java:424)
at clojure.core$load$fn__6839.invoke(core.clj:6126)
at clojure.core$load.invokeStatic(core.clj:6125)
at clojure.core$load.doInvoke(core.clj:6109)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.core$load_one.invokeStatic(core.clj:5908)
at clojure.core$load_one.invoke(core.clj:5903)
at clojure.core$load_lib$fn__6780.invoke(core.clj:5948)
at clojure.core$load_lib.invokeStatic(core.clj:5947)
at clojure.core$load_lib.doInvoke(core.clj:5928)
at clojure.lang.RestFn.applyTo(RestFn.java:142)
at clojure.core$apply.invokeStatic(core.clj:667)
at clojure.core$load_libs.invokeStatic(core.clj:5985)
at clojure.core$load_libs.doInvoke(core.clj:5969)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.core$apply.invokeStatic(core.clj:669)
at clojure.core$use.invokeStatic(core.clj:6093)
at clojure.core$use.doInvoke(core.clj:6093)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at user$eval24693.invokeStatic(form-init16241559492696790981.clj:1)
at user$eval24693.invoke(form-init16241559492696790981.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:7177)
at clojure.lang.Compiler.eval(Compiler.java:7132)
at clojure.core$eval.invokeStatic(core.clj:3214)
at clojure.core$eval.invoke(core.clj:3210)
at clojure.main$repl$read_eval_print__9086$fn__9089.invoke(main.clj:437)
at clojure.main$repl$read_eval_print__9086.invoke(main.clj:437)
at clojure.main$repl$fn__9095.invoke(main.clj:458)
at clojure.main$repl.invokeStatic(main.clj:458)
at clojure.main$repl.doInvoke(main.clj:368)
at clojure.lang.RestFn.invoke(RestFn.java:1523)
at nrepl.middleware.interruptible_eval$evaluate.invokeStatic(interruptible_eval.clj:79)
at nrepl.middleware.interruptible_eval$evaluate.invoke(interruptible_eval.clj:55)
at nrepl.middleware.interruptible_eval$interruptible_eval$fn__22649$fn__22653.invoke(interruptible_eval.clj:142)
at clojure.lang.AFn.run(AFn.java:22)
at nrepl.middleware.session$session_exec$main_loop__22750$fn__22754.invoke(session.clj:171)
at nrepl.middleware.session$session_exec$main_loop__22750.invoke(session.clj:170)
at clojure.lang.AFn.run(AFn.java:22)
at java.base/java.lang.Thread.run(Thread.java:830)
2020-06-30 11:21:50,671 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent0 - java.nio.DirectByteBuffer.(long, int): unavailable
2020-06-30 11:21:50,671 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - sun.misc.Unsafe: available
2020-06-30 11:21:50,707 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - maxDirectMemory: 1048576000 bytes (maybe)
2020-06-30 11:21:50,708 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - -Dio.netty.tmpdir: C:\Users\gandh\AppData\Local\Temp (java.io.tmpdir)
2020-06-30 11:21:50,708 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - -Dio.netty.bitMode: 64 (sun.arch.data.model)
2020-06-30 11:21:50,712 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - -Dio.netty.maxDirectMemory: -1 bytes
2020-06-30 11:21:50,713 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - -Dio.netty.uninitializedArrayAllocationThreshold: -1
2020-06-30 11:21:50,716 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.util.internal.CleanerJava9 - java.nio.ByteBuffer.cleaner(): available
2020-06-30 11:21:50,716 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - -Dio.netty.noPreferDirect: false
2020-06-30 11:21:50,718 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numHeapArenas: 8
2020-06-30 11:21:50,718 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.numDirectArenas: 8
2020-06-30 11:21:50,719 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.pageSize: 8192
2020-06-30 11:21:50,720 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxOrder: 11
2020-06-30 11:21:50,720 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.chunkSize: 16777216
2020-06-30 11:21:50,721 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.tinyCacheSize: 512
2020-06-30 11:21:50,721 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.smallCacheSize: 256
2020-06-30 11:21:50,722 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.normalCacheSize: 64
2020-06-30 11:21:50,722 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedBufferCapacity: 32768
2020-06-30 11:21:50,723 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimInterval: 8192
2020-06-30 11:21:50,723 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.cacheTrimIntervalMillis: 0
2020-06-30 11:21:50,723 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.useCacheForAllThreads: true
2020-06-30 11:21:50,724 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.buffer.PooledByteBufAllocator - -Dio.netty.allocator.maxCachedByteBuffersPerChunk: 1023
2020-06-30 11:21:50,738 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.u.i.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.initialSize: 1024
2020-06-30 11:21:50,738 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.u.i.InternalThreadLocalMap - -Dio.netty.threadLocalMap.stringBuilder.maxSize: 4096
2020-06-30 11:21:50,835 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.c.r.DefaultClientResources - -Dio.netty.eventLoopThreads: 4
2020-06-30 11:21:50,941 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.c.r.DefaultEventLoopGroupProvider - Creating executor io.netty.util.concurrent.DefaultEventExecutorGroup
2020-06-30 11:21:51,018 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@564d8f9
2020-06-30 11:21:51,052 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.util.internal.PlatformDependent - org.jctools-core.MpscChunkedArrayQueue: available
2020-06-30 11:21:51,082 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
2020-06-30 11:21:51,662 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.c.r.DefaultClientResources - LatencyUtils/HdrUtils are
not available, metrics are disabled
2020-06-30 11:21:51,716 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.lettuce.core.RedisClient - Trying to get a Redis connection for: RedisURI [host='localhost', port=6379]
2020-06-30 11:21:52,933 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.lettuce.core.EpollProvider - Starting without optional epoll library
2020-06-30 11:21:52,938 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.lettuce.core.KqueueProvider - Starting without optional
kqueue library
2020-06-30 11:21:52,942 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.c.r.DefaultEventLoopGroupProvider - Allocating executor io.netty.channel.nio.NioEventLoopGroup
2020-06-30 11:21:52,942 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.c.r.DefaultEventLoopGroupProvider - Creating executor io.netty.channel.nio.NioEventLoopGroup
2020-06-30 11:21:52,944 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.n.c.MultithreadEventLoopGroup - -Dio.netty.eventLoopThreads: 8
2020-06-30 11:21:52,956 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.noKeySetOptimization: false
2020-06-30 11:21:52,957 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.channel.nio.NioEventLoop - -Dio.netty.selectorAutoRebuildThreshold: 512
2020-06-30 11:21:53,238 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.c.r.DefaultEventLoopGroupProvider - Adding reference to io.netty.channel.nio.NioEventLoopGroup@1e851866, existing ref count 0
2020-06-30 11:21:53,272 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.lettuce.core.RedisClient - Resolved SocketAddress localhost:6379 using RedisURI [host='localhost', port=6379]
2020-06-30 11:21:53,274 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.lettuce.core.RedisClient - Connecting to Redis at localhost:6379
2020-06-30 11:21:53,310 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.processId: 7400 (auto-detected)
2020-06-30 11:21:53,316 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv4Stack: false
2020-06-30 11:21:53,317 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.util.NetUtil - -Djava.net.preferIPv6Addresses: false
2020-06-30 11:21:53,584 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.util.NetUtil - Loopback interface: lo (Software Loopback Interface 1, 127.0.0.1)
2020-06-30 11:21:53,587 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.util.NetUtil - Failed to get SOMAXCONN from sysctl and file \proc\sys\net\core\somaxconn. Default: 200
2020-06-30 11:21:53,874 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.channel.DefaultChannelId - -Dio.netty.machineId: c0:14:3d:ff:fe:d3:a9:2f (auto-detected)
2020-06-30 11:21:53,920 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.allocator.type: pooled
2020-06-30 11:21:53,920 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.threadLocalDirectBufferSize: 0
2020-06-30 11:21:53,920 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.netty.buffer.ByteBufUtil - -Dio.netty.maxThreadLocalCharBufferSize: 16384
2020-06-30 11:21:54,030 [lettuce-nioEventLoop-4-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxCapacityPerThread: 4096
2020-06-30 11:21:54,032 [lettuce-nioEventLoop-4-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.maxSharedCapacityFactor: 2
2020-06-30 11:21:54,033 [lettuce-nioEventLoop-4-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.linkCapacity: 16
2020-06-30 11:21:54,033 [lettuce-nioEventLoop-4-1] DEBUG io.netty.util.Recycler - -Dio.netty.recycler.ratio: 8
2020-06-30 11:21:54,068 [lettuce-nioEventLoop-4-1] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkAccessible: true
2020-06-30 11:21:54,070 [lettuce-nioEventLoop-4-1] DEBUG io.netty.buffer.AbstractByteBuf - -Dio.netty.buffer.checkBounds: true
2020-06-30 11:21:54,070 [lettuce-nioEventLoop-4-1] DEBUG i.n.util.ResourceLeakDetectorFactory - Loaded default ResourceLeakDetector: io.netty.util.ResourceLeakDetector@70593039
2020-06-30 11:21:54,149 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, [id: 0xdddd6773] (inactive),
chid=0x1] channelRegistered()
2020-06-30 11:21:54,168 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, chid=0x1] channelActive()
2020-06-30 11:21:54,173 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.DefaultEndpoint - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, epid=0x1] activateEndpointAndExecuteBufferedCommands 0 command(s) buffered
2020-06-30 11:21:54,173 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.DefaultEndpoint - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, epid=0x1] activating endpoint
2020-06-30 11:21:54,174 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.DefaultEndpoint - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, epid=0x1] flushCommands()
2020-06-30 11:21:54,184 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.DefaultEndpoint - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, epid=0x1] flushCommands() Flushing 0 commands
2020-06-30 11:21:54,185 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.ConnectionWatchdog - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, last known addr=localhost/127.0.0.1:6379] channelActive()
2020-06-30 11:21:54,186 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, chid=0x1] channelActive() done
2020-06-30 11:21:54,188 [lettuce-nioEventLoop-4-1] DEBUG io.lettuce.core.RedisClient - Connecting to Redis at localhost:6379: Success
2020-06-30 11:21:54,196 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.ConnectionWatchdog - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, last known addr=localhost/127.0.0.1:6379] userEventTriggered(ctx, io.lettuce.core.ConnectionEvents$Activated@2e50f3d3)
2020-06-30 11:21:54,365 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG io.lettuce.core.RedisChannelHandler - dispatching command AsyncCommand [type=COMMAND, output=ArrayOutput [output=[], error='null'], commandType=io.lettuce.core.protocol.Command]
2020-06-30 11:21:54,366 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.core.protocol.DefaultEndpoint - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, epid=0x1] write() writeAndFlush command AsyncCommand [type=COMMAND, output=ArrayOutput [output=[],
error='null'], commandType=io.lettuce.core.protocol.Command]
2020-06-30 11:21:54,374 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, chid=0x1] write(ctx, AsyncCommand [type=COMMAND, output=ArrayOutput [output=[], error='null'], commandType=io.lettuce.core.protocol.Command], promise)
2020-06-30 11:21:54,380 [nRepl-session-df66f46b-d408-405a-bab0-1c82af31feca] DEBUG i.l.core.protocol.DefaultEndpoint - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, epid=0x1] write() done
2020-06-30 11:21:54,384 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandEncoder - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379] writing command AsyncCommand [type=COMMAND, output=ArrayOutput [output=[], error='null'], commandType=io.lettuce.core.protocol.Command]
2020-06-30 11:21:54,404 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, chid=0x1] Received: 1024 bytes, 1 commands in the stack
2020-06-30 11:21:54,404 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, chid=0x1] Stack contains: 1 commands
2020-06-30 11:21:54,405 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.RedisStateMachine - Decode AsyncCommand [type=COMMAND, output=ArrayOutput [output=[], error='null'], commandType=io.lettuce.core.protocol.Command]
2020-06-30 11:21:54,439 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.RedisStateMachine - Decoded AsyncCommand [type=COMMAND, output=ArrayOutput [output=[[restore-asking, -4, [write, denyoom, asking], 1, 1, 1], [rpushx, -3, [write, denyoom, fast], 1, 1, 1], [move, 3, [write, fast], 1, 1, 1], [getset, 3, [write, denyoom], 1, 1, 1], [info, -1, [random, loading, stale], 0, 0, 0], [rpush, -3, [write, denyoom, fast], 1, 1, 1], [expireat, 3, [write, fast], 1, 1, 1], [setrange, 4, [write, denyoom], 1, 1, 1], [rpoplpush, 3, [write, denyoom], 1, 2, 1], [hincrby, 4,
[write, denyoom, fast], 1, 1, 1], [bitpos, -3, [readonly], 1, 1, 1], [replconf, -1, [admin, noscript, loading, stale], 0, 0, 0], [wait, 3, [noscript], 0, 0, 0], [keys, 2, [readonly, sort_for_script], 0, 0, 0], [touch, -2, [readonly, fast], 1, 1, 1], [echo, 2, [fast], 0, 0, 0], [unwatch, 1, [noscript, fast], 0, 0, 0]], error='null'], commandType=io.lettuce.core.protocol.Command], empty stack: false
2020-06-30 11:21:54,441 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, chid=0x1] Received: 10444 bytes, 1 commands in the stack
2020-06-30 11:21:54,441 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.CommandHandler - [channel=0x865789e3, /127.0.0.1:1355 -> localhost/127.0.0.1:6379, chid=0x1] Stack contains: 1 commands
2020-06-30 11:21:54,442 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.RedisStateMachine - Decode AsyncCommand [type=COMMAND, output=ArrayOutput [output=[[restore-asking, -4, [write, denyoom, asking], 1, 1, 1], [rpushx, -3, [write, denyoom, fast], 1, 1, 1], [move, 3, [write, fast], 1, 1, 1], [getset, 3, [write, denyoom], 1, 1, 1], [info, -1, [random, loading, stale], 0, 0, 0], [rpush, -3, [write, denyoom, fast], 1, 1,
1], [expireat, 3, [write, fast], 1, 1, 1], [setrange, 4, [write, denyoom], 1, 1, 1], [rpoplpush, 3, [write, denyoom], 1, 2, 1], [hincrby, 4, [write, denyoom, fast], 1, 1, 1], [bitpos, -3, [readonly], 1, 1, 1], [replconf, -1, [admin, noscript, loading, stale], 0, 0, 0], [wait, 3, [noscript], 0, 0, 0], [keys, 2, [readonly, sort_for_script], 0, 0, 0], [touch, -2, [readonly, fast], 1, 1, 1], [echo, 2, [fast], 0, 0, 0], [unwatch, 1, [noscript, fast], 0, 0, 0]], error='null'], commandType=io.lettuce.core.protocol.Command]
2020-06-30 11:21:54,508 [lettuce-nioEventLoop-4-1] DEBUG i.l.core.protocol.RedisStateMachine - Decoded AsyncCommand [type=COMMAND, output=ArrayOutput [output=[[restore-asking, -4, [write, denyoom, asking], 1, 1, 1], [rpushx, -3, [write, denyoom, fast], 1, 1, 1], [move, 3, [write, fast], 1, 1, 1], [getset, 3, [write, denyoom], 1, 1, 1], [info, -1, [random, loading, stale], 0, 0, 0], [rpush, -3, [write, denyoom, fast], 1, 1, 1], [expireat, 3, [write, fast], 1, 1, 1], [setrange, 4, [write, denyoom], 1, 1, 1], [rpoplpush, 3, [write, denyoom], 1, 2, 1], [hincrby, 4,
[write, denyoom, fast], 1, 1, 1], [bitpos, -3, [readonly], 1, 1, 1], [replconf, -1, [admin, noscript, loading, stale], 0, 0, 0], [wait, 3, [noscript], 0, 0, 0], [keys, 2, [readonly, sort_for_script], 0, 0, 0], [touch, -2, [readonly, fast], 1, 1, 1], [echo, 2, [fast], 0, 0, 0], [unwatch, 1, [noscript, fast], 0, 0, 0], [pubsub, -2, [pubsub, random, loading, stale], 0, 0, 0], [georadius_ro, -6, [readonly, movablekeys], 1, 1,
1], [watch, -2, [noscript, fast], 1, -1, 1], [llen, 2, [readonly, fast], 1, 1, 1], [geodist, -4, [readonly], 1, 1, 1], [save, 1, [admin, noscript], 0, 0, 0], [sort, -2, [write, denyoom, movablekeys], 1, 1, 1], [dump, 2, [readonly, random], 1, 1, 1], [ttl, 2, [readonly, random, fast], 1, 1, 1], [pfmerge, -2, [write, denyoom], 1, -1, 1], [lpop, 2, [write, fast], 1, 1, 1], [discard, 1, [noscript, fast], 0, 0, 0], [hexists, 3, [readonly, fast], 1, 1, 1], [lpush, -3, [write, denyoom, fast], 1, 1, 1], [replicaof, 3, [admin, noscript, stale], 0, 0, 0], [zcount, 4, [readonly, fast], 1, 1, 1], [multi, 1, [noscript, fast], 0, 0, 0], [zpopmin, -2, [write, fast], 1, 1, 1], [xrange, -4, [readonly], 1, 1, 1], [object, -2, [readonly, random], 2, 2, 1], [swapdb, 3, [write, fast], 0, 0, 0], [zremrangebylex, 4, [write], 1, 1, 1], [lolwut, -1, [readonly], 0,
0, 0], [pfadd, -2, [write, denyoom, fast], 1, 1, 1], [geopos, -2, [readonly], 1, 1, 1], [ltrim, 4, [write], 1, 1, 1], [incrby, 3, [write, denyoom, fast], 1, 1, 1], [georadiusbymember_ro, -5, [readonly, movablekeys], 1, 1, 1], [bgsave, -1, [admin, noscript], 0, 0, 0], [monitor, 1, [admin, noscript], 0, 0, 0], [setnx, 3, [write, denyoom, fast], 1, 1, 1], [renamenx, 3, [write, fast], 1, 2, 1], [zrange, -4, [readonly], 1, 1, 1], [zremrangebyscore, 4, [write], 1, 1, 1], [brpop, -3, [write, noscript], 1, -2, 1], [evalsha, -3, [noscript, movablekeys], 0, 0, 0], [hlen,
2, [readonly, fast], 1, 1, 1], [xgroup, -2, [write, denyoom], 2, 2, 1], [incr, 2, [write, denyoom, fast], 1, 1, 1], [mset, -3, [write, denyoom], 1, -1, 2], [append, 3, [write, denyoom], 1, 1, 1], [geohash, -2, [readonly], 1, 1, 1], [del, -2, [write], 1, -1, 1], [xlen, 2, [readonly, fast], 1, 1, 1], [msetnx, -3, [write, denyoom], 1, -1, 2], [sunion, -2, [readonly, sort_for_script], 1, -1, 1], [decr, 2, [write, denyoom, fast], 1, 1, 1], [linsert, 5, [write, denyoom], 1, 1, 1], [command, 0, [random, loading, stale], 0, 0, 0], [unlink, -2, [write, fast], 1, -1, 1],
[smembers, 2, [readonly, sort_for_script], 1, 1, 1], [debug, -2, [admin, noscript], 0, 0, 0], [zrevrangebyscore, -4, [readonly], 1, 1, 1], [xack, -4, [write, fast], 1, 1, 1], [script, -2, [noscript], 0, 0, 0], [lastsave, 1, [random, fast], 0, 0, 0], [subscribe, -2, [pubsub, noscript, loading, stale], 0, 0, 0], [hincrbyfloat, 4, [write, denyoom, fast], 1, 1, 1], [hdel, -3, [write, fast], 1, 1, 1], [srandmember, -2, [readonly, random], 1, 1, 1], [sync, 1, [readonly, admin, noscript], 0, 0, 0], [zrank, 3, [readonly, fast], 1, 1, 1], [flushall, -1, [write], 0, 0, 0], [xdel, -3, [write, fast], 1, 1, 1], [zincrby, 4, [write, denyoom, fast], 1, 1, 1], [xclaim, -6, [write, random, fast], 1, 1, 1], [bitop, -4, [write, denyoom], 2, -1, 1], [lrange, 4, [readonly], 1, 1, 1], [post, -1, [loading, stale], 0, 0, 0], [setbit, 4, [write, denyoom], 1, 1, 1], [lset, 4, [write, denyoom], 1, 1, 1], [zscan, -3, [readonly, random], 1, 1, 1], [persist, 2, [write, fast], 1, 1, 1], [auth, 2, [noscript, loading, stale, fast], 0, 0, 0], [pfdebug, -3, [write], 0, 0, 0], [sinterstore, -3, [write, denyoom], 1, -1, 1], [decrby, nil3, [write, denyoom, fast], 1, 1, 1], [hscan, -3, [readonly, random], 1, 1, 1], [scard, 2, [readonly, fast], 1, 1, 1], [lrem, 4, [write], 1, 1, 1], [pttl, 2, [readonly, random, fast], 1, 1, 1], [strlen, 2, [readonly, fast], 1, 1, 1], [spop, -2, [write, random, fast], 1, 1, 1], [zinterstore, -4, [write,
denyoom, movablekeys], 0, 0, 0], [hmset, -4, [write, denyoom, fast], 1, 1, 1], [select, 2, [loading, fast], 0, 0, 0], [zrangebyscore, -4, [readonly], 1, 1, 1], [zrem, -3, [write, fast], 1, 1, 1], [zscore, 3, [readonly, fast], 1, 1, 1], [zrangebylex, -4, [readonly], 1, 1, 1], [sdiffstore, -3, [write, denyoom], 1, -1, 1], [getrange, 4, [readonly], 1, 1, 1], [scan, -2, [readonly, random], 0, 0, 0], [zrevrangebylex, -4, [readonly], 1, 1, 1], [hstrlen, 3, [readonly, fast], 1, 1, 1], [hkeys, 2, [readonly, sort_for_script], 1, 1, 1], [setex, 4, [write, denyoom], 1, 1,
1], [type, 2, [readonly, fast], 1, 1, 1], [pexpire, 3, [write, fast], 1, 1, 1], [readonly, 1, [fast], 0, 0, 0], [zrevrange, -4, [readonly], 1, 1, 1], [li
ndex, 3, [readonly], 1, 1, 1], [xinfo, -2, [readonly, random], 2, 2, 1], [memory, -2, [readonly, random], 0, 0, 0], [sadd, -3, [write, denyoom, fast], 1, 1, 1], [slowlog, -2, [admin, random], 0, 0, 0], [hset, -4, [write, denyoom, fast], 1, 1, 1], [restore, -4, [write, denyoom], 1, 1, 1], [asking, 1, [fast], 0, 0, 0], [latency, -2, [admin, noscript, loading, stale], 0, 0, 0], [hgetall, 2, [readonly, random], 1, 1, 1], [xsetid, 3, [write, denyoom, fast], 1, 1, 1], [role, 1, [noscript, loading, stale], 0, 0, 0], [config, -2, [admin, noscript, loading, stale], 0, 0, 0], [bitcount, -2, [readonly], 1, 1, 1], [time, 1, [random, fast], 0, 0, 0], [module, -2, [admin, noscript], 0, 0, 0], [zrevrank, 3, [readonly, fast], 1, 1, 1], [xpending, -3, [readonly, random], 1, 1, 1], [xtrim, -2, [write, random, fast], 1, 1, 1], [eval, -3, [noscript, movablekeys], 0, 0, 0], [bzpopmin, -3, [write, noscript, fast], 1, -2, 1], [host:, -1, [loading, stale], 0, 0, 0], [rpop, 2, [write, fast], 1, 1, 1], [cluster, -2, [admin], 0, 0, 0], [unsubscribe, -1, [pubsub, noscript, loading, stale], 0, 0, 0], [blpop, -3, [write, noscript], 1, -2, 1], [zcard, 2, [readonly, fast], 1, 1, 1], [georadiusbymember, -5, [write, movablekeys], 1, 1, 1], [getbit, 3, [readonly, fast], 1, 1, 1], [slaveof, 3, [admin, noscript, stale], 0, 0, 0], [get, 2, [readonly, fast], 1, 1, 1], [sinter, -2, [readonly, sort_for_script], 1, -1, 1], [pexpireat, 3,
[write, fast], 1, 1, 1], [exists, -2, [readonly, fast], 1, -1, 1], [flushdb, -1, [write], 0, 0, 0], [sscan, -3, [readonly, random], 1, 1, 1],
[sdiff, -2, [readonly, sort_for_script], 1, -1, 1], [shutdown, -1, [admin, noscript, loading, stale], 0, 0, 0], [xread, -4, [readonly, noscript, movablekeys], 1, 1, 1], [zlexcount, 4, [readonly, fast], 1, 1, 1], [srem, -3, [write, fast], 1, 1, 1], [bitfield, -2, [write, denyoom], 1,
1, 1], [georadius, -6, [write, movablekeys], 1, 1, 1], [zremrangebyrank, 4, [write], 1, 1, 1], [punsubscribe, -1, [pubsub, noscript, loading,
stale], 0, 0, 0], [zpopmax, -2, [write, fast], 1, 1, 1], [substr, 4, [readonly], 1, 1, 1], [lpushx, -3, [write, denyoom, fast], 1, 1, 1], [hmget, -3, [readonly, fast], 1, 1, 1], [psync, 3, [readonly, admin, noscript], 0, 0, 0], [readwrite, 1, [fast], 0, 0, 0], [geoadd, -5, [write, denyoom], 1, 1, 1], [mget, -2, [readonly, fast], 1, -1, 1], [xrevrange, -4, [readonly], 1, 1, 1], [sismember, 3, [readonly, fast], 1, 1, 1], [expire, 3, [write, fast], 1, 1, 1], [pfselftest, 1, [admin], 0, 0, 0], [hvals, 2, [readonly, sort_for_script], 1, 1, 1], [dbsize, 1, [readonly,
fast], 0, 0, 0], [smove, 4, [write, fast], 1, 2, 1], [xreadgroup, -7, [write, noscript, movablekeys], 1, 1, 1], [rename, 3, [write], 1, 2, 1], [migrate, -6, [write, random, movablekeys], 0, 0, 0], [zadd, -4, [write, denyoom, fast], 1, 1, 1], [brpoplpush, 4, [write, denyoom, noscript], 1, 2, 1], [exec, 1, [noscript, skip_monitor], 0, 0, 0], [incrbyfloat, 3, [write, denyoom, fast], 1, 1, 1], [zunionstore, -4, [write, denyoom, movablekeys], 0, 0, 0], [psetex, 4, [write, denyoom], 1, 1, 1], [psubscribe, -2, [pubsub, noscript, loading, stale], 0, 0, 0], [publish, 3,
[pubsub, loading, stale, fast], 0, 0, 0], [client, -2, [admin, noscript], 0, 0, 0], [set, -3, [write, denyoom], 1, 1, 1], [hget, 3, [readonly, fast], 1, 1, 1], [hsetnx, 4, [write, denyoom, fast], 1, 1, 1], [pfcount, -2, [readonly], 1, -1, 1], [ping, -1, [stale, fast], 0, 0, 0], [xadd, -5, [write, denyoom, random, fast], 1, 1, 1], [bzpopmax, -3, [write, noscript, fast], 1, -2, 1], [sunionstore, -3, [write, denyoom], 1, -1,
1], [randomkey, 1, [readonly, random], 0, 0, 0], [bgrewriteaof, 1, [admin, noscript], 0, 0, 0]], error='null'], commandType=io.lettuce.core.protocol.Command], empty stack: true

Pool with async commands?

Does the new pool functionality work with async commands? In looking at the macro, it appears that the connection is potentially returned to the pool before the async commands would have finished.

Missing commands

Thanks for the awesome library! It's working really well for us. We ping redis occasionally during our routine health check process and noticed the PING command was missing along with a few others. Not sure if all of these make sense to implement, but I pasted below a quick diff of missing ones from Redis' website.

Navigate to https://redis.io/commands, open the inspector and paste:

const subcommandsAvailable = ['ACL', 'CLIENT', 'CLUSTER', 'COMMAND', 'CONFIG', 'DEBUG', 'MEMORY', 'MODULE', 'SCRIPT', 'LATENCY'];
const allCommands = $('span.command').toArray().map(e => e.innerText);
console.log(JSON.stringify(allCommands.map(text => {
  const [cmd, subcommand] = text.split(' ');
   return (subcommandsAvailable.includes(cmd) ? `${cmd}-${subcommand}` : cmd).toLowerCase() 
})));

Then take that output and put into a repl:

(def all-cmds (set (parse-json "<pasted from browser>"))
(def celtuce-cmds (set (map name (keys (ns-publics 'celtuce.commands)))))
(sort (set/difference all-cmds celtuce-cmds))

In my case, the output was:

=>
("acl-cat"
 "acl-deluser"
 "acl-genpass"
 "acl-list"
 "acl-load"
 "acl-log"
 "acl-save"
 "acl-setuser"
 "acl-users"
 "acl-whoami"
 "auth"
 "bitop"
 "bzpopmax"
 "bzpopmin"
 "client-caching"
 "client-getredir"
 "client-id"
 "client-reply"
 "client-tracking"
 "client-unblock"
 "cluster-addslots"
 "cluster-bumpepoch"
 "cluster-count-failure-reports"
 "cluster-countkeysinslot"
 "cluster-delslots"
 "cluster-failover"
 "cluster-flushslots"
 "cluster-forget"
 "cluster-getkeysinslot"
 "cluster-info"
 "cluster-keyslot"
 "cluster-meet"
 "cluster-myid"
 "cluster-nodes"
 "cluster-replicas"
 "cluster-replicate"
 "cluster-reset"
 "cluster-saveconfig"
 "cluster-set-config-epoch"
 "cluster-setslot"
 "cluster-slaves"
 "cluster-slots"
 "command-getkeys"
 "command-undefined"
 "echo"
 "hello"
 "latency-doctor"
 "latency-graph"
 "latency-help"
 "latency-history"
 "latency-latest"
 "latency-reset"
 "lolwut"
 "memory-doctor"
 "memory-help"
 "memory-malloc-stats"
 "memory-purge"
 "memory-stats"
 "memory-usage"
 "module-list"
 "module-load"
 "module-unload"
 "monitor"
 "object"
 "ping"
 "psync"
 "pubsub"
 "quit"
 "readonly"
 "readwrite"
 "replicaof"
 "role"
 "script-debug"
 "script-exists"
 "select"
 "slowlog"
 "stralgo"
 "swapdb"
 "sync"
 "wait"
 "xack"
 "xadd"
 "xclaim"
 "xdel"
 "xgroup"
 "xinfo"
 "xlen"
 "xpending"
 "xrange"
 "xread"
 "xreadgroup"
 "xrevrange"
 "xtrim"
 "zpopmax"
 "zpopmin"
 "zrevrangebylex")

Deprecations

Hi,

great library ๐Ÿ™Œ

I noticed that it uses a number of deprecated Java methods. For example lein eastwood reports 30+ deprecations in the lettuce-core module.

Here's a brief sampler:

src/celtuce/impl/cluster.clj:394:15: deprecations: Instance method 'public abstract java.util.List io.lettuce.core.api.sync.RedisSortedSetCommands.zrangebylex(java.lang.Object,java.lang.String,java.lang.String)' is deprecated.
src/celtuce/impl/cluster.clj:396:15: deprecations: Instance method 'public abstract java.util.List io.lettuce.core.api.sync.RedisSortedSetCommands.zrangebylex(java.lang.Object,java.lang.String,java.lang.String,long,long)' is deprecated.
src/celtuce/impl/cluster.clj:314:5: deprecations: Instance method 'public abstract java.lang.Long io.lettuce.core.api.sync.RedisSortedSetCommands.zcount(java.lang.Object,double,double)' is deprecated.

It seems a good idea to eventually fix them so that one can continue to upgrade Lettuce (which can always be needed for various reasons) seamlessly.

Cheers - V

How to use multi/exec with celtuce?

this is more of a question, as I am not able to find documentation on how to wrap commands in a multi/exec block. I am sure i am missing something basic, since i am a Clojure noob.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.