导致Redis访问慢的常见操作

2022-04-29 12:16:57 浏览数 (1)

导致Redis访问慢的原因通常有2个方面: 第一,Redis本身性能出现了瓶颈,如:内存使用率过高,并发过大等 第二,存在大KEY,或者客户端访问命令使用不当引起的阻塞

在此,只列举因为的客户端命令使用不当导致访问Redis慢的操作,表现出来的现象就是:某些接口的访问耗时不稳定,时好时坏。

无序集合“SMEMBERS”命令

当无序集合(SET)中的元素个数很多时,使用“SMEMBERS”命令访问可能会引起Redis访问阻塞。 替代方案:使用SSCAN命令代替SMEMBERS命令。 使用示例:

代码语言:javascript复制
// 使用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命令。 使用示例:

代码语言:javascript复制
// 使用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问题

0 人点赞