Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Menggunakan jedis cara menulis ke slot/node tertentu di redis cluster

Solusi 1:
Menemukan solusi untuk mengidentifikasi slot tempat kunci akan masuk. JedisCluster memiliki beberapa API untuk mendapatkannya.

int slotNum = JedisClusterCRC16.getSlot(key); - Memberikan nomor slot kunci.

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

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

Jedis jedis = connHandler.getConnectionFromSlot(slotNum);

Ini menyediakan objek jedis (dari Jedispool secara internal) untuk node tertentu dalam cluster.
Sekarang dengan objek jedis di atas semua perintah dapat dengan mudah disalurkan untuk node tertentu (dalam cluster)

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

Meskipun pendekatan ini (dengan JedisCluster) memberikan simpul yang sesuai ke mana kuncinya pergi, ini tidak memberi saya kinerja yang diharapkan, saya pikir itu karena prosedur yang terlibat dalam mengetahui nomor slot dan simpul (slot).
Prosedur di atas tampaknya membuat koneksi fisik ke node (dalam cluster) setiap kali kita mencoba untuk mendapatkan node aktual (jedis) yang berisi nomor slot. Jadi, ini menghambat kinerja jika kita memiliki jutaan kunci.
Jadi, pendekatan lain (di bawah) menggunakan paket Selada membantu saya mengatasi ini.

Solusi 2:
Paket Selada yang digunakan yang mendukung pengiriman batch perintah dalam mode cluster.

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

Cuplikan kode:

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. Socket.io, Redis Store, dan IE

  2. Menjalankan banyak instance Redis di Centos

  3. Pelengkapan otomatis ulang

  4. Bagaimana Saya Bisa Menelusuri/Melihat Nilai yang Tersimpan di Redis

  5. StackExchange.Redis dengan Azure Redis sangat lambat atau menimbulkan kesalahan batas waktu