Redis
 sql >> база данни >  >> NoSQL >> Redis

Използване на jedis как да пишете в конкретен слот/възел в редис клъстер

Решение 1:
Намерих решение за идентифициране на слота, в който ще влизат ключовете. JedisCluster има някои API, за да го получи.

int slotNum = JedisClusterCRC16.getSlot(key); - Предоставя номера на слота на ключа.

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

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

Jedis jedis = connHandler.getConnectionFromSlot(slotNum);

Това осигурява обекта jedis (от Jedispool вътрешно) за конкретния възел в клъстера.
Сега с горния обект jedis всички команди могат лесно да бъдат конвейерирани за конкретния възел (в клъстер)

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

Въпреки че този подход (с JedisCluster) даде подходящия възел, към който ключовете отиват, това не ми осигури очакваната производителност, мисля, че се дължи на процедурата, свързана с познаването на номера на слота и възела (на слота).
Горната процедура изглежда установява физическа връзка с възела (в клъстер) всеки път, когато се опитаме да получим действителния възел (jedis), който съдържа номера на слота. Така че това пречи на производителността, в случай че имаме милиони ключове.
И така, друг подход (по-долу), използващ пакета Lettuce, ми помогна да преодолея това.

Решение 2:
Използва се пакет маруля, който поддържа изпращане на пакет от команди в клъстерен режим.

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

Кодов фрагмент:

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()]));

Препратка:https://github.com/lettuce-io/lettuce-core/wiki/Pipeling-and-command-flushing



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis срещу MongoDB:Сравняване на бази данни в паметта с Percona Memory Engine

  2. ModuleNotFoundError:Няма модул с име 'grp' на Windows

  3. По-бързият метод за преместване на Redis данни в MySQL

  4. redis за регистриране

  5. Как да търсите стойност на съдържанието в redis от BookSleeve