2016-02-24 48 views
2

我做Spring Redis,我把鑰匙作爲春Redis的哈希運算SCAN

redistemplate.opsForHash().put("Customer", Customer.class, List<Customers>) 

我想從List<>搜索,

ScanOptions options = ScanOptions.scanOptions().match(pattern).count(1).build(); 

Cursor<Entry<Object, Object>> keys = redistemplate.opsForHash().scan("Customer", options); 

也不能正常工作。請幫忙!!

+0

可以通過使用ScanOptions.NONE – Persia

+0

ScanOptions.NONE作品,但一切都取不匹配的模式獲取數據。 – ashK

+0

你的模式是什麼 – Persia

回答

2

首先,掃描操作與keye匹配的值不匹配。 當使用散列存儲值時,它應該如下所示: 因此,Redis記錄的實際密鑰是key(您可以使用它來獲取散列)。 keyInsideHash是您需要存儲的實際價值的關鍵。所以首先得到散列,然後從中獲取值。例如:redisTemplate.opsForHash().put("customerKey1", "FirstName", "MyFirstName");redisTemplate.opsForHash().put("customerKey1", "LastName", "MyLastName");。在這個例子中,我們存儲在與密鑰"customerKey1"兩個條目["FirstName","MyFirstName"]["LastName", "MyLastName"]相同的散列。 在你的情況下,你有一個列表而不是"MyFirstName"。 如果您需要掃描一個Hash,你做如下(掃描哈希裏面的鑰匙不是值):

saveToDbCacheRedisTemplate.execute(new RedisCallback<List<String>>() { 

      @Override 
      public List<String> doInRedis(RedisConnection connection) throws DataAccessException { 
       ScanOptions options = ScanOptions.scanOptions().match("pattern").count(1).build();; 
       Cursor<Entry<byte[], byte[]>> entries = connection.hScan("customerKey1".getBytes(), options); 
       List<String> result = new ArrayList<String>(); 
       if(entries!=null) 
        while(entries.hasNext()){ 
         Entry<byte[], byte[]> entry = entries.next(); 
         byte[] actualValue = entry.getValue(); 
         result.add(new String(actualValue)); 
        } 

       return result; 
      } 

     }); 
+0

所以內布拉斯,我沒有辦法掃描數值? 。 我已經存儲了這樣的鑰匙, redistemplate.opsForHash()把( 「客戶」,Customer.class,列表); 當我嘗試, hscan客戶0匹配*自定義* 我看到值正在提取。 – ashK

+0

我的要求是將數十億條記錄存儲在Redis中,並根據用戶希望獲取它,用戶可以執行搜索,對每列進行排序等,在Redis中可能嗎?我使用java加載到Redis中,所以我無法一次加載一百萬條記錄,我必須將百萬條記錄分成100000個密鑰,每個記錄100條記錄並存儲。如果我這樣保存,是否可以搜索/排序? – ashK

+0

我將hash改爲 keyHash = getString(來自DB的數據); (「Customer」,keyHash,getString(來自DB的數據)); 我曾嘗試光標<條目<字節[],字節[] >>鍵= redistemplate.getConnectionFactory()的getConnection()HSCAN( 「客戶」 .getBytes(),選項)。。 它仍然沒有獲取模式。 – ashK

0

我碰到這個問題走到今天,我發現我的Redis的服務器版本 redis_version:2.6.16 ,並且redis.io表示該命令自2.8.0開始可用。參見:https://redis.io/commands/scan

希望能幫到你!