导致Redis访问慢的原因通常有2个方面: 第一,Redis本身性能出现了瓶颈,如:内存使用率过高,并发过大等 第二,存在大KEY,或者客户端访问命令使用不当引起的阻塞
在此,只列举因为的客户端命令使用不当导致访问Redis慢的操作,表现出来的现象就是:某些接口的访问耗时不稳定,时好时坏。
无序集合“SMEMBERS”命令
当无序集合(SET)中的元素个数很多时,使用“SMEMBERS”命令访问可能会引起Redis访问阻塞。
替代方案:使用SSCAN
命令代替SMEMBERS
命令。
使用示例:
// 使用SMEMBERS命令访问集合所有元素
Set<String> set = redisTemplate.opsForSet().members(key);
// 使用SSCAN命令访问集合所有元素
Set<String> set = new HashSet<>();
Cursor<String> cursor = this.redisTemplate.opsForSet().scan(key, ScanOptions.NONE);
try {
while (cursor.hasNext()) {
String value = cursor.next();
set.add(value)
}
} finally {
try {
cursor.close();
} catch (Exception e) {}
}
哈希集合“HGETALL”命令
当哈希集合(HASH)中的元素很多时,使用“HGETALL”命令获取所有元素可能会引起Redis访问阻塞。
替代方案:使用HSCAN
命令替代HGETALL
命令。
使用示例:
// 使用HGETALL命令获取集合所有元素
Map<String, Object> map = redisTemplate.opsForHash().entries(key);
// 使用HSCAN命令访问集合所有元素
Map<String, Object> map = new HashMap<>();
Cursor<Map.Entry<String, Object>> cursor = redisTemplate.opsForHash().scan(key, ScanOptions.NONE);
try {
while (cursor.hasNext()) {
Map.Entry<String, Object> entry = cursor.next();
if (entry.getKey() == null || entry.getValue() == null) {
continue;
}
map.put(entry.getKey(), entry.getValue());
}
} finally {
try {
cursor.close();
} catch (Exception e) {}
}
【参考】 http://kaito-kidd.com/2021/01/23/redis-slow-latency-analysis/ Redis为什么变慢了?一文讲透如何排查Redis性能问题 | 万字长文 http://xiaoyue26.github.io/2020/03/23/2020-03/redis大key问题/ redis大key问题