sql >> Databáze >  >> NoSQL >> Redis

Použití jedis, jak zapisovat do konkrétního slotu/uzlu v clusteru redis

Řešení 1:
Našli jsme řešení, jak identifikovat slot, do kterého jdou klíče. JedisCluster má k jeho získání několik rozhraní API.

int slotNum = JedisClusterCRC16.getSlot(key); - Poskytuje číslo slotu klíče.

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

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

Jedis jedis = connHandler.getConnectionFromSlot(slotNum);

To poskytuje objekt jedis (interně z Jedispool) pro konkrétní uzel v clusteru.
Nyní s výše uvedeným objektem jedis mohou být všechny příkazy snadno zřetězeny pro konkrétní uzel (v clusteru)

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

Navzdory tomuto přístupu (s JedisCluster) poskytl příslušný uzel, ke kterému klíče jdou, toto mi neposkytlo očekávaný výkon, myslím si, že je to způsobeno postupem spojeným se znalostí čísla slotu a uzlu (slotu).
Zdá se, že výše uvedený postup vytváří fyzické připojení k uzlu (v clusteru) pokaždé, když se snažíme získat skutečný uzel (jedis), který obsahuje číslo slotu. Takže to brzdí výkon v případě, že máme miliony klíčů.
Takže jiný přístup (níže) používající balíček salátu mi pomohl překonat toto.

Řešení 2:
Použitý balíček Lettuce, který podporuje odesílání dávky příkazů v režimu clusteru.

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

Fragment kódu:

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. Použijte více než jedno schéma na kolekci na mongodb

  2. Mongodb Agregation Framework | Seskupit více hodnot?

  3. Jak používat Redis hashe

  4. Počítejte pole v kolekci MongoDB