Quarkus: Offer a Redis extension

Created on 8 Oct 2019  路  27Comments  路  Source: quarkusio/quarkus

Describe the extension

Offer Redis client support via an extension

Interested in this extension, please +1 via the emoji/reaction feature of GitHub (top right).

Configuration suggestion

# Add your application.properties here, if applicable.
  • redis cluster
  • unername / password
  • ???

Additional context
(Add any other context about the proposal here.)

kinepic kinextension-proposal

Most helpful comment

Hi @andreas-eberle @pmlopes I'll work on this extension and be able to make progress on it once I am back from vacations (in a week time from now).

All 27 comments

Hi @emmanuelbernard I'll be interested to work on this :-)

I've done some investigation on it. I tried to get Redisson working with quarkus and native compile --> failed.
After this i tried the lettuce redis driver and got this running also with native compile. Currently I'm using the implementation without an extension. An extension would be very helpful...

BR,

Alfred

Hi @emmanuelbernard I'll be interested to work on this :-)

I have been giving this a thought and here are some early ideas that I have: In terms of design, the quarkus-mailer client is an inspiration - so I am thinking of having an extensions which will offer a blocking redis-client, a reactive one, and a mocked one for tests (?).

I have been thinking to use https://lettuce.io as an underlying library. @emmanuelbernard @gsmet WDYT? Any other design ideas?

I may start experiment some ideas midweek.

During my experiments I got https://lettuce.io with following entries in dynamic-proxy-config.json

[
      ["io.lettuce.core.api.sync.RedisCommands","io.lettuce.core.cluster.api.sync.RedisClusterCommands"]
]

and following aditional entries to reflect-config.json

[
{
  "name":"io.lettuce.core.AbstractRedisAsyncCommands",
  "methods":[
    {"name":"append","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"asking","parameterTypes":[] }, 
    {"name":"auth","parameterTypes":["java.lang.String"] }, 
    {"name":"bgrewriteaof","parameterTypes":[] }, 
    {"name":"bgsave","parameterTypes":[] }, 
    {"name":"bitcount","parameterTypes":["java.lang.Object"] }, 
    {"name":"bitcount","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"bitfield","parameterTypes":["java.lang.Object","io.lettuce.core.BitFieldArgs"] }, 
    {"name":"bitopAnd","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"bitopNot","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"bitopOr","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"bitopXor","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"bitpos","parameterTypes":["java.lang.Object","boolean"] }, 
    {"name":"bitpos","parameterTypes":["java.lang.Object","boolean","long"] }, 
    {"name":"bitpos","parameterTypes":["java.lang.Object","boolean","long","long"] }, 
    {"name":"blpop","parameterTypes":["long","java.lang.Object[]"] }, 
    {"name":"brpop","parameterTypes":["long","java.lang.Object[]"] }, 
    {"name":"brpoplpush","parameterTypes":["long","java.lang.Object","java.lang.Object"] }, 
    {"name":"bzpopmax","parameterTypes":["long","java.lang.Object[]"] }, 
    {"name":"bzpopmin","parameterTypes":["long","java.lang.Object[]"] }, 
    {"name":"clientGetname","parameterTypes":[] }, 
    {"name":"clientKill","parameterTypes":["io.lettuce.core.KillArgs"] }, 
    {"name":"clientKill","parameterTypes":["java.lang.String"] }, 
    {"name":"clientList","parameterTypes":[] }, 
    {"name":"clientPause","parameterTypes":["long"] }, 
    {"name":"clientSetname","parameterTypes":["java.lang.Object"] }, 
    {"name":"clientUnblock","parameterTypes":["long","io.lettuce.core.UnblockType"] }, 
    {"name":"clusterAddSlots","parameterTypes":["int[]"] }, 
    {"name":"clusterBumpepoch","parameterTypes":[] }, 
    {"name":"clusterCountFailureReports","parameterTypes":["java.lang.String"] }, 
    {"name":"clusterCountKeysInSlot","parameterTypes":["int"] }, 
    {"name":"clusterDelSlots","parameterTypes":["int[]"] }, 
    {"name":"clusterFailover","parameterTypes":["boolean"] }, 
    {"name":"clusterFlushslots","parameterTypes":[] }, 
    {"name":"clusterForget","parameterTypes":["java.lang.String"] }, 
    {"name":"clusterGetKeysInSlot","parameterTypes":["int","int"] }, 
    {"name":"clusterInfo","parameterTypes":[] }, 
    {"name":"clusterKeyslot","parameterTypes":["java.lang.Object"] }, 
    {"name":"clusterMeet","parameterTypes":["java.lang.String","int"] }, 
    {"name":"clusterMyId","parameterTypes":[] }, 
    {"name":"clusterNodes","parameterTypes":[] }, 
    {"name":"clusterReplicate","parameterTypes":["java.lang.String"] }, 
    {"name":"clusterReset","parameterTypes":["boolean"] }, 
    {"name":"clusterSaveconfig","parameterTypes":[] }, 
    {"name":"clusterSetConfigEpoch","parameterTypes":["long"] }, 
    {"name":"clusterSetSlotImporting","parameterTypes":["int","java.lang.String"] }, 
    {"name":"clusterSetSlotMigrating","parameterTypes":["int","java.lang.String"] }, 
    {"name":"clusterSetSlotNode","parameterTypes":["int","java.lang.String"] }, 
    {"name":"clusterSetSlotStable","parameterTypes":["int"] }, 
    {"name":"clusterSlaves","parameterTypes":["java.lang.String"] }, 
    {"name":"clusterSlots","parameterTypes":[] }, 
    {"name":"command","parameterTypes":[] }, 
    {"name":"commandCount","parameterTypes":[] }, 
    {"name":"commandInfo","parameterTypes":["io.lettuce.core.protocol.CommandType[]"] }, 
    {"name":"commandInfo","parameterTypes":["java.lang.String[]"] }, 
    {"name":"configGet","parameterTypes":["java.lang.String"] }, 
    {"name":"configResetstat","parameterTypes":[] }, 
    {"name":"configRewrite","parameterTypes":[] }, 
    {"name":"configSet","parameterTypes":["java.lang.String","java.lang.String"] }, 
    {"name":"dbsize","parameterTypes":[] }, 
    {"name":"debugCrashAndRecover","parameterTypes":["java.lang.Long"] }, 
    {"name":"debugHtstats","parameterTypes":["int"] }, 
    {"name":"debugObject","parameterTypes":["java.lang.Object"] }, 
    {"name":"debugOom","parameterTypes":[] }, 
    {"name":"debugReload","parameterTypes":[] }, 
    {"name":"debugRestart","parameterTypes":["java.lang.Long"] }, 
    {"name":"debugSdslen","parameterTypes":["java.lang.Object"] }, 
    {"name":"debugSegfault","parameterTypes":[] }, 
    {"name":"decr","parameterTypes":["java.lang.Object"] }, 
    {"name":"decrby","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"del","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"digest","parameterTypes":["java.lang.Object"] }, 
    {"name":"discard","parameterTypes":[] }, 
    {"name":"dispatch","parameterTypes":["io.lettuce.core.protocol.ProtocolKeyword","io.lettuce.core.output.CommandOutput"] }, 
    {"name":"dispatch","parameterTypes":["io.lettuce.core.protocol.ProtocolKeyword","io.lettuce.core.output.CommandOutput","io.lettuce.core.protocol.CommandArgs"] }, 
    {"name":"dump","parameterTypes":["java.lang.Object"] }, 
    {"name":"echo","parameterTypes":["java.lang.Object"] }, 
    {"name":"eval","parameterTypes":["java.lang.String","io.lettuce.core.ScriptOutputType","java.lang.Object[]"] }, 
    {"name":"eval","parameterTypes":["java.lang.String","io.lettuce.core.ScriptOutputType","java.lang.Object[]","java.lang.Object[]"] }, 
    {"name":"evalsha","parameterTypes":["java.lang.String","io.lettuce.core.ScriptOutputType","java.lang.Object[]"] }, 
    {"name":"evalsha","parameterTypes":["java.lang.String","io.lettuce.core.ScriptOutputType","java.lang.Object[]","java.lang.Object[]"] }, 
    {"name":"exec","parameterTypes":[] }, 
    {"name":"exists","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"expire","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"expireat","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"expireat","parameterTypes":["java.lang.Object","java.util.Date"] }, 
    {"name":"flushall","parameterTypes":[] }, 
    {"name":"flushallAsync","parameterTypes":[] }, 
    {"name":"flushdb","parameterTypes":[] }, 
    {"name":"flushdbAsync","parameterTypes":[] }, 
    {"name":"geoadd","parameterTypes":["java.lang.Object","double","double","java.lang.Object"] }, 
    {"name":"geoadd","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"geodist","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object","io.lettuce.core.GeoArgs$Unit"] }, 
    {"name":"geohash","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"geopos","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"georadius","parameterTypes":["java.lang.Object","double","double","double","io.lettuce.core.GeoArgs$Unit"] }, 
    {"name":"georadius","parameterTypes":["java.lang.Object","double","double","double","io.lettuce.core.GeoArgs$Unit","io.lettuce.core.GeoArgs"] }, 
    {"name":"georadius","parameterTypes":["java.lang.Object","double","double","double","io.lettuce.core.GeoArgs$Unit","io.lettuce.core.GeoRadiusStoreArgs"] }, 
    {"name":"georadiusbymember","parameterTypes":["java.lang.Object","java.lang.Object","double","io.lettuce.core.GeoArgs$Unit"] }, 
    {"name":"georadiusbymember","parameterTypes":["java.lang.Object","java.lang.Object","double","io.lettuce.core.GeoArgs$Unit","io.lettuce.core.GeoArgs"] }, 
    {"name":"georadiusbymember","parameterTypes":["java.lang.Object","java.lang.Object","double","io.lettuce.core.GeoArgs$Unit","io.lettuce.core.GeoRadiusStoreArgs"] }, 
    {"name":"get","parameterTypes":["java.lang.Object"] }, 
    {"name":"getbit","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"getrange","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"getset","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"hdel","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"hexists","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"hget","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"hgetall","parameterTypes":["io.lettuce.core.output.KeyValueStreamingChannel","java.lang.Object"] }, 
    {"name":"hgetall","parameterTypes":["java.lang.Object"] }, 
    {"name":"hincrby","parameterTypes":["java.lang.Object","java.lang.Object","long"] }, 
    {"name":"hincrbyfloat","parameterTypes":["java.lang.Object","java.lang.Object","double"] }, 
    {"name":"hkeys","parameterTypes":["io.lettuce.core.output.KeyStreamingChannel","java.lang.Object"] }, 
    {"name":"hkeys","parameterTypes":["java.lang.Object"] }, 
    {"name":"hlen","parameterTypes":["java.lang.Object"] }, 
    {"name":"hmget","parameterTypes":["io.lettuce.core.output.KeyValueStreamingChannel","java.lang.Object","java.lang.Object[]"] }, 
    {"name":"hmget","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"hmset","parameterTypes":["java.lang.Object","java.util.Map"] }, 
    {"name":"hscan","parameterTypes":["io.lettuce.core.output.KeyValueStreamingChannel","java.lang.Object"] }, 
    {"name":"hscan","parameterTypes":["io.lettuce.core.output.KeyValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanArgs"] }, 
    {"name":"hscan","parameterTypes":["io.lettuce.core.output.KeyValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanCursor"] }, 
    {"name":"hscan","parameterTypes":["io.lettuce.core.output.KeyValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"hscan","parameterTypes":["java.lang.Object"] }, 
    {"name":"hscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanArgs"] }, 
    {"name":"hscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanCursor"] }, 
    {"name":"hscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"hset","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object"] }, 
    {"name":"hsetnx","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object"] }, 
    {"name":"hstrlen","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"hvals","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object"] }, 
    {"name":"hvals","parameterTypes":["java.lang.Object"] }, 
    {"name":"incr","parameterTypes":["java.lang.Object"] }, 
    {"name":"incrby","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"incrbyfloat","parameterTypes":["java.lang.Object","double"] }, 
    {"name":"info","parameterTypes":[] }, 
    {"name":"info","parameterTypes":["java.lang.String"] }, 
    {"name":"isOpen","parameterTypes":[] }, 
    {"name":"keys","parameterTypes":["io.lettuce.core.output.KeyStreamingChannel","java.lang.Object"] }, 
    {"name":"keys","parameterTypes":["java.lang.Object"] }, 
    {"name":"lastsave","parameterTypes":[] }, 
    {"name":"lindex","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"linsert","parameterTypes":["java.lang.Object","boolean","java.lang.Object","java.lang.Object"] }, 
    {"name":"llen","parameterTypes":["java.lang.Object"] }, 
    {"name":"lpop","parameterTypes":["java.lang.Object"] }, 
    {"name":"lpush","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"lpushx","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"lrange","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","long","long"] }, 
    {"name":"lrange","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"lrem","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, 
    {"name":"lset","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, 
    {"name":"ltrim","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"mget","parameterTypes":["io.lettuce.core.output.KeyValueStreamingChannel","java.lang.Object[]"] }, 
    {"name":"mget","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"migrate","parameterTypes":["java.lang.String","int","int","long","io.lettuce.core.MigrateArgs"] }, 
    {"name":"migrate","parameterTypes":["java.lang.String","int","java.lang.Object","int","long"] }, 
    {"name":"move","parameterTypes":["java.lang.Object","int"] }, 
    {"name":"mset","parameterTypes":["java.util.Map"] }, 
    {"name":"msetnx","parameterTypes":["java.util.Map"] }, 
    {"name":"multi","parameterTypes":[] }, 
    {"name":"objectEncoding","parameterTypes":["java.lang.Object"] }, 
    {"name":"objectIdletime","parameterTypes":["java.lang.Object"] }, 
    {"name":"objectRefcount","parameterTypes":["java.lang.Object"] }, 
    {"name":"persist","parameterTypes":["java.lang.Object"] }, 
    {"name":"pexpire","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"pexpireat","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"pexpireat","parameterTypes":["java.lang.Object","java.util.Date"] }, 
    {"name":"pfadd","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"pfcount","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"pfmerge","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"ping","parameterTypes":[] }, 
    {"name":"psetex","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, 
    {"name":"pttl","parameterTypes":["java.lang.Object"] }, 
    {"name":"publish","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"pubsubChannels","parameterTypes":[] }, 
    {"name":"pubsubChannels","parameterTypes":["java.lang.Object"] }, 
    {"name":"pubsubNumpat","parameterTypes":[] }, 
    {"name":"pubsubNumsub","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"quit","parameterTypes":[] }, 
    {"name":"randomkey","parameterTypes":[] }, 
    {"name":"readOnly","parameterTypes":[] }, 
    {"name":"readWrite","parameterTypes":[] }, 
    {"name":"rename","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"renamenx","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"reset","parameterTypes":[] }, 
    {"name":"restore","parameterTypes":["java.lang.Object","long","byte[]"] }, 
    {"name":"restore","parameterTypes":["java.lang.Object","byte[]","io.lettuce.core.RestoreArgs"] }, 
    {"name":"role","parameterTypes":[] }, 
    {"name":"rpop","parameterTypes":["java.lang.Object"] }, 
    {"name":"rpoplpush","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"rpush","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"rpushx","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"sadd","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"save","parameterTypes":[] }, 
    {"name":"scan","parameterTypes":[] }, 
    {"name":"scan","parameterTypes":["io.lettuce.core.ScanArgs"] }, 
    {"name":"scan","parameterTypes":["io.lettuce.core.ScanCursor"] }, 
    {"name":"scan","parameterTypes":["io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"scan","parameterTypes":["io.lettuce.core.output.KeyStreamingChannel"] }, 
    {"name":"scan","parameterTypes":["io.lettuce.core.output.KeyStreamingChannel","io.lettuce.core.ScanArgs"] }, 
    {"name":"scan","parameterTypes":["io.lettuce.core.output.KeyStreamingChannel","io.lettuce.core.ScanCursor"] }, 
    {"name":"scan","parameterTypes":["io.lettuce.core.output.KeyStreamingChannel","io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"scard","parameterTypes":["java.lang.Object"] }, 
    {"name":"scriptExists","parameterTypes":["java.lang.String[]"] }, 
    {"name":"scriptFlush","parameterTypes":[] }, 
    {"name":"scriptKill","parameterTypes":[] }, 
    {"name":"scriptLoad","parameterTypes":["java.lang.Object"] }, 
    {"name":"sdiff","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object[]"] }, 
    {"name":"sdiff","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"sdiffstore","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"select","parameterTypes":["int"] }, 
    {"name":"set","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"set","parameterTypes":["java.lang.Object","java.lang.Object","io.lettuce.core.SetArgs"] }, 
    {"name":"setTimeout","parameterTypes":["long","java.util.concurrent.TimeUnit"] }, 
    {"name":"setTimeout","parameterTypes":["java.time.Duration"] }, 
    {"name":"setbit","parameterTypes":["java.lang.Object","long","int"] }, 
    {"name":"setex","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, 
    {"name":"setnx","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"setrange","parameterTypes":["java.lang.Object","long","java.lang.Object"] }, 
    {"name":"shutdown","parameterTypes":["boolean"] }, 
    {"name":"sinter","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object[]"] }, 
    {"name":"sinter","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"sinterstore","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"sismember","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"slaveof","parameterTypes":["java.lang.String","int"] }, 
    {"name":"slaveofNoOne","parameterTypes":[] }, 
    {"name":"slowlogGet","parameterTypes":[] }, 
    {"name":"slowlogGet","parameterTypes":["int"] }, 
    {"name":"slowlogLen","parameterTypes":[] }, 
    {"name":"slowlogReset","parameterTypes":[] }, 
    {"name":"smembers","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object"] }, 
    {"name":"smembers","parameterTypes":["java.lang.Object"] }, 
    {"name":"smove","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.Object"] }, 
    {"name":"sort","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object"] }, 
    {"name":"sort","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.SortArgs"] }, 
    {"name":"sort","parameterTypes":["java.lang.Object"] }, 
    {"name":"sort","parameterTypes":["java.lang.Object","io.lettuce.core.SortArgs"] }, 
    {"name":"sortStore","parameterTypes":["java.lang.Object","io.lettuce.core.SortArgs","java.lang.Object"] }, 
    {"name":"spop","parameterTypes":["java.lang.Object"] }, 
    {"name":"spop","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"srandmember","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","long"] }, 
    {"name":"srandmember","parameterTypes":["java.lang.Object"] }, 
    {"name":"srandmember","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"srem","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"sscan","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object"] }, 
    {"name":"sscan","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanArgs"] }, 
    {"name":"sscan","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanCursor"] }, 
    {"name":"sscan","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"sscan","parameterTypes":["java.lang.Object"] }, 
    {"name":"sscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanArgs"] }, 
    {"name":"sscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanCursor"] }, 
    {"name":"sscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"strlen","parameterTypes":["java.lang.Object"] }, 
    {"name":"sunion","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object[]"] }, 
    {"name":"sunion","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"sunionstore","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"swapdb","parameterTypes":["int","int"] }, 
    {"name":"time","parameterTypes":[] }, 
    {"name":"touch","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"ttl","parameterTypes":["java.lang.Object"] }, 
    {"name":"type","parameterTypes":["java.lang.Object"] }, 
    {"name":"unlink","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"unwatch","parameterTypes":[] }, 
    {"name":"waitForReplication","parameterTypes":["int","long"] }, 
    {"name":"watch","parameterTypes":["java.lang.Object[]"] }, 
    {"name":"xack","parameterTypes":["java.lang.Object","java.lang.Object","java.lang.String[]"] }, 
    {"name":"xadd","parameterTypes":["java.lang.Object","io.lettuce.core.XAddArgs","java.util.Map"] }, 
    {"name":"xadd","parameterTypes":["java.lang.Object","io.lettuce.core.XAddArgs","java.lang.Object[]"] }, 
    {"name":"xadd","parameterTypes":["java.lang.Object","java.util.Map"] }, 
    {"name":"xadd","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"xclaim","parameterTypes":["java.lang.Object","io.lettuce.core.Consumer","long","java.lang.String[]"] }, 
    {"name":"xclaim","parameterTypes":["java.lang.Object","io.lettuce.core.Consumer","io.lettuce.core.XClaimArgs","java.lang.String[]"] }, 
    {"name":"xdel","parameterTypes":["java.lang.Object","java.lang.String[]"] }, 
    {"name":"xgroupCreate","parameterTypes":["io.lettuce.core.XReadArgs$StreamOffset","java.lang.Object"] }, 
    {"name":"xgroupDelconsumer","parameterTypes":["java.lang.Object","io.lettuce.core.Consumer"] }, 
    {"name":"xgroupDestroy","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"xgroupSetid","parameterTypes":["io.lettuce.core.XReadArgs$StreamOffset","java.lang.Object"] }, 
    {"name":"xlen","parameterTypes":["java.lang.Object"] }, 
    {"name":"xpending","parameterTypes":["java.lang.Object","io.lettuce.core.Consumer","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"xpending","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"xpending","parameterTypes":["java.lang.Object","java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"xrange","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"xrange","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"xread","parameterTypes":["io.lettuce.core.XReadArgs","io.lettuce.core.XReadArgs$StreamOffset[]"] }, 
    {"name":"xread","parameterTypes":["io.lettuce.core.XReadArgs$StreamOffset[]"] }, 
    {"name":"xreadgroup","parameterTypes":["io.lettuce.core.Consumer","io.lettuce.core.XReadArgs","io.lettuce.core.XReadArgs$StreamOffset[]"] }, 
    {"name":"xreadgroup","parameterTypes":["io.lettuce.core.Consumer","io.lettuce.core.XReadArgs$StreamOffset[]"] }, 
    {"name":"xrevrange","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"xrevrange","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"xtrim","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"xtrim","parameterTypes":["java.lang.Object","boolean","long"] }, 
    {"name":"zadd","parameterTypes":["java.lang.Object","double","java.lang.Object"] }, 
    {"name":"zadd","parameterTypes":["java.lang.Object","io.lettuce.core.ZAddArgs","double","java.lang.Object"] }, 
    {"name":"zadd","parameterTypes":["java.lang.Object","io.lettuce.core.ZAddArgs","io.lettuce.core.ScoredValue[]"] }, 
    {"name":"zadd","parameterTypes":["java.lang.Object","io.lettuce.core.ZAddArgs","java.lang.Object[]"] }, 
    {"name":"zadd","parameterTypes":["java.lang.Object","io.lettuce.core.ScoredValue[]"] }, 
    {"name":"zadd","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"zaddincr","parameterTypes":["java.lang.Object","double","java.lang.Object"] }, 
    {"name":"zaddincr","parameterTypes":["java.lang.Object","io.lettuce.core.ZAddArgs","double","java.lang.Object"] }, 
    {"name":"zcard","parameterTypes":["java.lang.Object"] }, 
    {"name":"zcount","parameterTypes":["java.lang.Object","double","double"] }, 
    {"name":"zcount","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zcount","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zincrby","parameterTypes":["java.lang.Object","double","java.lang.Object"] }, 
    {"name":"zinterstore","parameterTypes":["java.lang.Object","io.lettuce.core.ZStoreArgs","java.lang.Object[]"] }, 
    {"name":"zinterstore","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"zlexcount","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zlexcount","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zpopmax","parameterTypes":["java.lang.Object"] }, 
    {"name":"zpopmax","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"zpopmin","parameterTypes":["java.lang.Object"] }, 
    {"name":"zpopmin","parameterTypes":["java.lang.Object","long"] }, 
    {"name":"zrange","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","long","long"] }, 
    {"name":"zrange","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"zrangeWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","long","long"] }, 
    {"name":"zrangeWithScores","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"zrangebylex","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrangebylex","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrangebylex","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrangebylex","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","double","double"] }, 
    {"name":"zrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","double","double","long","long"] }, 
    {"name":"zrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrangebyscore","parameterTypes":["java.lang.Object","double","double"] }, 
    {"name":"zrangebyscore","parameterTypes":["java.lang.Object","double","double","long","long"] }, 
    {"name":"zrangebyscore","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrangebyscore","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrangebyscore","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrangebyscore","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","double","double"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","double","double","long","long"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["java.lang.Object","double","double"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["java.lang.Object","double","double","long","long"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrangebyscoreWithScores","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrank","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"zrem","parameterTypes":["java.lang.Object","java.lang.Object[]"] }, 
    {"name":"zremrangebylex","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zremrangebylex","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zremrangebyrank","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"zremrangebyscore","parameterTypes":["java.lang.Object","double","double"] }, 
    {"name":"zremrangebyscore","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zremrangebyscore","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrevrange","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","long","long"] }, 
    {"name":"zrevrange","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"zrevrangeWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","long","long"] }, 
    {"name":"zrevrangeWithScores","parameterTypes":["java.lang.Object","long","long"] }, 
    {"name":"zrevrangebylex","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrevrangebylex","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","double","double"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","double","double","long","long"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["io.lettuce.core.output.ValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["java.lang.Object","double","double"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["java.lang.Object","double","double","long","long"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrevrangebyscore","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","double","double"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","double","double","long","long"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["java.lang.Object","double","double"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["java.lang.Object","double","double","long","long"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["java.lang.Object","io.lettuce.core.Range"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["java.lang.Object","io.lettuce.core.Range","io.lettuce.core.Limit"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String"] }, 
    {"name":"zrevrangebyscoreWithScores","parameterTypes":["java.lang.Object","java.lang.String","java.lang.String","long","long"] }, 
    {"name":"zrevrank","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"zscan","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object"] }, 
    {"name":"zscan","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanArgs"] }, 
    {"name":"zscan","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanCursor"] }, 
    {"name":"zscan","parameterTypes":["io.lettuce.core.output.ScoredValueStreamingChannel","java.lang.Object","io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"zscan","parameterTypes":["java.lang.Object"] }, 
    {"name":"zscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanArgs"] }, 
    {"name":"zscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanCursor"] }, 
    {"name":"zscan","parameterTypes":["java.lang.Object","io.lettuce.core.ScanCursor","io.lettuce.core.ScanArgs"] }, 
    {"name":"zscore","parameterTypes":["java.lang.Object","java.lang.Object"] }, 
    {"name":"zunionstore","parameterTypes":["java.lang.Object","io.lettuce.core.ZStoreArgs","java.lang.Object[]"] }, 
    {"name":"zunionstore","parameterTypes":["java.lang.Object","java.lang.Object[]"] }
  ]
},
{
  "name":"io.lettuce.core.RedisAsyncCommandsImpl",
  "methods":[{"name":"getStatefulConnection","parameterTypes":[] }]
},
{
  "name":"io.lettuce.core.api.sync.BaseRedisCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisGeoCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisHLLCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisHashCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisKeyCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisListCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisScriptingCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisServerCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisSetCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisSortedSetCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisStreamCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisStringCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.api.sync.RedisTransactionalCommands",
  "allDeclaredMethods":true
},
{
  "name":"io.lettuce.core.cluster.api.sync.RedisClusterCommands",
  "allDeclaredMethods":true
},

...

working with native compile.

BR,

Alfred

@alfsch Yes, I suspect we鈥檒l have to register some classes for reflection for things to work out of the box in native image. The extension will handle all that and more (CDI, configuration) as I suggested.

Hi @emmanuelbernard I'll be interested to work on this :-)

I have been giving this a thought and here are some early ideas that I have: In terms of design, the quarkus-mailer client is an inspiration - so I am thinking of having an extensions which will offer a blocking redis-client, a reactive one, and a mocked one for tests (?).

I have been thinking to use https://lettuce.io as an underlying library. @emmanuelbernard @gsmet WDYT? Any other design ideas?

I may start experiment some ideas midweek.

I have not dived but this sounds good.

I have opened a PR here https://github.com/quarkusio/quarkus/pull/4882, chim in and give your feedback.

Since the PR of @machi1990 has been closed again: Is there any progress on this extension?

Or maybe, can someone (@pmlopes?) outline how one would use the vert.x redis client with quarkus (including native builds)?

Thanks + BR

@andreas-eberle I don't have experience with writing extensions, what I can say is that if you create a bean injecting the vertx instance you can use the vertx api. Since the vertx redis client uses no reflection or features incompatible with graalvm native images it will work on native too.

Be aware that redis has been total rewrote for 4.0 and that's where all features, sentinel/cluster support exists.

Hi @andreas-eberle @pmlopes I'll work on this extension and be able to make progress on it once I am back from vacations (in a week time from now).

Hey @machi1990 I am planning the roadmap for the next 3-6 months, do you feel you will achieve this by then?

Hey @emmanuelbernard , we'd need a 4.0 Vertx release to be able to offer cluster support if I am not mistaken cc @pmlopes

Otherwise I have all the ground work here https://github.com/quarkusio/quarkus/compare/master...machi1990:feat/vertx-redis-extension

The 4.0 client has been backported to 3.9.0 so when a 3.9 release happens all new features will be available.

@pmlopes Good to know, do we know when that would be?

@cescoffier @vietj do you see Vert.x 3.9.x be used in a Quarkus release in the next 3-6 months? I assume yes so @machi1990 that could be a reasonable expectation

Yes, it is a very reasonable expectation. Let's set the target on that timeline.

@machi1990 do you perhaps want any help on this?

@geoand thanks for the ping, I've been a bit busy the last couple of weeks with limited time to work on this. But I have a solid base here https://github.com/machi1990/quarkus/tree/feat/vertx-redis-extension - everything is working, including native but I am just missing some documentation. Planned to allocate some time end of next week to work on this.

Thanks great! Let me know if you need / us to jump in anywhere :)

Cool. Thanks @geoand

Hey @machi1990, when do you expect this to land in master? End of june, end of july, end of... Trying to assign it to a version but with flexibility to move out as needed.

Hey @emmanuelbernard, I have opened a PR #9370 which is current under review. As for the version, we can aim for 1.6, which should be end of June (If my timing is okay).

:100: :+1:

@machi1990 Thanks for your great work! One additional question is: how to config the connection pool for the redis client?

@stevenhailin thank you!

@machi1990 One additional question is: how to config the connection pool for the redis client?

The initial version of the extension will use the default options, we'll be adding advanced configuration options gradually. I'll open up a followup PR to allow configuring connection pool.

@machi1990 Thanks for this extension!

Can multiple redis clients be configured similar to https://quarkus.io/guides/datasource#multiple-datasources? If not, are there any plans to support this or should I create an issue?

Thanks!

@machi1990 Thanks for this extension!

Can multiple redis clients be configured similar to https://quarkus.io/guides/datasource#multiple-datasources? If not, are there any plans to support this or should I create an issue?

Thanks!

Hi @xtaixe , this is not supported yet. Thanks for opening an issue for that.

Was this page helpful?
0 / 5 - 0 ratings