Redisのすべてのキー値ペアを取得
Redisコマンドレベル実装:
Spring-Data-Redis実装:
keys(「*」)のシナリオを改善するには、次の手順に従います.
Jedisスキーム
これらのメソッドは、reidsデータ量が多い場合のクエリー速度の問題を解決していません.後で最適化スキームを追加します.
参考資料:
https://blog.csdn.net/drikay/article/details/81186192
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