Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

जेडिस का उपयोग रेडिस क्लस्टर में एक विशिष्ट स्लॉट/नोड को कैसे लिखना है

समाधान 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);

यह क्लस्टर में विशिष्ट नोड के लिए जेडिस ऑब्जेक्ट (आंतरिक रूप से जेडिसपूल से) प्रदान करता है।
अब उपरोक्त जेडिस ऑब्जेक्ट के साथ सभी कमांड को विशिष्ट नोड (क्लस्टर में) के लिए आसानी से पाइपलाइन किया जा सकता है

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

इस दृष्टिकोण के बावजूद (जेडिसक्लस्टर के साथ) ने उपयुक्त नोड दिया, जिस पर जाने वाली चाबियों ने मुझे अपेक्षित प्रदर्शन प्रदान नहीं किया, मुझे लगता है कि यह स्लॉट संख्या और नोड (स्लॉट के) को जानने में शामिल प्रक्रिया के कारण है।
उपरोक्त प्रक्रिया हर बार जब हम स्लॉट संख्या वाले वास्तविक नोड (जेडिस) को प्राप्त करने का प्रयास करते हैं तो नोड (क्लस्टर में) के लिए एक भौतिक कनेक्शन स्थापित करने लगता है। इसलिए, यह प्रदर्शन में बाधा डालता है अगर हमारे पास लाखों चाबियां हैं।
तो, लेट्यूस पैकेज का उपयोग करने वाले एक अन्य दृष्टिकोण (नीचे) ने मुझे इस पर काबू पाने में मदद की।

समाधान 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. Azure Redis कैश - GET कॉल पर टाइमआउट

  2. Redis सर्वर 1024M मैक्सहेप से अधिक नहीं चल सकता

  3. त्रुटि:रेडिस पर रेडिस से कनेक्ट नहीं हो सका:6379:नाम या सेवा ज्ञात नहीं है

  4. हेरोकू पर रेडिस्टोगो और साइडकीक:कनेक्ट नहीं हो सकता

  5. रेडिस में मेमोरी> 'मैक्समेमोरी' का उपयोग करते समय त्रुटि ओओएम कमांड की अनुमति नहीं है?