Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Korzystanie z jedis, jak pisać do określonego gniazda/węzła w klastrze redis

Rozwiązanie 1:
Znaleziono rozwiązanie pozwalające zidentyfikować gniazdo, do którego trafiałyby klucze. JedisCluster ma kilka interfejsów API, aby to uzyskać.

int slotNum = JedisClusterCRC16.getSlot(key); - Podaje numer gniazda klucza.

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

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

Jedis jedis = connHandler.getConnectionFromSlot(slotNum);

Zapewnia to obiekt jedis (wewnętrznie z Jedispool) dla określonego węzła w klastrze.
Teraz dzięki powyższemu obiektowi jedis wszystkie polecenia mogą być łatwo przesyłane strumieniowo dla określonego węzła (w klastrze)

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

Pomimo tego podejścia (z JedisClusterem) podanie odpowiedniego węzła, do którego trafiają klucze, nie zapewniło mi oczekiwanej wydajności, myślę, że wynika to z procedury związanej z poznaniem numeru slotu i węzła (slotu).
Powyższa procedura wydaje się ustanawiać fizyczne połączenie z węzłem (w klastrze) za każdym razem, gdy próbujemy uzyskać rzeczywisty węzeł (jedis), który zawiera numer gniazda. To utrudnia wydajność w przypadku, gdy mamy miliony kluczy.
Więc inne podejście (poniżej) przy użyciu pakietu Lettuce pomogło mi to przezwyciężyć.

Rozwiązanie 2:
Używany pakiet Lettuce, który obsługuje wysyłanie partii poleceń w trybie klastra.

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

Fragment kodu:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Problem z połączeniem Docker compose spring boot redis

  2. Czy można redis potokować wiele poleceń, które zależą od poprzednich?

  3. Otrzymuję błąd Nie znaleziono klasy „Predis\Client” w Laravel 5.2

  4. Zwracanie wartości z funkcji asynchronicznej node.js

  5. Gdzie jest katalog danych w Redis?