React进阶面试题(四)
React 的 reconciliation(协调)算法
Reconciliation是React的diff算法,用于比较更新前后的虚拟DOM树差异,从而使用最小的代价将原始DOM按照新的状态、属性进行更新。其目的是找出两棵树的差异,原生方式直接比较复杂度会是O(n³),而React使用了启发式的算法,实现了O(n)复杂度的算法。该算法的基本逻辑如下:
- 首先比较根节点,如果根节点不同,则直接替换整个子树。
- 如果根节点相同,则比较节点的属性,对于变化的属性进行更新,并通过调用子节点的相关方法,把新属性传递给需要的子节点,以此更新子节点的状态。
- 对于子节点列表,React要求使用者在列表中加上key属性,key属性需要稳定、可预测,并在兄弟节点中唯一。这样React就可以通过比较key来快速定位哪些子节点是新的、哪些是需要更新的、哪些是删除的。
React 的 contextType
contextType
是React提供的一种用于在组件树中共享数据的机制的一部分。它是React.createContext()
创建的context对象的属性,允许类组件订阅context的变化。当context更新时,订阅了该context的组件会重新渲染。使用contextType
可以避免在类组件中直接使用Context.Consumer
来消费context,使得代码更加简洁。
在 Redux 中发起网络请求
在Redux中,发起网络请求的操作通常放在action中。由于网络请求是异步的,所以需要使用中间件(如redux-thunk)来处理这些异步操作。action函数返回一个函数,该函数接收dispatch和getState作为参数,然后发起网络请求,并在请求成功或失败后dispatch相应的action。
React 的 useImperativeHandle
useImperativeHandle
是React中的一个自定义Hook,用于自定义父组件通过ref获取子组件实例的公开方法。通过使用useImperativeHandle
,可以选择性地暴露子组件的特定属性或方法给父组件。这对于需要在父组件中直接操作子组件的特定行为或属性时非常有用。基本语法为useImperativeHandle(ref, createHandle, [deps])
,其中ref是父组件传递给子组件的ref,createHandle是一个在组件渲染过程中调用的函数,用于创建需要暴露给父组件的属性和方法,deps是一个可选的依赖数组。
Redux 中间件获取 store 和 action 的方式及处理
Redux中间件是一个函数,它接收store作为参数,并返回一个接收action并返回下一个action处理函数的函数。中间件可以在action被传递到reducer之前,修改action、拦截action,或者在action被处理后做一些额外的操作。中间件通过调用next(action)将控制权传递给下一个中间件或reducer。同时,中间件可以调用store.getState()获取当前的state,或者store.dispatch()派发一个新的action。
渲染劫持(Render Hijacking)
渲染劫持是指在组件渲染过程中,通过一些技术手段修改或干预组件的渲染行为。这可以用来实现各种功能,如性能优化、状态管理、错误处理等。渲染劫持是一种高级技术,通常需要深入了解React的内部工作原理和生命周期方法。在React中,使用自定义Hooks或高阶组件等高级特性可以实现渲染劫持。
应用场景包括但不限于:
- 在渲染前或渲染后进行特定的逻辑处理。
- 捕获并处理渲染过程中的错误。
- 动态地修改渲染结果。
React 的高阶组件(HOC)
高阶组件(HOC)是React中对组件逻辑复用部分进行抽离的高级技术。它不是React API,而是一种设计模式,类似于装饰器模式。HOC是一个函数,它接收一个组件作为参数,并返回一个新的增强组件。
与普通组件的区别在于:
- HOC本身不是React组件,而是一个函数,它接收组件并返回组件。
- HOC可以访问被包装组件的props和context,并对其进行修改或增强。
- HOC返回的新组件会包含被包装组件的所有功能,并可能添加额外的功能或属性。
优缺点:
- 优点:提高代码复用性,简化组件逻辑,使代码更加模块化和可维护。
- 缺点:可能导致组件树变得复杂,增加调试难度;如果滥用HOC,可能会使组件的props变得难以理解和追踪。
应用场景包括:
- 操纵props:为被包装组件添加额外的props或修改现有的props。
- 访问组件实例:通过ref访问被包装组件的实例。
- 组件状态提升:将被包装组件的状态提升到HOC中管理。
ES6 的扩展运算符(…)在 React 中的应用
ES6的扩展运算符...
在React中有多种应用,包括但不限于:
- 合并数组或对象:在传递props或state时,可以使用扩展运算符来合并数组或对象。
- 克隆组件或元素:可以使用扩展运算符来克隆React组件或元素,并添加或修改其props。
- 函数参数传递:在函数组件中,可以使用扩展运算符来传递多个参数给函数。
React.memo 和 React.forwardRef 包装的组件 children 类型不匹配的问题
当使用React.memo
和React.forwardRef
包装组件时,如果遇到children类型不匹配的问题,这通常是因为在包装组件中对children进行了类型检查,而传递的children的实际类型与期望的类型不匹配。解决这个问题的方法包括:
- 确保传递的children的类型与包装组件中期望的类型一致。
- 在包装组件中放宽对children的类型检查,或者使用更通用的类型定义。
在 React 中使用 Context API
在React中,Context API提供了一种在组件树中传递数据的方式,而不需要手动通过props层层传递。使用Context API需要创建Context对象,并使用Context.Provider
组件来提供数据,使用Context.Consumer
组件或useContext
Hook来消费数据。
具体步骤如下:
- 使用
React.createContext()
创建一个Context对象。 - 在组件树中使用
Context.Provider
包裹需要共享数据的组件,并通过value属性提供数据。 - 在需要消费数据的组件中,使用
Context.Consumer
组件或useContext
Hook来访问数据。
Redux 的核心概念、设计思想、工作流程和工作原理
- 核心概念:Redux是一个用于JavaScript应用的状态管理库。它的核心概念包括store(存储整个应用的状态树)、action(描述发生了什么)、reducer(根据action更新state的纯函数)。
- 设计思想:Redux的设计思想是基于Flux架构的,但进行了简化和优化。它强调单一数据源、状态只读、使用纯函数来执行更新。
- 工作流程:在Redux中,工作流程通常包括三个步骤:发出action、调用reducer、更新state。当用户与界面交互时,会触发一个action。这个action被发送到Redux的store中,store会调用相应的reducer来处理这个action。reducer接收当前的state和action作为参数,并返回一个新的state。这个新的state会被store保存,并触发组件的重新渲染。
- 工作原理:Redux的工作原理是基于事件-响应模型的。当用户触发一个事件(如点击按钮)时,会生成一个action对象来描述这个事件。这个action对象被发送到Redux的store中。store会调用与当前action类型相匹配的reducer函数来处理这个action。reducer函数接收当前的state和action作为参数,并根据action的内容来更新state。更新后的state会被store保存起来,并触发订阅了state变化的监听器(通常是React组件)来重新渲染界面。
Redux 是否建议在 reducer 中触发 Action
Redux不建议在reducer中触发action。因为reducer应该是纯函数,它们接收当前的state和action作为参数,并返回一个新的state。如果在reducer中触发action,就会破坏这个纯函数的特性,导致状态管理变得复杂和不可预测。如果需要在处理action时执行一些副作用(如发起网络请求、更新UI等),应该使用中间件(如redux-thunk、redux-saga等)来处理这些副作用。
在使用 React 的过程中遇到的问题及解决方案
在使用React的过程中,可能会遇到各种问题,如性能优化、状态管理、错误处理等。以下是一些常见的问题及解决方案:
-
性能优化:
- 使用React的PureComponent或React.memo来避免不必要的重新渲染。
- 使用shouldComponentUpdate或React.memo的第二个参数来细粒度地控制组件的更新。
- 使用虚拟滚动和懒加载来优化长列表的渲染性能。
-
状态管理:
- 使用React的Context API或Redux等状态管理库来管理全局状态。
- 将复杂的状态逻辑拆分成多个小的、可复用的reducer或hooks。
-
错误处理:
- 使用try-catch语句来捕获和处理异步操作中的错误。
- 使用Error Boundary组件来捕获和处理React组件树中的错误。
-
组件通信:
- 使用props和context来在父子组件之间传递数据。
- 使用React的refs和回调函数来在父子组件之间进行方法调用和事件处理。
以上是对您所提问题的详细解答。希望这些信息能帮助您更好地理解和使用React和Redux。
什么是 React 的插槽(Portals)?
React 中的“插槽”通常指的是一种允许组件从父组件渲染到另一个位置的技术,官方术语为 Portals。Portals 提供了一种将子组件渲染到其父组件 DOM 层次结构之外的机制。
应用场景举例:
- 处理全局 UI 元素:Portals 可用于创建全局的 UI 元素,如模态框、通知框、工具提示等。这些元素可以浮在应用的其他组件之上,不受组件嵌套结构的影响。
- 处理层叠上下文:当某些 CSS 样式属性(如 z-index)创建层叠上下文,限制了元素的显示顺序时,使用 Portals 可以将元素渲染到指定的 DOM 节点上,从而绕过这些限制,实现更复杂的 UI 布局。
- 提高可重用性:可以将通用的 UI 组件(如模态框或通知框)封装为可重用的组件,使其在不同的应用中使用,而无需关心组件的具体放置位置。
Redux 的数据存储和本地存储有什么区别?
-
Redux 数据存储:
- 存储在内存中的 JS 变量。
- 页面刷新后数据会消失。
-
本地存储:
- 存储在硬盘中的技术,如 localStorage、Cookie、IndexedDB、WebSQL 等。
- 数据在页面刷新后不会消失。
React 项目的结构
React 项目的结构通常包括以下几个部分:
- 页面文件夹:按业务或页面划分,用于存放不同页面的组件和逻辑。
- 组件文件夹:存放可复用的 React 组件,这些组件可以在多个页面或功能中使用。
- API 文件夹:存放与后端交互的 API 请求和响应处理逻辑。
- 仓库文件夹:用于管理应用的状态和逻辑,如 Redux store 或 MobX store。
- 工具函数文件:存放一些通用的工具函数,如日期处理、字符串处理等。
此外,还可能包括样式文件夹、公共文件等。
什么是 redux-saga 中间件?它有什么作用?
Redux-Saga 是一种用于 Redux 的中间件,它允许你以生成器函数(generator functions)的形式编写异步操作逻辑。
作用:
- 管理副作用:Redux-Saga 可以将副作用(如数据获取、缓存、路由跳转等)与 Redux action 和 reducer 分开处理,使代码更加清晰和可维护。
- 异步操作:通过生成器函数,Redux-Saga 可以方便地处理异步操作,如 API 请求,而无需将异步逻辑直接放在 action 或 reducer 中。
- 错误处理:Redux-Saga 提供了更好的错误处理机制,可以在捕获错误后执行相应的操作,如显示错误消息或回滚状态。
使用 React 进行开发的方式有哪些?
使用 React 进行开发的方式主要有以下几种:
- 函数式组件:使用函数定义组件,这是 React 中最常见和推荐的方式。
- 类组件:使用 ES6 类定义组件,这种方式在早期的 React 版本中较为常见,但在现代 React 开发中逐渐被函数式组件和 Hooks 取代。
- Hooks:React Hooks 提供了一种在函数组件中使用状态和其他 React 特性的方法,使得函数组件更加强大和灵活。
- 高阶组件(HOC):高阶组件是一个函数,它接收一个组件并返回一个新的组件。HOC 可以用于复用组件逻辑、修改组件属性或增强组件功能。
- Render Props:Render Props 是一种技术,它允许你将组件的渲染逻辑作为属性传递给其他组件。这种方式可以灵活地组合和复用组件逻辑。
React 异步渲染的概念是什么?什么是 Time Slicing 和 Suspense?
React 异步渲染:
React 异步渲染是指在 React 中使用异步组件来提高性能,从而减少页面的加载时间。当组件的子树很大时,渲染可能会变得很慢,甚至出现卡顿现象。为了解决这个问题,React 提供了异步渲染的机制,允许组件在需要时再进行渲染。
Time Slicing:
Time Slicing 是 React 的一种性能优化技术,它允许 React 将渲染工作拆分成更小的部分,并在浏览器的空闲时间进行。这样可以避免长时间占用主线程,从而提高应用的响应性和性能。Time Slicing 通常与 React 的并发模式(Concurrent Mode)一起使用。
Suspense:
Suspense 是 React 中的一个特性,它允许组件在等待某些操作(如数据加载)完成时暂停渲染,并在操作完成后继续渲染。Suspense 可以与异步组件、数据获取库等一起使用,以实现更流畅的用户体验。然而,需要注意的是,Suspense 目前在某些场景下可能还需要额外的配置和支持。
Redux 如何添加新的中间件?
在 Redux 中添加新的中间件通常涉及以下几个步骤:
- 引入中间件:首先,你需要引入你想要使用的中间件。例如,如果你想要使用 redux-thunk 来处理异步操作,你需要先安装 redux-thunk 并引入它。
- 创建中间件实例:接下来,你需要创建中间件的实例。对于 redux-thunk 来说,你只需要直接引用它即可,因为它是一个函数。对于其他中间件,可能需要传递一些配置参数来创建实例。
- 应用中间件到 Redux store:最后,你需要将中间件应用到 Redux store 上。这通常是通过在创建 store 时传递一个包含中间件的数组给 Redux 的 createStore 函数来实现的。例如,如果你想要同时使用 redux-thunk 和 redux-logger,你可以这样做:
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import logger from 'redux-logger';
import rootReducer from './reducers'; // 假设你有一个名为 rootReducer 的 reducerconst store = createStore(rootReducer,applyMiddleware(thunk, logger)
);
通过以上步骤,你就可以在 Redux 中添加新的中间件了。
Redux 请求中间件如何处理并发请求?
在Redux中处理并发请求通常使用中间件来实现。常见的中间件库包括Redux Thunk、Redux Saga和Redux Observable,它们提供了不同的方法来处理并发请求:
- Redux Thunk:允许在Redux的action中返回函数而不仅仅是普通的action对象,这使得可以在action中进行异步操作,例如发起AJAX请求。使用Redux Thunk,可以在action中发起多个并发的异步请求,并使用Promise.all或async/await来等待所有请求完成后进行处理。
- Redux Saga:是一个功能强大的Redux中间件,它使用ES6的生成器(generators)来处理异步操作。使用Redux Saga,可以使用fork、call和all等效果来并发执行多个异步任务。可以创建多个Saga,并使用yield all([…])来并行运行它们。
- Redux Observable:是一个基于RxJS的Redux中间件,它使用Observables来处理异步操作。使用Redux Observable,可以创建多个Epic(类似于Saga),使用merge或concat等操作符来并行执行多个异步任务。
为什么Redux能做到局部渲染?
Redux通过reducer返回新的state来实现组件的局部渲染。具体过程如下:
- reducer的作用:reducer从根往最子级的reducer中间各层总是返回一个新的state,这样的话,就可能引起组件的大范围的re-render,但这是可以避免的。
- selector的筛选:合理利用selector,在connect函数中的第一个函数mapStateToProps中从store state中返回当前组件需要使用的props,需要一个筛选,这个筛选函数就叫做selector。需要尽量细化传入的store state,即使根state发生了引用的变更,但是它下面的属性值可能是大部分都是原来的引用,引用了这个老引用的情况下,是不会引起组件的re-render的。
因此,因为一般都不会将整个store state作为组件的props进行引用,所以利用这一点就可以实现局部渲染,从而有效地提高性能。
装饰器(Decorator)在React中有哪些应用场景?
Decorator是ES7的一个新语法,可以对一些对象进行装饰包装然后返回一个被包装过的对象,可以装饰的对象包括类、属性、方法等。装饰器本质上是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。在React中,装饰器的应用场景主要包括:
- 插入日志:在方法执行前后自动插入日志记录。
- 性能测试:在方法执行前后记录时间,用于性能分析。
- 事务处理:在方法执行前后开启或关闭事务。
- 缓存:根据方法的参数和返回值进行缓存,避免重复计算。
- 权限校验:在方法执行前进行权限检查,确保用户有权限执行该方法。
此外,装饰器还可以用于创建公共的模板,减少代码的重复编写。例如,可以使用装饰器封装弹出层等公共组件,其他被装饰的页面只要实现自己独特的部分就可以了。
React的性能优化主要集中在哪个生命周期?它的优化原理是什么?
React的性能优化主要集中在componentDidUpdate生命周期中。其优化原理如下:
- 避免不必要的渲染:在componentDidUpdate中,可以通过比较新旧props和state,判断是否需要更新组件。如果不需要更新,可以避免调用setState或执行其他导致重新渲染的操作。
- 优化DOM操作:如果需要更新组件,可以在componentDidUpdate中执行必要的DOM操作,如更新样式、添加或删除节点等。由于这些操作是在组件更新后进行的,因此可以确保DOM已经渲染完成,从而避免了一些潜在的错误和性能问题。
- 使用PureComponent或shouldComponentUpdate:为了进一步优化性能,可以使用PureComponent或重写shouldComponentUpdate方法来进行浅比较,从而避免不必要的渲染。PureComponent会对props和state进行浅比较,如果它们没有变化,则不会调用render方法。而shouldComponentUpdate方法允许开发者自定义比较逻辑,从而更精细地控制组件的更新。
React的state是如何注入到组件中的?从reducer到组件经历了怎样的过程?
在React和Redux的生态系统中,state从reducer到组件的注入过程是一个高效且清晰的流程。具体过程如下:
- 创建Redux store:通常在应用的入口文件中进行,使用createStore函数并传入一个汇总了所有reducers的组合reducer(rootReducer)来创建Redux store。
- 定义reducer:reducer是一个纯函数,它接收当前的state和一个action,并返回一个新的state。在大型应用中,通常会使用多个reducer来管理不同的状态,并使用combineReducers函数将它们组合起来。
- 触发action:当用户进行某些操作时(如点击按钮),需要触发一个action。这通常在组件中通过dispatch函数来实现。
- 更新state:Redux store接收到action后,会调用对应的reducer来计算新的state。新计算出的state将替换旧的state,并通知所有订阅的组件。
- 组件订阅state:在组件中,可以使用useSelector Hook或connect函数来订阅Redux store中的state。当state更新时,这些组件会重新渲染并显示更新后的数据。
React项目中,使用单向数据流有什么好处?
在React项目中,使用单向数据流具有以下好处:
- 提高可预测性:由于数据只会从父组件流向子组件,开发者可以更容易地追踪数据的变化。这种可预测性有助于调试和理解应用的行为。
- 简化组件结构:单向数据流促使开发者将状态集中在父组件中,并通过props将数据传递给子组件。这样,子组件只关注如何展示这些数据,而不需要关心数据的来源,从而简化了组件的结构。
- 优化渲染过程:由于状态变化是自上而下的,React能够通过虚拟DOM的diff算法快速计算出需要更新的部分,提高了性能。
- 减少数据不一致的风险:单向数据流避免了多个子组件修改父组件的数据而产生矛盾的情况,从而减少了数据不一致的风险。
React的函数式组件是否具有生命周期?为什么?
React的函数式组件在React 16.8版本引入Hooks之后,可以使用Hooks来模拟类组件中的生命周期功能。因此,虽然函数式组件本身没有生命周期方法,但可以通过使用Hooks来实现类似的生命周期效果。
例如,可以使用useEffect Hook来模拟componentDidMount、componentDidUpdate和componentWillUnmount等生命周期方法。useEffect接收一个函数和一个依赖数组作为参数,当依赖数组中的值发生变化时,该函数会被调用。通过巧妙地设置依赖数组和使用useEffect的返回值来清除副作用,可以实现与类组件生命周期方法类似的功能。
为什么不建议过度使用React的Refs?
过度使用React的Refs可能会导致以下问题:
- 破坏组件的封装性:Refs允许父组件直接访问子组件的DOM节点或实例,这可能会破坏组件的封装性,使得组件之间的依赖关系变得复杂和难以维护。
- 增加调试难度:由于Refs绕过了React的更新机制,直接使用它们可能会导致一些难以追踪的bug。此外,当组件树发生变化时(如添加、删除或移动组件),使用Refs的代码可能需要手动更新,从而增加了调试的难度。
- 影响性能:虽然Refs本身不会直接影响性能,但过度使用它们可能会导致不必要的DOM操作或状态更新,从而影响应用的性能。
因此,建议仅在必要时使用Refs,例如处理焦点、文本选择或媒体播放等场景。在这些情况下,Refs提供了一种直接访问DOM节点或组件实例的方法,从而可以更方便地实现所需的功能。
为什么建议React中setstate的第一个参数使用回调函数而不是一个对象?
在React中,setState的第一个参数可以使用一个对象或一个回调函数来指定新的state。虽然使用对象是最常见的方式,但在某些情况下,建议使用回调函数来避免潜在的并发更新问题。
具体来说,当setState被调用时,React会将其放入一个更新队列中,并尽快应用这些更新。然而,如果多个setState调用在短时间内连续发生,它们可能会被合并成一个更新。在这种情况下,如果使用对象来指定新的state,那么这些对象可能会被合并成一个,而合并的方式可能并不是你所期望的。
为了避免这种问题,可以使用回调函数作为setState的第一个参数。回调函数会接收当前的state作为参数,并返回一个新的state对象。由于回调函数是在更新实际发生时被调用的,因此它可以确保基于最新的state来计算新的state值。
此外,使用回调函数还可以避免在setState之前读取state值时的潜在竞态条件问题。因为回调函数是在更新发生时被调用的,所以它可以确保读取到的是最新的state值。
综上所述,虽然使用对象作为setState的第一个参数在大多数情况下是可行的,但在处理并发更新或需要确保基于最新state计算新state值时,建议使用回调函数。
相关文章:
React进阶面试题(四)
React 的 reconciliation(协调)算法 Reconciliation是React的diff算法,用于比较更新前后的虚拟DOM树差异,从而使用最小的代价将原始DOM按照新的状态、属性进行更新。其目的是找出两棵树的差异,原生方式直接比较复杂度…...
24/12/1 算法笔记<强化学习> 创建Maze交互
我们今天制作一个栅格的游戏。 我们直接上代码教学。 1.载入库和查找相应的函数版本 import numpy as np import time import sysif sys.version_info.major 2:import Tkinter as tk else:import tkinter as tk 2.设置长宽和单元格大小 UNIT 40 MAZE_H 4 MAZE_W 4 3.初始…...
Linux驱动开发(10):I2C子系统–mpu6050驱动实验
本章我们以板载MPU6050为例讲解i2c驱动程序的编写,本章主要分为五部分内容。 第一部分,i2c基本知识,回忆i2c物理总线和基本通信协议。 第二部分,linux下的i2c驱动框架。 第三部分,i2c总线驱动代码拆解。 第四部分&a…...
《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》
《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》 一、引言二、K-5S 电化学传感器模组概述(一)产品简介(二)产品特点(三)产品适用场景 三、电化学传感器原理及优点(一…...
如何将多个JS文件打包成一个JS文件?
文章目录 前言SDK 打包安装 webpack创建 webpack.config.js编译命令行遇到的坑点前言 上一篇已经记录了如何开发一个小游戏聚合SDK,既然是SDK,最终都是给外部人员使用的。调研了一下市面上的前端SDK,最终都是编译成一个 js 文件。我猜理由大概是 js 文件之间的调用都是需要…...
100个python经典面试题详解(新版)
应老粉要求,每晚加餐一个最新面试题 包括Python面试中常见的问题,涵盖列表、元组、字符串插值、比较操作符、装饰器、类与对象、函数调用方式、数据结构操作、序列化、数据处理函数等多个方面。 旨在帮助数据科学家和软件工程师准备面试或提升Python技能。 7、Python面试题…...
C#初阶概念理解
梳理了一些本人在学习C#时的一些生疏点,同时也加深自己的印象。 堆&栈 堆用来存储程序运行时产生的变量,当程序结束时释放; 栈用来存储程序运行时,调用方法产生的临时变量,方法运行完成后就会释放…...
node.js基础学习-url模块-url地址处理(二)
前言 前面我们创建了一个HTTP服务器,如果只是简单的http://localhost:3000/about这种链接我们是可以处理的,但是实际运用中一般链接都会带参数,这样的话如果我们只是简单的判断链接来分配数据,就会报404找不到链接。为了解决这个问…...
算法与数据结构(1)
一:数据结构概论 数据结构分为初阶数据结构(主要由C语言实现)和高阶数据结构(由C实现) 初阶数据结构当中,我们会学到顺序表、链表、栈和队列、二叉树、常见排序算法等内容。 高阶数据结构当中࿰…...
FTP介绍与配置
前言: FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时,还可以保证数据传输的可靠性和高效性。 介绍 FTP的应用 在企业网络中部署一台FTP服务器,将网络设备配置为FTP客户端,则可以使用FTP来备份或更新VRP文件和配置文件…...
SQL面试题——抖音SQL面试题 最近一笔有效订单
最近一笔有效订单 题目背景如下,现有订单表order,包含订单ID,订单时间,下单用户,当前订单是否有效 +---------+----------------------+----------+-----------+ | ord_id | ord_time | user_id | is_valid | +---------+----------------------+--------…...
【线程】Java多线程代码案例(1)
【线程】Java多线程代码案例(1) 一、“单例模式” 的实现1.1“饿汉模式”1.2 “懒汉模式”1.3 线程安全问题 二、“阻塞队列”的实现2.1阻塞队列2.2生产者消费者模型2.3 阻塞队列的实现2.4 再谈生产者消费者模型 一、“单例模式” 的实现 “单例模式”即…...
go使用mysql实现增删改查操作
1、安装MySQL驱动 go get -u github.com/go-sql-driver/mysql2、go连接MySQL import ("database/sql""log"_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动 )type Users struct {ID intName stringEmail string }var db *sql.DBfu…...
【Rust】unsafe rust入门
这篇文章简单介绍下unsafe rust的几个要点 1. 解引用裸指针 裸指针其实就是C或者说C的指针,与C的指针不同的是,Rust的裸指针还是要分为可变和不可变,*const T 和 *mut T: 基于引用创建裸指针 let mut num 5;let r1 &num …...
dpwwn02靶场
靶机下载地址:https://download.vulnhub.com/dpwwn/dpwwn-02.zip 信息收集 ip add 查看kali Linux虚拟机的IP为:10.10.10.128 https://vulnhub.com/entry/dpwwn-2,343/中查看靶机的信息,IP固定为10.10.10.10 所以kali Linux添加仅主机网卡…...
K8S疑难概念理解——Pod,应该以哪种Kind来部署应用,为什么不直接Pod这种kind?
文章目录 一、Pod概念深度理解,为什么一般不直接以kindPod资源类型来部署应用?二、究竟应该以哪种资源类型来部署应用 一、Pod概念深度理解,为什么一般不直接以kindPod资源类型来部署应用? Pod是Kubernetes中的最小部署单元,可以包含一个或…...
LabVIEW进行仪器串行通信与模拟信号采集的比较
在现代测试、测量和控制系统中,设备通常采用两种主要方式与计算机进行交互:一种是通过数字通信接口(如RS-232、RS-485、GPIB等),另一种是通过模拟信号(电压、电流)进行数据输出。每种方式具有其…...
D81【 python 接口自动化学习】- python基础之HTTP
day81 requests请求session用法 学习日期:20241127 学习目标:http定义及实战 -- requests请求session用法 学习笔记: requests请求session用法 import requests# 创建一个会话 reqrequests.session() url "http://sellshop.5istud…...
白鹿 Hands-on:消除冷启动——基于 Amazon Lambda SnapStart 轻松打造 Serverless Web 应用(二)
文章目录 前言一、前文回顾二、在 Lambda 上运行2.1、查看 Amazon SAM template2.2、编译和部署到 Amazon Lambda2.3、功能测试与验证 三、对比 Snapstart 效果四、资源清理五、实验总结总结 前言 在这个环节中,我们将延续《白鹿 Hands-on:消除冷启动——…...
ROC曲线
文章目录 前言一、ROC的应用?二、使用方式1. 数据准备2.绘图可视化 前言 在差异分析中,ROC曲线可以用来评估不同组之间的分类性能差异。差异分析旨在比较不同组之间的特征差异,例如在基因表达研究中比较不同基因在不同条件或组织中的表达水平…...
c++ 位图和布隆过滤器
位图(bitmap) 定义 位图是一种使用位数组存储数据的结构。每一位表示一个状态,通常用于快速判断某个值是否存在,或者用来表示布尔类型的集合。 特点 节省空间:一个字节可以表示8个状态。高效操作:位操作…...
阿里云CPU过载的一点思考
现象:阿里云ECS服务器连续5个周期CPU超90%告警 分析: max_connections和max_user_connections都做了限制,但是依然告警,服务器上有四个子服务,查看了每个服务的配置文件,发现使用同一个数据库账号&#x…...
单片机学习笔记 15. 串口通信(理论)
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...
算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
第六章 二叉树part08 今日内容: ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点 详细布置 235. 二叉搜索树的最近公共祖先 相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的…...
Linux history 命令详解
简介 history 命令显示当前 shell 会话中以前执行过的命令列表。这对于无需重新输入命令即可重新调用或重新执行命令特别有用。 示例用法 显示命令历史列表 history# 示例输出如下:1 ls -l 2 cd /var/log 3 cat syslog执行历史记录中的命令 !<number>…...
Kafka知识体系
一、认识Kafka 1. kafka适用场景 消息系统:kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能,还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统:kafka把消息持久化到磁盘上,…...
【Android】EventBus的使用及源码分析
文章目录 介绍优点基本用法线程模式POSTINGMAINMAIN_ORDEREDBACKGROUNDASYNC 黏性事件 源码注册getDefault()registerfindSubscriberMethods小结 postpostStickyunregister 介绍 优点 简化组件之间的通信 解耦事件发送者和接收者在 Activity、Fragment 和后台线程中表现良好避…...
【大数据学习 | Spark调优篇】Spark之内存调优
1. 内存的花费 1)每个Java对象,都有一个对象头,会占用16个字节,主要是包括了一些对象的元信息,比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个int类型的field,那么它的对象头实…...
Linux:文件系统inode
早期,存储文件的设备是磁盘(当下的市场几乎都是SSD),但大家习惯的把它们都称为磁盘,磁盘是用来表示区分内存的存储设备。而在操作系统看来,这个存储设备的结构就是一个线性结构,这一点很重要。 …...
力扣难题解析
滑动窗口问题 76.最小覆盖子串 题目链接:76. 最小覆盖子串 - 力扣(LeetCode) 题目描述: 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空…...
为什么很少用python做网站/百度竞价代运营公司
http://www.xue5.com/Mobile/iOS/623776.html...
wordpress竞争/软件推广
项目介绍 一款 PHP 语言基于 Laravel5.8、Layui、MySQL等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,框架自研了一套个性化的组件&…...
wordpress百家主题/竞价推广教程
1、先查看需要收缩文件系统的使用情况,收缩后的文件系统空间不能小于已经使用的空间df -hT2、卸载需要收缩的文件系统(以/dev/vg0/lvm1为例)umount /dev/vg0/lvm13、检测文件系统是否有发生错误:e2fsck -f /dev/vg0/lvm14、缩小文件系统容量,…...
wordpress备案号添加到哪里/免费网页在线客服系统
如果您是创建类的人,则可以在实例化类时简单地存储弱引用:import weakref class A(object): instances = [] def __init__(self): A.instances.append(weakref.ref(self)) a, b, c = A(), A(), A() instances = [ref() for ref in A.instances if ref() is not None] 使用弱引…...
招投标信息查询平台/seo排名点击报价
转载于:https://www.cnblogs.com/6DAN_HUST/archive/2012/08/19/2646715.html...
深圳龙岗做网站的公司哪家好/网页制作流程
只要你的心属于我 ——代腾飞 2008年2月20日 于成都 轻舟厌倦了漂泊 停靠在海口赖着不走 秋风吹散着叶落 昔日往事哪堪能回首 你说你已经厌倦了你我的生活 你要去追逐你想要的幸福快乐 我除了沉默还能怎么说 只能轻轻地松开你的手 强忍泪水、乔装洒脱 迎着你的背影往回走 也许…...