Redis如何高效安全的遍历所有key?

1 个回答

  • 李青莲
    永远喜欢简单而真诚的人。
    在 Redis 中遍历所有键有两种方式,分别是 `KEYS` 和 `SCAN` 命令: ### 1. `KEYS` 命令 `KEYS` 命令可以查找所有符合给定模式的键,例如 `KEYS *` 会返回所有键。它适用于小型数据库,因为 `KEYS` 会一次性加载并返回所有匹配的键,在包含大量键的数据库中使用可能导致服务器阻塞,不建议在生产环境中使用。 **使用 Jedis 的示例:** ```java import redis.clients.jedis.Jedis; import java.util.Set; public class RedisKeysExample { public static void main(String[] args) { Jedis jedis = new Jedis("localhost"); Set<String> keys = jedis.keys("*"); // 使用 KEYS 命令获取所有键 for(String key : keys) { System.out.println(key); } jedis.close(); } } ``` ### 2. `SCAN` 命令 `SCAN` 提供了更安全的遍历键的方式。它基于游标(cursor)分批次返回匹配的键,不会一次性加载所有键,因此不会阻塞服务器,更适合生产环境。 **使用 Jedis 的示例:** ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.ScanParams; import redis.clients.jedis.ScanResult; public class RedisScanExample { public static void main(String[] args) { Jedis jedis = new Jedis("localhost"); String cursor = ScanParams.SCAN_POINTER_START; ScanParams scanParams = new ScanParams().count(10); do { ScanResult<String> scanResult = jedis.scan(cursor, scanParams); cursor = scanResult.getCursor(); scanResult.getResult().forEach(System.out::println); } while (!cursor.equals("0")); jedis.close(); } } ``` ### 注意事项 - 当 `SCAN` 完成遍历时,`cursor` 值变为 `0`,可以根据这个值来终止迭代。 - `SCAN` 不保证每次返回的结果完全不重复,可能需要客户端代码去重。 ### 总结 - **`KEYS`**:适合小型数据库,查询快但会阻塞服务器。 - **`SCAN`**:适合大型数据库,逐步遍历键集合,适用于生产环境。
    发布于 2024-10-21 21:54 •IP属地 云南
    举报
    评论
    收藏