sql >> Database >  >> NoSQL >> Redis

Jedis gebruiken om naar een specifiek slot / knooppunt in redis-cluster te schrijven

Oplossing 1:
Een oplossing gevonden om de gleuf te identificeren waar de sleutels in zouden gaan. JedisCluster heeft een aantal API's om het te krijgen.

int slotNum = JedisClusterCRC16.getSlot(key); - Geeft het slotnummer van de sleutel.

Set<HostAndPort> redisClusterNode = new HashSet<HostAndPort>();
redisClusterNode.add(new HostAndPort(hostItem, port));

JedisSlotBasedConnectionHandler connHandler = new 
              JedisSlotBasedConnectionHandler(redisClusterNode, poolConfig, 60);

Jedis jedis = connHandler.getConnectionFromSlot(slotNum);

Dit levert het jedis-object (intern van Jedispool) voor het specifieke knooppunt in het cluster.
Met het bovenstaande jedis-object kunnen alle opdrachten eenvoudig worden gepipelined voor het specifieke knooppunt (in cluster)

Pipeline pipeline = jedis.pipelined();
pipeline.multi();
for(Entry<String, Map<String, String>> kvf : kvfs.entrySet()) {
   pipeline.hmset(kvf.getKey(), kvf.getValue());
}
pipeline.exec();

Ondanks dat deze aanpak (met JedisCluster) het juiste knooppunt gaf waar de sleutels naartoe gaan, leverde dit me niet de verwachte prestaties op, ik denk dat dit te wijten is aan de procedure die betrokken is bij het kennen van het slotnummer en knooppunt (van het slot).
De bovenstaande procedure lijkt een fysieke verbinding tot stand te brengen met het knooppunt (in cluster) elke keer dat we proberen het werkelijke knooppunt (jedis) te krijgen dat het slotnummer bevat. Dit belemmert dus de prestaties voor het geval we miljoenen sleutels hebben.
Dus, een andere benadering (hieronder) met behulp van het Lettuce-pakket heeft me geholpen dit te overwinnen.

Oplossing 2:
Gebruikt Lettuce-pakket dat het verzenden van een reeks opdrachten in clustermodus ondersteunt.

     <groupId>biz.paluch.redis</groupId>
     <artifactId>lettuce</artifactId>
     <version>4.4.3.Final</version>

Codefragment:

RedisClusterClient client = RedisClusterClient.create(RedisURI.create("hostname", "port"));
StatefulRedisClusterConnection<String, String> connection = client.connect();

RedisAdvancedClusterAsyncCommands<String, String> commands = connection.async();
// Disabling auto-flushing
commands.setAutoFlushCommands(false);

List<RedisFuture<?>> futures = new ArrayList<>();
// kvf is of type Map<String, Map<String, String>>
for (Entry<> e : kvf.entrySet())
{
   futures.add(commands.hmset( (String) e.getKey(), (Map<String, String>) e.getValue()));
}
// write all commands to the transport layer
commands.flushCommands();
// synchronization example: Wait until all futures complete
LettuceFutures.awaitAll(10, TimeUnit.SECONDS,
futures.toArray(new RedisFuture[futures.size()]));

Ref:https://github.com/lettuce-io/lettuce-core/wiki/Pipelining-and-command-flushing



  1. Mongodb match tekens met accenten als onderliggend teken

  2. MongoDB $atan2

  3. Aan de slag met Cloudera Data Platform Operational Database (COD)

  4. Wat is de beste manier om datums op te slaan in MongoDB?