Redisのすべてのキー値ペアを取得

37636 ワード

Redisコマンドレベル実装:
SCAN cursor [MATCH pattern] [COUNT count]

Spring-Data-Redis実装:
@Override
    public List<Map<Object, Object>> getAllRedisVal1() {

        List<Map<Object, Object>> list = new ArrayList<>();
        //key("*")      
        Set<String> keys = redisTemplate.keys("*");

        for (String key : keys) {
            HashMap<Object, Object> map = new HashMap<>();
            //String       
            if(redisTemplate.type(key).code()=="string") {
                Object value = redisTemplate.opsForValue().get(key);

                map.put("key", key);
                map.put("value", value);
                list.add(map);
            }
            //zset       
            if(redisTemplate.type(key).code()=="zset"){
                Object value=redisTemplate.opsForZSet().range(key,0,-1);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            }
            //set       
            if(redisTemplate.type(key).code()=="set"){
                Object value=redisTemplate.opsForZSet().range(key,0,-1);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            }
            //list       
            if(redisTemplate.type(key).code()=="list"){
                Object value=redisTemplate.opsForZSet().range(key,0,-1);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            }
            //hash       
            if(redisTemplate.type(key).code()=="hash"){
                Object value=redisTemplate.opsForZSet().range(key,0,-1);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            }
        }

        return list;
    }

keys(「*」)のシナリオを改善するには、次の手順に従います.
@Override
    public List<Map<Object, Object>> getAllRedisVal2(Integer pageSize, Integer pageNumber) {
        List<Map<Object, Object>> list = new ArrayList<>();
        int startIndex=pageSize*(pageNumber-1)+1;
        //  scan   
        Map<Object,Object> result = (Map<Object, Object>) redisTemplate.execute(new RedisCallback() {
            @Nullable
            @Override
            public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
                Cursor<byte[]> results = redisConnection.scan(new ScanOptions.ScanOptionsBuilder().match("*").build());
                List<String> keys = new LinkedList<>();
                Map<Object,Object> map=new HashMap<>();
                try {
                    int index = 0;
                    while (results.hasNext()) {

                        if(startIndex<=index&&index<pageSize+startIndex) {
                            keys.add(new String(results.next(), "UTF-8"));
                        }
                        else results.next();
                        index++;
                    }
                    map.put("count",index);
                    map.put("keys",keys);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                return map;
            }
        });
        List<String> keys= (List<String>) result.get("keys");
        for (String key : keys) {
            HashMap<Object, Object> map = new HashMap<>();
            if (redisTemplate.type(key).code() == "string") {
                Object value = redisTemplate.opsForValue().get(key);

                map.put("key", key);
                map.put("value", value);
                list.add(map);
            } else if (redisTemplate.type(key).code() == "zset") {
                Object value = redisTemplate.opsForZSet().range(key, 0, -1);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            } else if (redisTemplate.type(key).code() == "set") {
                Object value = redisTemplate.opsForSet().members(key);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            } else if (redisTemplate.type(key).code() == "list") {
                Object value = redisTemplate.opsForList().range(key, 0, -1);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            } else if (redisTemplate.type(key).code() == "hash") {
                Object value = redisTemplate.opsForHash().entries(key);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            }
            else if(redisTemplate.type(key).code()=="none"){
                Object value = redisTemplate.opsForHash().entries(key);
                map.put("key", key);
                map.put("value", value);
                list.add(map);
            }
        }

        Map<Object,Object> map=new HashMap<>();
        map.put("count",result.get("count"));
                list.add(map);
        return list;
    }

Jedisスキーム
   。。。。。。

これらのメソッドは、reidsデータ量が多い場合のクエリー速度の問題を解決していません.後で最適化スキームを追加します.
参考資料:
https://blog.csdn.net/drikay/article/details/81186192