当前位置: 首页 > news >正文

JavaScript设计模式 -- 观察者模式

在实际开发中,经常会遇到这样一种需求:当某个对象状态发生改变时,需要自动通知并更新其他相关对象。观察者模式(Observer Pattern)正是为了解决这一问题而设计的,它定义了一种一对多的依赖关系,让多个观察者对象在被观察对象状态改变时自动收到通知并作出相应更新。

本文将详细介绍观察者模式的基本概念、核心结构和优缺点,并通过多个 JavaScript 示例展示如何在不同场景下灵活运用观察者模式,从简单的事件订阅到复杂的实时数据更新,全面提升系统的解耦性和可维护性。

观察者模式简介

观察者模式是一种行为型设计模式,其主要目的是实现对象间的解耦。当一个对象(被观察者、Subject)的状态发生变化时,所有依赖于它的对象(观察者、Observer)都会收到通知,并自动更新。这种模式广泛应用于事件驱动、UI 数据绑定、实时数据推送等场景。

例如,在前端开发中,当数据模型变化时,视图(观察者)需要自动更新;在实时系统中,当数据源更新时,所有订阅了该数据的组件都能即时获得更新。


观察者模式的核心结构

观察者模式主要包含以下角色:

  • 被观察者(Subject)
    管理一组观察者,当自身状态发生变化时,通知所有注册的观察者。

  • 观察者(Observer)
    定义一个更新接口,供被观察者调用,从而在状态变化时作出响应。

  • 通知机制
    被观察者在状态发生变化时,通过遍历通知所有已注册的观察者,通常传递更新数据。

这种设计方式使得被观察者与观察者之间松散耦合,每个观察者只需关注自身的更新逻辑,被观察者不必了解具体观察者的实现细节。


JavaScript 实现示例

示例 1:简单的事件订阅与通知

下面通过一个简单的示例展示如何使用观察者模式实现事件订阅与通知。定义一个 Subject 类用于管理观察者,观察者通过实现 update 方法来响应通知。

// 被观察者类(Subject)
class Subject {constructor() {this.observers = [];}// 注册观察者subscribe(observer) {this.observers.push(observer);}// 取消注册观察者unsubscribe(observer) {this.observers = this.observers.filter(obs => obs !== observer);}// 通知所有观察者notify(data) {this.observers.forEach(observer => observer.update(data));}
}// 观察者类(Observer)
class Observer {constructor(name) {this.name = name;}// 当被观察者状态改变时调用update(data) {console.log(`${this.name} 收到通知:`, data);}
}// 客户端调用示例
const subject = new Subject();const observerA = new Observer('观察者 A');
const observerB = new Observer('观察者 B');subject.subscribe(observerA);
subject.subscribe(observerB);subject.notify('状态发生变化!');
// 控制台输出:
// 观察者 A 收到通知: 状态发生变化!
// 观察者 B 收到通知: 状态发生变化!

在这个示例中,被观察者 Subject 管理一个观察者列表,当调用 notify 方法时,所有已注册的观察者都会依次调用各自的 update 方法接收通知。


示例 2:构建事件总线(Event Bus)

在大型应用中,我们常常需要一个全局事件总线来实现组件间的通信。利用观察者模式可以很容易地构建一个简洁的事件总线。

// 简单的 Event Bus 实现
class EventBus {constructor() {this.events = {};}// 注册事件监听on(event, listener) {if (!this.events[event]) {this.events[event] = [];}this.events[event].push(listener);}// 取消事件监听off(event, listener) {if (!this.events[event]) return;this.events[event] = this.events[event].filter(l => l !== listener);}// 触发事件emit(event, data) {if (!this.events[event]) return;this.events[event].forEach(listener => listener(data));}
}// 客户端调用示例
const bus = new EventBus();function handleData(data) {console.log('事件接收:', data);
}bus.on('dataUpdate', handleData);bus.emit('dataUpdate', { value: 42 });
// 控制台输出:事件接收: { value: 42 }bus.off('dataUpdate', handleData);
bus.emit('dataUpdate', { value: 100 });
// 此时不会有输出

通过上述 EventBus,各个模块可以在不直接依赖彼此的情况下,完成消息订阅和发布,实现模块间的解耦通信。


示例 3:UI 数据绑定与自动更新

在前端开发中,观察者模式常用于数据绑定,当模型数据发生变化时自动更新视图。下面通过一个简单示例模拟数据变化与 UI 更新的过程。

// 模拟数据模型:被观察者
class DataModel {constructor() {this.data = null;this.observers = [];}// 注册视图观察者addObserver(observer) {this.observers.push(observer);}// 通知所有视图更新notifyObservers() {this.observers.forEach(observer => observer.update(this.data));}// 更新数据并通知视图setData(newData) {this.data = newData;this.notifyObservers();}
}// 模拟视图观察者
class View {constructor(id) {this.id = id;}update(data) {console.log(`视图 ${this.id} 更新:`, data);}
}// 客户端调用示例
const model = new DataModel();
const view1 = new View(1);
const view2 = new View(2);model.addObserver(view1);
model.addObserver(view2);model.setData({ message: 'Hello, World!' });
// 控制台输出:
// 视图 1 更新: { message: 'Hello, World!' }
// 视图 2 更新: { message: 'Hello, World!' }

通过这种方式,当数据模型变化时,所有注册的视图都会自动更新,模拟了 MVVM 框架中数据与视图绑定的效果。


示例 4:股票行情实时更新系统

在金融应用中,实时获取股票行情数据至关重要。利用观察者模式,可以构建一个股票行情更新系统,所有订阅该股票的组件都会在数据变化时收到更新。

// 股票行情数据源(被观察者)
class StockTicker {constructor() {this.observers = [];}subscribe(observer) {this.observers.push(observer);}unsubscribe(observer) {this.observers = this.observers.filter(obs => obs !== observer);}// 模拟数据更新updatePrice(price) {console.log(`股票价格更新为:${price}`);this.notify(price);}notify(price) {this.observers.forEach(observer => observer.update(price));}
}// 订阅者:展示股票价格的组件
class StockDisplay {constructor(name) {this.name = name;}update(price) {console.log(`${this.name} 显示股票价格:${price}`);}
}// 客户端调用示例
const ticker = new StockTicker();
const displayA = new StockDisplay('显示器 A');
const displayB = new StockDisplay('显示器 B');ticker.subscribe(displayA);
ticker.subscribe(displayB);ticker.updatePrice(150.25);
// 控制台输出:
// 股票价格更新为:150.25
// 显示器 A 显示股票价格:150.25
// 显示器 B 显示股票价格:150.25

这种模式使得股票行情数据源与多个显示组件解耦,任何数据更新都会即时通知所有订阅者,实现实时更新。


观察者模式的优缺点

优点

  • 解耦性好:被观察者与观察者之间通过抽象接口解耦,易于扩展和维护。
  • 动态关系:可以在运行时动态增加或移除观察者,灵活应对业务需求变化。
  • 易于扩展:新增加的观察者只需实现更新接口即可参与通知过程。

缺点

  • 通知开销:当观察者数量较多时,通知所有观察者可能会带来性能开销。
  • 依赖管理:如果观察者之间存在复杂依赖关系,可能会导致难以管理通知顺序或出现循环依赖问题。
  • 调试困难:由于通知过程是隐式的,问题定位和调试可能较为复杂。

实际应用场景

观察者模式被广泛应用于以下场景:

  • 前端框架的数据绑定:如 Vue、React 等框架使用观察者模式实现数据与视图的双向绑定。
  • 事件系统:浏览器中的事件处理、Node.js 的 EventEmitter 以及全局事件总线均基于观察者模式。
  • 实时数据推送:如股票行情、天气预报、社交媒体通知等实时更新系统。
  • 消息中间件:在分布式系统中,观察者模式可用于构建发布/订阅消息队列,实现松耦合组件通信。

总结

观察者模式通过建立一对多的依赖关系,使得对象间的状态更新和通知变得简单而灵活。本文详细介绍了观察者模式的基本概念与结构,并通过多个 JavaScript 示例(包括简单事件订阅、事件总线、UI 数据绑定、实时行情更新等)展示了如何在不同场景下使用该模式实现解耦与实时通信。掌握观察者模式不仅有助于提高代码的模块化和扩展性,更能在实际项目中构建健壮、高效的通知机制。

希望这篇文章能帮助你深入理解观察者模式,并在实际开发中灵活运用这一设计模式。如果你有任何疑问或建议,欢迎在评论区交流分享!

相关文章:

JavaScript设计模式 -- 观察者模式

在实际开发中,经常会遇到这样一种需求:当某个对象状态发生改变时,需要自动通知并更新其他相关对象。观察者模式(Observer Pattern)正是为了解决这一问题而设计的,它定义了一种一对多的依赖关系,…...

DeepSeek AI 满血版功能集成到WPS或Microsoft Office中

DeepSeek AI集成到 WPS或Microsoft Office中, 由于deepseek被攻击或者非常繁忙导致超时的服务器,所以可以用硅基流动部署的DeepSeek 。当然用官网的也可以。 使用 OfficeAI 插件集成(wps为例): 下载并安装 OfficeAI 插件:从可靠的软件下载平台…...

单调队列与栈

一.题 1. 思路&#xff1a; 构建小压大的单调递减栈&#xff0c;对于每个栈的元素都进行处理并加到结果上 class Solution { public:int sumSubarrayMins(vector<int>& arr) {int stk[10000000],top 0;long long ans 0;for(int i 0;i<arr.size();i){while(top…...

阿里云sls查询两种查询方式学习:SQL查询和SPL 查询

一、阿里云日志服务 SPL 语法归纳 1. SPL 简介 SPL&#xff08;Search Processing Language&#xff09;用于查询和处理日志数据&#xff0c;支持检索、过滤、分析日志。 2. 基本查询语法 查询所有日志&#xff1a;* 条件过滤&#xff1a;response_status: error 多条件查…...

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析①】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase01 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月14日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-001测试用例 用例ID测试场景验证要点参考条款预期…...

从技术债务到架构升级,滴滴国际化外卖的变革

背 景 商家营销简述 在外卖平台的运营中&#xff0c;我们致力于通过灵活的补贴策略激励商家&#xff0c;与商家共同打造良好的合作关系&#xff0c;也会提供多样化的营销活动&#xff0c;帮助商家吸引更多用户下单。通过这些活动&#xff0c;不仅能够提高商家的销量&#xff0c…...

第J2周:ResNet50V2算法实战与解析

文章目录 一、准备工作1.设置GPU2.导入数据3.查看数据 二、数据预处理1.加载数据2.可视化数据 总结 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、准备工作 1.设置GPU import tensorflow as tf gpus …...

如何使用 HPjtune 分析 Java GC 日志并优化 JVM 性能

HPjtune 是一款用于分析 Java 应用程序垃圾回收&#xff08;GC&#xff09;日志的工具&#xff0c;主要用于优化 JVM 性能。虽然 HPjtune 本身并不直接生成 HTML 格式的报告&#xff0c;但可以通过结合其他工具或方法将分析结果导出为 HTML 格式。以下是实现这一目标的步骤和方…...

【MySQL在Centos 7环境安装】

文章目录 一. 卸载不必要的环境二. 检查系统安装包三. 卸载这些默认安装包四. 获取mysql官⽅yum源五. 安装mysql yum 源&#xff0c;对⽐前后yum源六. 看看能不能正常⼯作七. 安装mysql服务八. .查看配置⽂件和数据存储位置九. 启动服务并查看服务是否存在十. 登陆⽅法十一. 设…...

PostgreSQL技术内幕25:时序数据库插件TimescaleDB

文章目录 0.简介1.基础知识1.1 背景1.2 概念1.3 特点 2.TimescaleDB2.1 安装使用2.1 文件结构2.2 原理2.2.1 整体结构2.2.2 超表2.2.3 自动分区2.2.4 数据写入与查询优化2.2.5 数据保留策略2.2.6 更多特性 0.简介 现今时序数据库的应用场景十分广泛&#xff0c;其通过保留时间…...

Flask Web开发的重要概念和示例

一口气列举Flask Web应用的所有概念和示例 Flask Web 应用基本框架 路由(Routing) 模版(Template) request 对象 JSON 数据处理 redirect 示例 文件上传示例 文件下载示例 Session 示例 Cookie操作 Flask Web 应用基本框架 这是一个 最基础的 Flask Web 应用,…...

使用pocketpal-ai在手机上搭建本地AI聊天环境

1、下载安装pocketpal-ai 安装github的release APK 2、安装大模型 搜索并下载模型&#xff0c;没找到deepseek官方的&#xff0c;因为海外的开发者上传了一堆乱七八糟的deepseek qwen模型&#xff0c;导致根本找不到官方上传的……deepseek一开源他们觉得自己又行了。 点击之…...

后台终端方法

使用tmux实现终端后台运行 首先&#xff0c;在Linux系统上安装tmux sudo apt install tmux使用方法&#xff1a; 创建终端 #直接创建 tmux #自定义名称 tmux new -s {name}退出tmux终端&#xff1a;Ctrlb 之后 d 退出后查看后台终端&#xff1a; tmux ls abc: 1 windows (cr…...

为什么vue3需要对引入的组件使用markRaw?

在Vue 3中&#xff0c;对引入的组件使用markRaw的主要原因是为了避免Vue的响应式系统对该组件实例进行不必要的代理和追踪。Vue 3的响应式系统是基于Proxy实现的&#xff0c;它会对数据进行代理以追踪其变化&#xff0c;并在数据变化时自动更新视图。然而&#xff0c;在某些情况…...

AWS上基于Llama 3模型检测Amazon Redshift里文本数据的语法和语义错误的设计方案

一、技术栈选型 核心服务&#xff1a; Amazon Redshift&#xff1a;存储原始文本和检测结果Amazon Bedrock&#xff1a;托管Llama 3 70B模型AWS Lambda&#xff1a;无服务计算&#xff08;Python运行时&#xff09;Amazon S3&#xff1a;中间数据存储AWS Step Functions&…...

深度学习-114-大语言模型应用之提示词指南实例DeepSeek使用手册(三)

文章目录 1 提示词指南1.1 生成模型提示词1.2 角色扮演1.3 文案大纲生成1.4 情景续写1.5 宣传标语生成1.6 中英翻译专家1.7 诗歌创作1.8 结构化输出1.9 内容分类1.10 散文写作1.11 代码生成1.12 代码改写1.13 代码解释2 不同类型的提示词2.1 营销推广类(5个)2.2 内容创作类(24个…...

Springboot_实战

项目开发 lombok使用 自动为实体类提供get、set、toString方法 引入依赖 实体类上添加注解 统一响应结果 注意要写get、set方法&#xff1b;下面是错误的&#xff0c;因此要加上Data注解 一个注册的接口的示例 Controller层 Service层 Mapper层 参数校验 但是同样存在一…...

【第5章:深度生成模型— 5.4 深度生成模型前沿全景:从Diffusion到多模态,揭秘AI生成技术的未来】

生成模型正在经历一场前所未有的革命!从震惊AI圈的DALLE 2到刷屏朋友圈的Stable Diffusion,这些模型展现出的创造力已经突破了我们的想象边界。今天,我们就来一场深度探索之旅,揭开生成模型最前沿研究的神秘面纱,看看AI生成技术的未来会走向何方。 (本文包含大量前沿技术…...

【微服务学习二】nacos服务发现与负载均衡

nacos服务发现 想要开启服务发现&#xff0c;需要在main函数上添加 EnableDiscoveryClient 注解 然后我们编写一个controller类来查询nacos中注册的所有微服务以及对应的ip端口号 Controller public class DiscoveryController {AutowiredDiscoveryClient discoveryClient;//…...

信息安全管理(3):网络安全

1 网络的定义和特征 1.1 网络的定义 &#xff08;根本懒得说。。你们自己wiki吧&#xff09; 网络的用处 What is a network…Devices in a network…LAN, WAN and InternetworksWhat do networks do for you… Sharing resourcesUse/share applications 1.2 网络的特征 C…...

如何设置linux系统时间?

在 Linux 系统中&#xff0c;可以通过不同的方法来设置系统时间&#xff0c;下面详细介绍几种常见的方式。 目录 方法一&#xff1a;使用date命令手动设置时间 方法二&#xff1a;同步硬件时钟&#xff08;BIOS 时钟&#xff09; 方法三&#xff1a;使用timedatectl命令设置…...

ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、环境信息二、部署步骤2.1 基础环境准备2.2 各节点docker环境安装2.3 搭建互信集群2.4 下载ceph-ansible 三、配置部署文件3.1 使用本地docker3.2 配置hosts…...

几款C#开发的入门书籍与视频教程

以下是几本适合C#初学者的书籍和一些优质的视频教程推荐&#xff0c;帮助你快速入门C#开发&#xff1a; 书籍推荐 1. 《C#入门经典》 • 作者&#xff1a;Karli Watson, Christian Nagel 等 • 特点&#xff1a;经典的C#入门书籍&#xff0c;内容全面&#xff0c;从基础语法到…...

XZ_Mac电脑上本地化部署DeepSeek的详细步骤

根据您的需求&#xff0c;以下是Mac电脑上本地化部署DeepSeek的详细步骤&#xff1a; 一、下载并安装Ollama 访问Ollama官网&#xff1a; 打开浏览器&#xff0c;访问 Ollama官网。 下载Ollama&#xff1a; 在官网中找到并点击“Download”按钮&#xff0c;选择适合Mac系统的…...

el-input输入框样式修改

el-input输入框样式修改 目的&#xff1a;蓝色边框去掉、右下角黑色去掉(可能看不清楚) 之前我试过deep不行 最有效的办法就是就是在底部添加一下css文件 代码中针对input的type为textarea&#xff0c;对于非textarea&#xff0c;只需将下面的css样式中的textarea替换成input…...

Promise的三种状态

目录 代码示例 HTML JavaScript 代码&#xff1a; 代码解释 总结 在 JavaScript 中&#xff0c;Promise 是一种异步编程的解决方案&#xff0c;它用于表示异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。Promise 主要有三种状态&#xff1a; Pending&#…...

探秘AES加密算法:多种Transformation全解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

Python深度学习代做目标检测NLP计算机视觉强化学习

了解您的需求&#xff0c;您似乎在寻找关于Python深度学习领域的代做服务&#xff0c;特别是在目标检测、自然语言处理&#xff08;NLP&#xff09;、计算机视觉以及强化学习方面。以下是一些关于这些领域的概述以及寻找相关服务的建议。 1. Python深度学习代做概述 目标检测&…...

10款视频无损压缩软件介绍(deepseek汇总)

在如今这个视频创作与分享盛行的时代&#xff0c;大家时常面临视频文件过大、占空间多、传输不便的困扰。无损压缩软件就能帮上大忙&#xff0c;既能缩减视频体积&#xff0c;又能保证画质不受损。下面就给大家详细介绍 10 款好用的视频无损压缩软件。 视频无损压缩工具一&…...

rv1103b编译opencv

opencv-3.4.16&#xff0c;png的neon会报错&#xff0c;如果想开可以参考 https://blog.csdn.net/m0_60827485/article/details/137561429 rm -rf build mkdir build cd build cmake -DCMAKE_BUILD_TYPERELEASE \ -DCMAKE_C_COMPILERxxx/arm-rockchip831-linux-uclibcgnueabih…...

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法&#xff0c;在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力&#xff0c;而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下&#xff0c;自动对焦可能会失效&#xff0c;从而影响细胞…...

C++ 中的继承与派生

在 C 中&#xff0c;继承与派生是面向对象编程的重要特性&#xff0c;它们允许创建新类&#xff08;派生类&#xff09;来复用现有类&#xff08;基类&#xff09;的属性和方法&#xff0c;同时还能添加新的功能或修改现有功能&#xff0c;下面为你详细介绍。 基本概念 继承&…...

数据结构:哈夫曼树

1.概念 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种用于数据压缩的二叉树&#xff0c;由大卫哈夫曼&#xff08;David A. Huffman&#xff09;于1952年提出。它通过构建最优二叉树来实现数据的高效压缩&#xff0c;广泛应用于文件压缩、图像压缩等领域。 哈夫曼树的…...

2025年 Java 面试八股文

第一章-Java基础篇 1. Java中的基本数据类型有哪些&#xff1f;⭐ Java中有8种基本数据类型&#xff08;Primitive Types&#xff09;&#xff0c;分别是&#xff1a; byte&#xff1a;8位&#xff0c;-128 ~ 127short&#xff1a;16位&#xff0c;-32,768 ~ 32,767int&…...

Linux 内核 IPoIB 驱动中 sysfs 属性冲突问题的分析与解决

一、引言 在 Linux 内核的设备驱动开发中,sysfs 文件系统是一种重要的机制,用于向用户空间暴露内核对象的属性信息。通过 sysfs,用户空间程序可以读取或修改设备的属性,从而实现对硬件设备的监控和配置。然而,在实际开发中,可能会遇到 sysfs 属性冲突的问题,特别是在复…...

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…...

鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍

鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍 1.1 Localstorage的概念 LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例&#xff0c;LocalStorage也可以在UIAbility内&#xff0c;页面间共享状态 1.2 Lo…...

Mysql中使用sql语句生成雪花算法Id

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

android的第一个app项目(java版)

一.学习java重要概念 java的基本类型的语言方法和C语言很像&#xff0c;这都是我们要学的东西和学过的东西。那些基础东西&#xff0c;就不和大家讨论了&#xff0c;一起看一下java的一些知识架构。 1.封装 封装是面向对象编程中的一个核心概念&#xff0c;它涉及到将数据和操…...

第6章 6.2使用ASP.NET Core 开发WebAPI ASP.NET Core Web API

6.2.1 Web API项目的搭建 进入VS&#xff0c;【创建新项目】&#xff0c;选择【ASP.NET Core Web API】模板&#xff0c;【下一步】&#xff0c;编辑项目名称及项目位置&#xff0c;【下一步】&#xff0c;选择框架&#xff0c;其他选项默认即可&#xff0c;【创建】。 进入项…...

常见的网络协议汇总(涵盖了不同的网络层次)

网络层协议 IP协议&#xff1a;IP指网际互连协议&#xff08;Internet Protocol&#xff09;&#xff0c;是TCP/IP体系中的网络层协议。IP协议包括IPv4和IPv6&#xff0c;用于为数据包提供源地址和目标地址&#xff0c;从而实现网络通信。ICMP协议&#xff1a;ICMP&#xff08…...

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…...

嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc

EasyRTC已经完美支持海思hi3516cv610&#xff0c;编译器arm-v01c02-linux-musleabi-gcc&#xff0c;总体SDK大小控制在680K以内&#xff08;预计还能压缩100K上下&#xff09;&#xff1a; EasyRTC在hi3516cv610芯片上能双向通话、发送文字以及二进制指令&#xff0c;总体运行…...

自然语言处理NLP入门 -- 第四节文本分类

目标 本章的目标是帮助你理解文本分类的基本概念&#xff0c;并通过具体示例学习如何使用 scikit-learn 训练文本分类模型&#xff0c;以及如何利用 OpenAI API 进行文本分类。 5.1 什么是文本分类&#xff1f; 文本分类&#xff08;Text Classification&#xff09;是自然语…...

深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组

在工业控制、机器人编程和物联网等领域&#xff0c;我们经常需要让C#这样的托管语言与C/C编写的底层库进行交互。在这个过程中&#xff0c;遇到需要传递多维数组的场景时&#xff0c;许多开发者会意外遭遇System.Runtime.InteropServices.MarshalDirectiveException异常。本文将…...

Spring Boot全局异常处理终极指南:从青铜到王者的实战演进

一、为什么需要全局异常处理&#xff1f; 在用户中心这类核心服务中&#xff0c;优雅的异常处理是系统健壮性的生命线。未处理的异常会导致&#xff1a; 服务雪崩&#xff1a;单点异常扩散到整个系统&#xff08;✖️&#xff09;信息泄露&#xff1a;暴露敏感堆栈信息&#…...

【Elasticsearch】match_bool_prefix查询

match_bool_prefix查询是 Elasticsearch 中一种用于全文搜索的查询方式&#xff0c;适用于需要同时匹配多个词汇&#xff0c;但词汇顺序不固定的情况&#xff0c;它结合了布尔查询&#xff08;bool&#xff09;和前缀查询&#xff08;prefix&#xff09;的功能&#xff0c;适用…...

Unity-Mirror网络框架-从入门到精通之Multiple Additive Scenes示例

文章目录 前言Multiple Additive Scenes示例Additive Scenes示例MultiSceneNetManagerPhysicsCollisionRewardSpawner总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题…...

[开源]MaxKb+Ollama 构建RAG私有化知识库

MaxKbOllama&#xff0c;基于RAG方案构专属私有知识库 关于RAG工作原理实现方案 一、什么是MaxKb&#xff1f;二、MaxKb的核心功能三、MaxKb的安装与使用四、MaxKb的适用场景五、安装方案、 docker版Docker Desktop安装配置MaxKb安装和配置 总结和问题 MaxKB 是一款基于 LLM 大…...

Ubuntu 下 nginx-1.24.0 源码分析 - NGX_HAVE_GETTIMEZONE 宏

表示当前平台支持通过 gettimezone() 直接获取时区偏移值&#xff08;以分钟为单位&#xff09; 该宏用于适配不同操作系统对时区信息获取方式的差异。 当 NGX_HAVE_GETTIMEZONE 被定义时&#xff0c;Nginx 会调用 ngx_gettimezone() 获取时区偏移 在 Ubuntu 环境下&#xff0c…...