除了递归算法,要如何优化实现文件搜索功能
大家好,我是 V 哥,今天的文章来聊一聊 Java实现文件搜索功能,并且比较递归算法、迭代方式和Memoization技术的优缺点。
以下是一个使用 Java 实现的文件搜索功能,它会在指定目录及其子目录中搜索包含特定关键字的文件。此实现使用递归方式遍历目录,并可以使用文件名或内容搜索文件。
使用递归搜索文件
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;public class FileSearcher {// 在指定目录中搜索包含关键字的文件public static void searchFiles(File directory, String keyword) {// 获取目录下的所有文件和子目录File[] files = directory.listFiles();if (files == null) {System.out.println("目录不存在或无法读取:" + directory.getAbsolutePath());return;}// 遍历文件和子目录for (File file : files) {if (file.isDirectory()) {// 如果是目录,递归搜索searchFiles(file, keyword);} else {// 如果是文件,检查文件名或文件内容是否包含关键字if (file.getName().contains(keyword)) {System.out.println("找到匹配文件(文件名): " + file.getAbsolutePath());} else if (containsKeyword(file, keyword)) {System.out.println("找到匹配文件(文件内容): " + file.getAbsolutePath());}}}}// 检查文件内容是否包含关键字private static boolean containsKeyword(File file, String keyword) {try (Scanner scanner = new Scanner(file)) {// 逐行读取文件内容并检查是否包含关键字while (scanner.hasNextLine()) {String line = scanner.nextLine();if (line.contains(keyword)) {return true;}}} catch (FileNotFoundException e) {System.out.println("无法读取文件:" + file.getAbsolutePath());}return false;}public static void main(String[] args) {// 指定搜索的目录和关键字String directoryPath = "C:/java"; // 替换为实际目录路径String keyword = "vg"; // 替换为实际关键字// 创建文件对象表示目录File directory = new File(directoryPath);// 开始搜索searchFiles(directory, keyword);}
}
关键方法说明一下
-
searchFiles 方法:这是递归搜索文件的主方法。它遍历给定目录中的所有文件和子目录。如果发现某个文件名或文件内容包含指定关键字,则输出文件路径。
-
containsKeyword 方法:检查文件内容是否包含关键字。它逐行读取文件内容,以查找是否有包含关键字的行。
-
main 方法:在主方法中,指定要搜索的目录路径和关键字,然后调用
searchFiles
方法开始搜索。
使用说明
- 修改
directoryPath
和keyword
变量,指定你要搜索的目录路径和关键字。 - 运行代码后,它将在指定目录及其子目录中搜索文件,并输出匹配的文件路径。
注意喽
- 该实现使用递归搜索目录,适用于层次较浅的文件目录。对于非常深的目录结构,可以考虑使用迭代方式。
containsKeyword
方法在搜索文件内容时使用Scanner
逐行读取,这种方式适用于文本文件。对于非文本文件(如二进制文件),需要不同的处理方式。
问题来了,如果文件层次非常深的目录结构,需要怎么优化?
对于非常深的目录结构,使用递归搜索文件可能会导致栈溢出问题,因为每次递归调用都会消耗栈空间。要优化这种情况下的文件搜索,可以使用迭代的方式来替代递归,从而避免栈溢出风险。迭代方式通常使用一个栈或队列来模拟递归的过程,这样可以处理任意深度的目录结构。
以下是优化后的 Java 文件搜索实现,使用迭代方式遍历深层次的目录结构:
使用迭代方式搜索文件
import java.io.File;
import java.io.FileNotFoundException;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class FileSearcherIterative {// 使用迭代方式搜索包含关键字的文件public static void searchFiles(File rootDirectory, String keyword) {// 使用队列来进行广度优先搜索Queue<File> queue = new LinkedList<>();queue.add(rootDirectory);while (!queue.isEmpty()) {// 取出队列头部的文件/目录File current = queue.poll();// 如果是目录,添加子文件和子目录到队列中if (current.isDirectory()) {File[] files = current.listFiles();// 如果目录无法读取,跳过if (files == null) {System.out.println("无法读取目录:" + current.getAbsolutePath());continue;}for (File file : files) {queue.add(file);}} else {// 如果是文件,检查文件名或文件内容是否包含关键字if (current.getName().contains(keyword)) {System.out.println("找到匹配文件(文件名): " + current.getAbsolutePath());} else if (containsKeyword(current, keyword)) {System.out.println("找到匹配文件(文件内容): " + current.getAbsolutePath());}}}}// 检查文件内容是否包含关键字private static boolean containsKeyword(File file, String keyword) {try (Scanner scanner = new Scanner(file)) {// 逐行读取文件内容并检查是否包含关键字while (scanner.hasNextLine()) {String line = scanner.nextLine();if (line.contains(keyword)) {return true;}}} catch (FileNotFoundException e) {System.out.println("无法读取文件:" + file.getAbsolutePath());}return false;}public static void main(String[] args) {// 指定搜索的目录和关键字String directoryPath = "C:/java"; // 替换为实际目录路径String keyword = "vg"; // 替换为实际关键字// 创建文件对象表示目录File rootDirectory = new File(directoryPath);// 开始搜索searchFiles(rootDirectory, keyword);}
}
代码说明
-
使用队列实现广度优先搜索(BFS):
- 在这里,我们使用
Queue
来实现广度优先搜索(BFS),也可以使用Stack
实现深度优先搜索(DFS)。BFS 更加适合处理文件目录,因为它可以在处理一个目录前先将其所有子文件/子目录添加到队列中,从而降低栈深度。
- 在这里,我们使用
-
迭代遍历目录:
- 每次从队列中取出一个文件或目录,如果是目录则将其子文件和子目录添加到队列中,如果是文件则检查其是否包含关键字。
-
处理不可读目录:
- 在尝试读取目录时,可能遇到无法读取的情况(例如权限问题),这里使用
if (files == null)
进行检查并跳过不可读的目录。
- 在尝试读取目录时,可能遇到无法读取的情况(例如权限问题),这里使用
优化要点
- 避免栈溢出:使用迭代方式而不是递归,避免递归调用带来的栈溢出风险。
- 适应任意深度的目录结构:无论目录层次多深,都可以正常工作,不受递归深度限制。
- 广度优先或深度优先搜索:可以根据需求使用
Queue
(BFS)或Stack
(DFS)。BFS 更适合较宽的目录结构,而 DFS 可以更快找到较深层次的文件。
注意一下
- 在非常深的目录或含有大量文件的情况下,搜索操作可能会很耗时。可以考虑增加其他优化,如多线程处理。
containsKeyword
方法适用于文本文件,对于二进制文件需调整逻辑以防止误匹配。
来,我们继续优化。
如果文件或目录中存在符号链接(软链接)或循环引用的文件系统,会导致重复访问相同文件或目录的情况,那要怎么办呢?
Memoization技术 闪亮登场
Memoization 技术介绍
Memoization 是一种用于优化递归算法的技术,它通过缓存函数的中间结果来避免重复计算,从而提高性能。这个技术在计算具有重叠子问题(overlapping subproblems)的递归算法时非常有用,如斐波那契数列、背包问题、动态规划等。
Memoization 的工作原理
- 缓存中间结果:每次函数调用时,将结果存储在一个数据结构(如哈希表、数组或字典)中,以后如果函数再次被调用,且参数相同,则直接从缓存中返回结果,而不再进行重复计算。
- 减少时间复杂度:通过存储中间结果,Memoization 将递归算法的时间复杂度从指数级降低到多项式级。
使用 Memoization 技术优化深层次递归算法
以下是如何使用 Memoization 技术来优化 Java 中的深层次递归算法的示例。这里以斐波那契数列为例,首先展示一个未优化的递归实现,然后通过 Memoization 进行优化。
1. 未优化的递归算法
public class FibonacciRecursive {// 未使用 Memoization 的递归斐波那契算法public static int fib(int n) {if (n <= 2) {return 1;}return fib(n - 1) + fib(n - 2);}public static void main(String[] args) {int n = 40; // 比较大的 n 会导致大量重复计算System.out.println("Fibonacci of " + n + " is: " + fib(n)); // 非常慢}
}
这种实现的时间复杂度是 O(2^n),因为它会重复计算相同的子问题,特别是当 n
很大时,效率非常低。
2. 使用 Memoization 优化递归算法
使用 Memoization,我们可以通过缓存中间结果来避免重复计算。这里使用一个数组 memo
来存储已经计算过的斐波那契值。
import java.util.HashMap;
import java.util.Map;public class FibonacciMemoization {// 使用 Memoization 的递归斐波那契算法private static Map<Integer, Integer> memo = new HashMap<>();public static int fib(int n) {// 检查缓存中是否已有结果if (memo.containsKey(n)) {return memo.get(n);}// 递归边界条件if (n <= 2) {return 1;}// 计算结果并缓存int result = fib(n - 1) + fib(n - 2);memo.put(n, result);return result;}public static void main(String[] args) {int n = 40;System.out.println("Fibonacci of " + n + " is: " + fib(n)); // 快速计算}
}
解释一下
- 缓存结果:
memo
是一个HashMap
,用来存储每个n
对应的斐波那契数值。每次计算fib(n)
时,先检查memo
中是否已经存在结果,如果存在,直接返回缓存值。 - 减少重复计算:通过存储中间结果,避免了对相同子问题的重复计算,将时间复杂度降低为 O(n)。
- 递归边界:当
n <= 2
时,直接返回 1。
优化效果
通过使用 Memoization 技术,递归算法从指数级时间复杂度 O(2^n) 降低到了线性时间复杂度 O(n)。这意味着,即使 n
非常大,计算时间也将大大缩短。
更通用的 Memoization 例子
Memoization 不仅可以应用于斐波那契数列,还可以应用于其他需要深层次递归的场景,例如:
- 动态规划问题:如背包问题、最长公共子序列、字符串编辑距离等。
- 树和图算法:如求树的最大路径、图中的最短路径。
注意事项
- 空间复杂度:Memoization 使用了额外的空间来存储中间结果,可能导致空间复杂度增加,尤其在处理大量中间结果时需要注意。
- 适用场景:Memoization 适用于具有重叠子问题的递归问题,对于无重叠子问题的递归(如分治法)不适用。
- 多线程环境:在多线程环境中使用 Memoization 时需要考虑线程安全问题,可以使用线程安全的数据结构或同步机制。
Memoization 是一种简单而有效的优化技术,通过缓存中间结果可以极大地提升递归算法的性能。
所以,我们通过Memoization技术来改造一下文件搜索功能。
Memoization 技术优化
对于深层次文件搜索功能,Memoization 技术可以用来优化重复访问相同文件或目录的情况。特别是对于可能存在符号链接(软链接)或循环引用的文件系统,Memoization 可以防止多次搜索相同的目录或文件,避免死循环和性能下降。
以下是使用 Memoization 优化文件搜索的示例,在搜索过程中缓存已经访问过的目录,防止重复搜索:
使用 Memoization 优化文件搜索
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;public class FileSearcherMemoization {// 使用 HashSet 来缓存已经访问过的目录路径private static Set<String> visitedPaths = new HashSet<>();// 使用迭代方式搜索包含关键字的文件,并利用 Memoization 防止重复访问public static void searchFiles(File rootDirectory, String keyword) {// 使用队列来进行广度优先搜索Queue<File> queue = new LinkedList<>();queue.add(rootDirectory);while (!queue.isEmpty()) {// 取出队列头部的文件/目录File current = queue.poll();// 获取当前路径String currentPath = current.getAbsolutePath();// 检查是否已经访问过该路径if (visitedPaths.contains(currentPath)) {continue; // 如果已经访问过,跳过,防止重复搜索}// 将当前路径加入到已访问集合visitedPaths.add(currentPath);// 如果是目录,添加子文件和子目录到队列中if (current.isDirectory()) {File[] files = current.listFiles();// 如果目录无法读取,跳过if (files == null) {System.out.println("无法读取目录:" + currentPath);continue;}for (File file : files) {queue.add(file);}} else {// 如果是文件,检查文件名或文件内容是否包含关键字if (current.getName().contains(keyword)) {System.out.println("找到匹配文件(文件名): " + current.getAbsolutePath());} else if (containsKeyword(current, keyword)) {System.out.println("找到匹配文件(文件内容): " + current.getAbsolutePath());}}}}// 检查文件内容是否包含关键字private static boolean containsKeyword(File file, String keyword) {try (Scanner scanner = new Scanner(file)) {// 逐行读取文件内容并检查是否包含关键字while (scanner.hasNextLine()) {String line = scanner.nextLine();if (line.contains(keyword)) {return true;}}} catch (FileNotFoundException e) {System.out.println("无法读取文件:" + file.getAbsolutePath());}return false;}public static void main(String[] args) {// 指定搜索的目录和关键字String directoryPath = "C:/ java"; // 替换为实际目录路径String keyword = "vg"; // 替换为实际关键字// 创建文件对象表示目录File rootDirectory = new File(directoryPath);// 开始搜索searchFiles(rootDirectory, keyword);}
}
解释
-
Memoization 数据结构:
- 使用
HashSet<String>
作为缓存(visitedPaths
),存储已经访问过的目录的绝对路径。HashSet
提供 O(1) 时间复杂度的查找操作,确保检查是否访问过一个路径的效率很高。
- 使用
-
缓存访问的目录:
- 在每次处理一个文件或目录时,先检查其路径是否在
visitedPaths
中。如果存在,说明已经访问过,直接跳过,防止重复搜索。 - 如果没有访问过,则将当前路径加入到
visitedPaths
中,并继续搜索。
- 在每次处理一个文件或目录时,先检查其路径是否在
-
防止死循环:
- 通过缓存路径,可以防止在存在符号链接或循环引用时的无限递归或重复搜索。特别是文件系统中符号链接可能导致目录循环引用,Memoization 技术可以有效地避免这种情况。
-
迭代搜索:
- 继续使用迭代方式进行广度优先搜索(BFS),适合深层次的目录结构,防止因递归深度过深导致栈溢出。
优化效果
通过引入 Memoization,文件搜索功能可以:
- 避免重复访问相同的目录或文件,从而提高性能,尤其在存在符号链接或循环结构的情况下。
- 防止由于重复搜索导致的死循环,确保搜索过程安全可靠。
注意事项
- 内存使用:
- 使用 Memoization 会增加内存使用,因为需要保存已经访问过的目录路径。在搜索非常大的目录树时,注意内存消耗。
- 多线程环境:
- 如果需要并行化搜索,可以使用线程安全的数据结构,如
ConcurrentHashMap
或ConcurrentSkipListSet
,确保在多线程环境中缓存的访问安全。
- 如果需要并行化搜索,可以使用线程安全的数据结构,如
这个优化版本通过 Memoization 技术避免了重复搜索和死循环,提高了搜索性能和稳定性,特别适合在复杂的文件系统中进行深层次搜索。原创不易,感谢点赞支持。收藏起来备孕哦。
相关文章:

除了递归算法,要如何优化实现文件搜索功能
大家好,我是 V 哥,今天的文章来聊一聊 Java实现文件搜索功能,并且比较递归算法、迭代方式和Memoization技术的优缺点。 以下是一个使用 Java 实现的文件搜索功能,它会在指定目录及其子目录中搜索包含特定关键字的文件。此实现使用…...

【AI算法岗面试八股面经【超全整理】——NLP】
AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…...

Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】
Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】 目录 Unity 设计模式 之 创建型模式 -【单例模式】【原型模式】 【建造者模式】 一、简单介绍 二、单例模式 (Singleton Pattern) 1、什么时候使用单例模式 2、单例模式的好处 3、使用单例模式的…...

CSS中的字体样式、文本样式、列表样式以及背景和渐变
一、字体样式和文本样式 1.span标签 span标签的作用:能让某几个文字或者是词语凸显出来 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-…...

教你如何在Java中操作Redis
Redis的Java客户端 Redis 的 Java 客户端很多,常用的几种: Jedis:基于 Java 的 Redis 客户端,提供了 Redis 命令的全面支持。Lettuce:高性能的 Java 客户端库,用于与 Redis 数据库进行交互。它支持同步、…...

nsight-system教程
一 安装 参考 nsight-compute使用教程-CSDN博客https://blog.csdn.net/youzjuer/article/details/142549332 二 使用 nsys profile -t cuda,nvtx --force-overwrite true -o xxxx python xxx.py xxxx表示生成文档的名字 如果是cuda c 则 python xxx.py替换为./xxx即可 这…...

进程的那些事--进程控制
目录 前言 一、创建进程 二、退出进程 void exit (int retval) 三、进程等待 四、进程替换 前言 提示:这里可以添加本文要记录的大概内容: 前面我们认识了进程,现在让我们认识几个进程的接口 提示:以下是本篇文章正文内容…...

FortiOS SSL VPN 用户访问权限配置
简介 使用不同用户组或用户登录 SSL VPN 隧道模式后,可配置不同的访问权限。 本文介绍为不同用户组分配不同访问权限的配置方法。 相关组件 FortiGate:FortiOS v6.4.14 build2093 (GA) 客户端:Windows11,安装 FortiClient VPN 7.…...

C++_vector类
欢迎来到本期节目- - - vector类 本期直接先上代码,然后以代码为例介绍需要注意的问题. 模拟实现: #pragma once #include<iostream> #include<assert.h> using namespace std;namespace my_room {template<class T>class vector{p…...

Spring Boot入门到精通:网上购物商城系统
第3章 系统分析 3.1 可行性分析 在系统开发之初要进行系统可行分析,这样做的目的就是使用最小成本解决最大问题,一旦程序开发满足用户需要,带来的好处也是很多的。下面我们将从技术上、操作上、经济上等方面来考虑这个系统到底值不值得开发。…...

在Vue.js中,你可以使用Element UI的el-input组件结合计算属性来实现模糊查询
<template><div><el-input v-model"searchQuery" placeholder"请输入查询内容"></el-input><div v-for"item in filteredList" :key"item">{{ item }}</div></div> </template><s…...

delphi制作漂亮的农历窗体(IntraWeb+Layui的完美结合)
delphi制作漂亮的农历窗体(IntraWebLayui的完美结合) 不需要安装服务器,Apache和IIS都不需要,自带企业级服务器。 运行exe服务器就架好了,直接打开手机浏览器或者电脑浏览器,网页就出来了,如果…...

发票OFD格式转换成PDF
引入依赖,低版本的报错,2.0.2能够实现转换 <dependency><groupId>org.ofdrw</groupId><artifactId>ofdrw-converter</artifactId><version>2.0.2</version><exclusions><exclusion><groupId&g…...

高通AI应用程序开发3:网络模型(一)
1. 支持的网络模型 Qualcomm神经处理SDK支持下表所列的网络模型。 有关支持的运行时和单个图层类型的限制和约束的详细信息,请参阅 限制 。 GPU运行时中支持的所有层对两种GPU模式都有效:GPU_FLOAT32_16_HYBRID和GPU_FLAAT16。GPU_FLOAT32_16_HYBRID-…...

03. 前端面试题之ts : typescript 的数据类型有哪些?
文章目录 一、typescript是什么二、typescript有哪些数据类型booleannumberstringarraytupleenumanynull 和 和 undefinedvoidneverobject 三、总结 一、typescript是什么 typescript 和 javascript几乎一样,拥有相同的数据类型,另外在javascript基础上…...

PyCharm和VS Code 安装通义灵码,可本地安装包安装,解决插件安装不上问题
PyCharm和VS Code 安装通义灵码,可本地安装包安装,解决插件安装不上问题 PyCharm、VS Code 安装通义灵码介绍主要应用场景支持编程语言安装指南JetBrains IDEs 中安装指南步骤 1:准备工作步骤 2:在 JetBrains IDEs 中安装通义灵码…...
机器人速度雅可比矩阵求解(2自由度平面关节机器人)
关节速度和末端速度空间的映射需要计算雅可比矩阵的逆矩阵,在博途PLC里如何计算一个方阵的逆矩阵,大家可以参考下面这篇文章: 博途PLC矩阵求逆 矩阵求逆 博图SCL_博图矩阵运算-CSDN博客文章浏览阅读839次。本文介绍如何用C语言实现矩阵求逆的过程,详细解析了相关代码,适…...

【AI大模型-文心-思维树解读-开篇】
提问:什么是“”“思维树”“”模型框架 回答:如下 版本:文心大模型3.5 “思维树”(Tree of Thoughts, ToT)模型框架是一个利用大型语言模型进行问题解决的框架。它借鉴了人类认知研究的成果,特别是关于人…...

2、electron vue3 怎么创建子窗口,并给子窗口路由传参
接上回初始化vue3 electron项目,创建完vue3 electron项目后,现在要实现在渲染进程中点击按钮创建一个新的子窗口 开始 子窗口创建操作只能在主线程内完成,而创建操作是在渲染线程触发,因此就需要进行两者间的通讯。 1、创建子窗…...

8.pod数据持久化
💂 个人主页: Java程序鱼 💬 如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和订阅专栏 👤 微信号:hzy1014211086,想加入技术交流群的小伙伴可以加我好友,群里会分享学习资料、学习方法…...

C语言 | Leetcode C语言题解之第436题寻找右区间
题目: 题解: typedef struct {int start;int index; } Node;int cmp(const void *pa, const void *pb) {return ((Node *)pa)->start - ((Node *)pb)->start; }int* findRightInterval(int** intervals, int intervalsSize, int* intervalsColSiz…...

SpringBoot3中ymal配置文件(持续更新)
博客主页:音符犹如代码系列专栏:JavaWeb关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 在SpringBoot项目中,使用application.properties进行配置管理时,…...

Linux 基础IO 2
读取与写入 read与fread 在基础IO 1中我们学会了open和fopen的函数这两个函数是用于为进程打开文件也可以理解为为进程和文件建立了一个链接使其可以交互。那我们建立号链接之后肯定还是需要对文件进行操作,现在我们先来了解读取操作。 read: 这是一…...

图像预处理 图像去噪之常见的去噪方法
图像去噪是图像预处理中的一项关键技术,其目的是从含有噪声的图像中恢复出无噪声的图像,以提高图像质量和后续图像分析的准确性。图像去噪方法众多,本文将介绍几种常见的去噪方法,并提供相应的代码示例。 1. 均值滤波(…...

代码随想录Day53|102.沉没孤岛 、103.水流问题 、104.建造最大岛屿
102.沉没孤岛 import java.util.*;class Main{public static int[][] dir {{0,1},{1,0},{0,-1},{-1,0}};public static void main (String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();int[][] grid new int[n][m];for(int i 0…...

19c-pfile
经常需要rman恢复测试,创建一个单机pfile,需要时手动修改使用,以20g内存为例 orcl.__data_transfer_cache_size0 orcl.__db_cache_size13824425984 orcl.__inmemory_ext_roarea0 orcl.__inmemory_ext_rwarea0 orcl.__java_pool_size0 orcl._…...

智能软件开启精准品牌控价
在当今竞争激烈的商业世界中,品牌的价值如同璀璨的明珠,需要精心呵护。而价格管控,则是守护这颗明珠的关键防线。 当面对众多的产品和 SKU 时,传统的人力监测已显得力不从心。此时,力维网络自主开发的数据监测系统如同…...

OpenCV特征检测(8)检测图像中圆形的函数HoughCircles()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在灰度图像中使用霍夫变换查找圆形。 该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。 例子: #include <opencv2/imgp…...

spark 大表与大表join时的Shuffle机制和过程
在 Spark 中,当处理大表与大表的 JOIN 操作时,通常会涉及到 Shuffle 机制,这是分布式计算中用于重新分布数据的关键步骤。Shuffle 的本质是将数据按照某种方式重新分组,使得相同 key 的数据能够被发送到同一个计算节点进行后续的操…...

大厂面试真题:简单说下Redis的bigkey
什么是bigkey bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。 如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。 字…...