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

聊聊Spring AI Alibaba的ElasticsearchDocumentReader

本文主要研究一下Spring AI Alibaba的ElasticsearchDocumentReader

ElasticsearchDocumentReader

community/document-readers/spring-ai-alibaba-starter-document-reader-elasticsearch/src/main/java/com/alibaba/cloud/ai/document/reader/es/ElasticsearchDocumentReader.java

public class ElasticsearchDocumentReader implements DocumentReader {private final ElasticsearchConfig config;private final ElasticsearchClient client;/*** Constructor that initializes the Elasticsearch client with the provided* configuration.* @param config The Elasticsearch configuration*/public ElasticsearchDocumentReader(ElasticsearchConfig config) {this.config = config;try {this.client = createClient();}catch (Exception e) {throw new RuntimeException("Failed to create Elasticsearch client", e);}}@Overridepublic List<Document> get() {try {// Get all documentsSearchResponse<Map> response = client.search(s -> s.index(config.getIndex()).query(q -> q.matchAll(m -> m)).size(config.getMaxResults()),Map.class);return getDocuments(response);}catch (IOException e) {throw new RuntimeException("Failed to get documents from Elasticsearch", e);}}@NotNullprivate List<Document> getDocuments(SearchResponse<Map> response) {List<Document> documents = new ArrayList<>();response.hits().hits().forEach(hit -> {Map<String, Object> source = hit.source();if (source != null) {Document document = new Document(source.getOrDefault(config.getQueryField(), "").toString(), source);documents.add(document);}});return documents;}/*** Get a document by its ID.* @param id The document ID* @return The document if found, null otherwise*/public Document getById(String id) {try {var response = client.get(g -> g.index(config.getIndex()).id(id), Map.class);if (!response.found() || response.source() == null) {return null;}return new Document(response.source().getOrDefault(config.getQueryField(), "").toString(),response.source());}catch (IOException e) {throw new RuntimeException("Failed to get document from Elasticsearch with id: " + id, e);}}/*** Read documents matching the specified query.* @param query The search query* @return List of matching documents*/public List<Document> readWithQuery(String query) {try {// Build the search request with querySearchResponse<Map> response = client.search(s -> s.index(config.getIndex()).query(q -> q.match(new MatchQuery.Builder().field(config.getQueryField()).query(query).build())).size(config.getMaxResults()), Map.class);return getDocuments(response);}catch (IOException e) {throw new RuntimeException("Failed to read documents from Elasticsearch with query: " + query, e);}}private ElasticsearchClient createClient()throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {// Create HttpHosts for all nodesHttpHost[] httpHosts;if (!CollectionUtils.isEmpty(config.getNodes())) {httpHosts = config.getNodes().stream().map(node -> {String[] parts = node.split(":");return new HttpHost(parts[0], Integer.parseInt(parts[1]), config.getScheme());}).toArray(HttpHost[]::new);}else {// Fallback to single node configurationhttpHosts = new HttpHost[] { new HttpHost(config.getHost(), config.getPort(), config.getScheme()) };}var restClientBuilder = RestClient.builder(httpHosts);// Add authentication if credentials are providedif (StringUtils.hasText(config.getUsername()) && StringUtils.hasText(config.getPassword())) {CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(config.getUsername(), config.getPassword()));// Create SSL context if using HTTPSif ("https".equalsIgnoreCase(config.getScheme())) {SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(null, (chains, authType) -> true).build();restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider).setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));}else {restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));}}// Create the transport and clientElasticsearchTransport transport = new RestClientTransport(restClientBuilder.build(), new JacksonJsonpMapper());return new ElasticsearchClient(transport);}}

ElasticsearchDocumentReader使用elasticsearch官方的ElasticsearchClient去读取数据,它默认读取指定索引的10条记录,并将指定字段的内容作为document的内容

示例

@EnabledIfEnvironmentVariable(named = "ES_HOST", matches = ".+")
public class ElasticsearchDocumentReaderTest {private static final String TEST_INDEX = "spring-ai-test";private static final String TEST_DOC_ID = "1";// Get ES configuration from environment variables, use defaults if not setprivate static final String ES_HOST = System.getenv("ES_HOST") != null ? System.getenv("ES_HOST") : "localhost";private static final int ES_PORT = System.getenv("ES_PORT") != null ? Integer.parseInt(System.getenv("ES_PORT")): 9200;private static final String ES_USERNAME = System.getenv("ES_USERNAME") != null ? System.getenv("ES_USERNAME"): "elastic";private static final String ES_PASSWORD = System.getenv("ES_PASSWORD") != null ? System.getenv("ES_PASSWORD"): "r-tooRd7RgrX_uZV0klZ";private static final String ES_SCHEME = System.getenv("ES_SCHEME") != null ? System.getenv("ES_SCHEME") : "https";private static ElasticsearchClient client;private static ElasticsearchDocumentReader reader;private static ElasticsearchDocumentReader clusterReader;// Flag to indicate if ES is availableprivate static boolean esAvailable = false;static {if (System.getenv("ES_HOST") == null) {System.out.println("ES_HOST environment variable is not set. Tests will be skipped.");}}/*** Check if Elasticsearch is available* @return true if ES is available, false otherwise*/public static boolean isElasticsearchAvailable() {return esAvailable;}/*** Try to connect to Elasticsearch* @return true if connection successful, false otherwise*/private static boolean canConnectToElasticsearch() {try (Socket socket = new Socket()) {socket.connect(new InetSocketAddress(ES_HOST, ES_PORT), 1000);return true;}catch (Exception e) {System.out.println("Cannot connect to Elasticsearch: " + e.getMessage());return false;}}@BeforeAllstatic void setUp() throws IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {// Check if ES_HOST environment variable is setString esHost = System.getenv("ES_HOST");assumeTrue(esHost != null && !esHost.isEmpty(),"Skipping test because ES_HOST environment variable is not set");// Check if we can connect to ESesAvailable = canConnectToElasticsearch();// Skip setup if ES is not availableif (!esAvailable) {System.out.println("Skipping Elasticsearch tests because ES server is not available: " + ES_HOST + ":" + ES_PORT);return;}try {// Create SSL context that trusts all certificatesSSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial(null, (chains, authType) -> true).build();// Create client with authentication and SSLCredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(ES_USERNAME, ES_PASSWORD));RestClient restClient = RestClient.builder(new HttpHost(ES_HOST, ES_PORT, ES_SCHEME)).setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider).setSSLContext(sslContext).setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)).build();client = new ElasticsearchClient(new RestClientTransport(restClient, new JacksonJsonpMapper()));// Delete index if existsboolean indexExists = client.indices().exists(e -> e.index(TEST_INDEX)).value();if (indexExists) {DeleteIndexResponse deleteResponse = client.indices().delete(c -> c.index(TEST_INDEX));assertThat(deleteResponse.acknowledged()).isTrue();}// Create test index with mappingCreateIndexResponse createResponse = client.indices().create(c -> c.index(TEST_INDEX).mappings(m -> m.properties("content", p -> p.text(t -> t.analyzer("standard"))).properties("title", p -> p.keyword(k -> k))));assertThat(createResponse.acknowledged()).isTrue();// Configure and create single node readerElasticsearchConfig config = new ElasticsearchConfig();config.setHost(ES_HOST);config.setPort(ES_PORT);config.setIndex(TEST_INDEX);config.setQueryField("content");config.setUsername(ES_USERNAME);config.setPassword(ES_PASSWORD);config.setScheme(ES_SCHEME);reader = new ElasticsearchDocumentReader(config);// Configure and create cluster readerElasticsearchConfig clusterConfig = new ElasticsearchConfig();clusterConfig.setNodes(Arrays.asList(ES_HOST + ":" + ES_PORT, ES_HOST + ":9201", ES_HOST + ":9202"));clusterConfig.setIndex(TEST_INDEX);clusterConfig.setQueryField("content");clusterConfig.setUsername(ES_USERNAME);clusterConfig.setPassword(ES_PASSWORD);clusterConfig.setScheme(ES_SCHEME);clusterReader = new ElasticsearchDocumentReader(clusterConfig);// Index test documentsindexTestDocuments();}catch (Exception e) {System.out.println("Failed to set up Elasticsearch test environment: " + e.getMessage());esAvailable = false;}}@AfterAllstatic void tearDown() throws IOException {// Skip cleanup if ES is not available or client is nullif (!esAvailable || client == null) {return;}try {DeleteIndexResponse deleteResponse = client.indices().delete(c -> c.index(TEST_INDEX));assertThat(deleteResponse.acknowledged()).isTrue();}catch (Exception e) {System.out.println("Failed to clean up Elasticsearch test environment: " + e.getMessage());}}@Test@EnabledIf("isElasticsearchAvailable")void testGet() {List<Document> documents = reader.get();assertThat(documents).hasSize(3);assertThat(documents.get(0).getText()).contains("Spring Framework");assertThat(documents.get(0).getMetadata()).containsKey("title");}//......private static void indexTestDocuments() throws IOException {// First documentMap<String, Object> doc1 = new HashMap<>();doc1.put("content", "Spring Framework is the most popular application development framework for Java.");doc1.put("title", "Spring Introduction");client.index(i -> i.index(TEST_INDEX).id(TEST_DOC_ID).document(doc1));// Second documentMap<String, Object> doc2 = new HashMap<>();doc2.put("content","Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications.");doc2.put("title", "Spring Boot Guide");client.index(i -> i.index(TEST_INDEX).document(doc2));// Third documentMap<String, Object> doc3 = new HashMap<>();doc3.put("content", "Java is a popular programming language and platform.");doc3.put("title", "Java Programming");client.index(i -> i.index(TEST_INDEX).document(doc3));// Refresh index to make documents searchableclient.indices().refresh();}}	

这里ElasticsearchConfig指定了读取content字段

小结

spring-ai-alibaba-starter-document-reader-elasticsearch提供了ElasticsearchDocumentReader用于读取es文档的指定字段作为document的内容。

doc

  • java2ai

相关文章:

聊聊Spring AI Alibaba的ElasticsearchDocumentReader

序 本文主要研究一下Spring AI Alibaba的ElasticsearchDocumentReader ElasticsearchDocumentReader community/document-readers/spring-ai-alibaba-starter-document-reader-elasticsearch/src/main/java/com/alibaba/cloud/ai/document/reader/es/ElasticsearchDocumentR…...

【网络技术_域名解析DNS】三、DNS 中间件实践应用与优化策略

一、DNS 中间件在典型行业的实践应用 1.1 金融行业&#xff1a;保障交易安全与服务稳定​ 金融行业对网络服务的安全性和稳定性要求极高&#xff0c;DNS 中间件在此领域发挥着不可替代的作用。以某银行线上支付系统为例&#xff0c;在 CentOS 7 环境下部署 DNS 中间件时&…...

Node.js 异步I/O与事件循环深度优化

Node.js 的核心魅力在于其异步、非阻塞I/O模型&#xff0c;这使得它在处理高并发、I/O密集型应用&#xff08;如Web服务器、API网关、实时通信服务&#xff09;时表现出色。然而&#xff0c;这种强大的能力并非凭空而来&#xff0c;它深深植根于其独特的**事件循环&#xff08;…...

npm 常用操作和配置

一、npm 核心操作 1. 初始化项目 npm init # 交互式创建 package.json npm init -y # 跳过提问&#xff0c;直接生成默认 package.json2. 安装依赖 npm install <package> # 安装包到本地 node_modules&#xff08;生产依赖&#xff09; npm in…...

嵌入式芯片中的 低功耗模式 内容细讲

电源域与运行级别概述 电源域&#xff08;Power Domain&#xff09; 核心域&#xff08;Core Domain&#xff09;&#xff1a;包括 CPU 核心和关键架构模块&#xff08;如 NVIC、CPU 内核寄存器&#xff09;。 外设域&#xff08;Peripheral Domain&#xff09;&#xff1a;…...

React-请勿在循环或者条件语句中使用hooks

这是React Hooks的首要规则&#xff0c;这是因为React Hooks 是以单向循环链表的形式存储&#xff0c;即是有序的。循环是为了从最后一个节点移到一个节点的时候&#xff0c;只需通过next一步就可以拿到第一个节点&#xff0c;而不需要一层层回溯。React Hooks的执行&#xff0…...

React-memo (useMemo, useCallback)

在react中&#xff0c;当我们setState之后&#xff0c;若值发生变化&#xff0c;则会重新render当前组件以及其子组件 (默认情况下)&#xff0c;在必要的时候&#xff0c;我可使用memo (class组件则对应shouldComponentUpdate、PureComponent)进行优化&#xff0c;来减少无效渲…...

点云数据处理开源C++方案

一、主流开源库对比 库名称特点适用场景开源协议活跃度PCL功能最全&#xff0c;算法丰富科研、工业级应用BSD★★★★★Open3D现代API&#xff0c;支持Python绑定快速开发、深度学习MIT★★★★☆CGAL计算几何算法强大网格处理、高级几何运算GPL/LGPL★★★☆☆PDAL专注于点云…...

android测试依赖

Android 项目中常用的测试相关库 1. androidx.arch.core:core-testing:2.2.0 作用&#xff1a; 提供与 Android Architecture Components&#xff08;如 LiveData、ViewModel&#xff09;相关的测试工具。主要用于测试基于 LiveData 的异步操作。 常见功能&#xff1a; 即时…...

Gradle与Idea整合

文章目录 1. Groovy 简介2. Groovy 安装[非必须]3. 在idea中创建java工程 1. Groovy 简介 在某种程度上&#xff0c;Groovy可以被视为Java的一种脚本化改良版,Groovy也是运行在JVM上&#xff0c;它可以很好地与Java代码及其相关库进行交互操作。它是一种成熟的面向对象编程语言…...

【数据结构】励志大厂版·初阶(复习+刷题)单链表

前引&#xff1a;此篇文章作为小编复习的记录&#xff0c;将快速回忆单链表的知识点&#xff0c;讲解单链表增删查找的实现&#xff0c;每个细节之处要注意的地方&#xff0c;解释为何这样设计。文章末尾包含了单链表算法题&#xff0c; 同样解释详细&#xff0c;借助题目再次巩…...

前端面试宝典---参数解构+默认值的面试题

重点要义 对于函数参数要解构&#xff0c;且参数有默认值的&#xff0c;一律用Object.assign的思路去合并参。 看不懂这句话没关系&#xff0c;看下面的例子\ 例子1 function fn ({ x 1, y } { y: 10 }) {console.log(x, y) } fn() // 1 10没有传递实参&#xff0c;你就把{ …...

【开发心得】筑梦上海:项目风云录(16)

目录 代码反面案例 李青与诺基亚的兴衰 并行项目下的利益纠葛与团队协作 未完待续。。。 今天分享的是一个反面案例&#xff0c;也算是一个避坑指南了。 代码反面案例 今天分享的代码是一个反面案例&#xff0c;当时由于项目人员变动频繁&#xff0c;经常是新人看不太懂旧…...

Neovim插件深度解析:mcphub.nvim如何用MCP协议重构开发体验

在AI与工具链深度融合的今天,Neovim 作为现代开发者的生产力工具,正通过插件生态不断突破边界。mcphub.nvim 作为一款基于 MCP(Model Context Protocol) 协议的插件,重新定义了Neovim与智能工具的交互方式。它不仅简化了MCP服务器的集成与管理,更通过直观的UI和生态整合,…...

Qt UDP 通信的详细实现步骤和示例代码

在 Qt 中实现 UDP 通信主要使用 QUdpSocket 类。以下是 UDP 通信的详细实现步骤和示例代码&#xff1a; 一、UDP 通信基础 无连接协议&#xff1a;不需要建立持久连接数据报模式&#xff1a;以独立数据包&#xff08;datagram&#xff09;形式发送适用场景&#xff1a;实时性要…...

(二)Trae 配置C++ 编译

Trae配置c编译 零 CMake 编译C0.1 下载安装0.2 安装设置0.3 三种编译方式(见 下文 一 二 三)0.4 调试 (见 下文四) 一 使用MSVC方式编译1.1 安装编译环境1.2安装插件1.3 设置文件 二 使用GCC方式2.1 安装编译环境2.1.1下载:[MinGw](https://gcc-mcf.lhmouse.com/)2.1.2安装:(以…...

动态规划算法的欢乐密码(一):斐波那契数模型

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、动态规划 二、例题讲解 2.1. 第 N 个泰波那契数 2.2. 三步问题 2.3. 使用最小花费爬楼梯 2.4. 解码方法 一、动态规划 动态规划是一种将复杂问题分解为更小的子问题&#xff0c;并利用子问题的解来…...

【FreeRTOS进阶】优先级翻转现象详解及解决方案

【FreeRTOS进阶】优先级翻转现象详解及解决方案 接下来我们聊聊优先级翻转这个经典问题。这个问题在实时系统中经常出现&#xff0c;尤其是在任务较多的场景下&#xff0c;而且问题定位起来比较麻烦。 什么是优先级翻转&#xff1f; 优先级翻转的核心定义很简单&#xff1a;…...

解决 IntelliJ IDEA 项目启动时端口冲突问题

1.问题 Description: The Tomcat connector configured to listen on port 8082 failed to start. The port may already be in use or the connector may be misconfigured. Action: Verify the connectors configuration, identify and stop any process thats listening…...

笔试专题(十一)

文章目录 添加字符&#xff08;暴力枚举&#xff09;题解代码 城市群数量&#xff08;dfs&#xff09;题解代码 判断是不是平衡二叉树&#xff08;递归&#xff09;题解代码 最大子矩阵&#xff08;二维前缀和&#xff09;题解代码 小葱的01串 &#xff08;固定区间大小的滑动窗…...

C++11新增语法:列表初始化

前言&#xff1a; 接下来我们将要讲解&#xff0c;相较于c98&#xff0c;c11中新增的语法以及如何使用~。我们首先来讲解&#xff1a;列表初始化。 下文预告&#xff1a;右值引用和移动语义 C98中传统的{} 在c98中的{}&#xff0c;仅能初始化数组和结构体 #include<iostrea…...

Linux:基础IO---动静态库

文章目录 1. 动静态库前置知识1.1 动静态库知识回顾1.2 什么是动静态库 2. 动静态库2.1 站在库的制作者的角度2.2 站在库的使用者的角度2.3 动态库是怎么被加载的&#xff08;原理&#xff09; 序&#xff1a;上一篇文章我们从认识到理解&#xff0c;从理解到实现场景&#xff…...

从裸仓库到GitLab全解析

Git服务器搭建与使用指南&#xff1a;从裸仓库到GitLab全解析 前言 在团队协作开发中&#xff0c;版本控制系统是必不可少的工具。虽然GitHub提供了优秀的代码托管服务&#xff0c;但企业级项目往往需要更安全的私有化部署方案。本文将手把手教你两种主流的Git服务器搭建方式…...

OzGIS:地理信息分析与处理软件

大家好&#xff0c;今天为大家介绍的软件是OzGIS&#xff1a;一款地理信息分析与处理软件。下面&#xff0c;我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 OzGIS官网网址为&#xff1a;https://ozgis.sourceforge.io/。 OzGIS是一款开源软件&#…...

PHP异常处理__Throwable

在 PHP 里&#xff0c;Throwable 是一个极为关键的接口&#xff0c;自 PHP 7 起被引入。它为错误和异常处理构建了一个统一的框架。下面会详细介绍 Throwable 的相关内容。 1. 基本概念 Throwable 是 Exception 和 Error 的父接口。在 PHP 7 之前&#xff0c;异常&#xff08…...

PHP异常处理__Exception类

以下是对 PHP 中 Exception 类的详细解释&#xff1a; 一、Exception 类概述 Exception 是 PHP 中所有异常类的基类。它提供了一个通用的异常处理机制&#xff0c;用于处理程序执行过程中可能出现的错误情况。当程序中出现异常时&#xff0c;可以创建 Exception 的实例并将其…...

C++中动态多态类别浅析

非抽象类继承和虚函数 #include <iostream> using namespace std;class Base { public:virtual void func() { // 虚函数&#xff0c;支持动态绑定cout << "Base::func()" << endl;} };class Derived : public Base { public:void func() overrid…...

游戏引擎学习第234天:实现基数排序

回顾并为今天的内容设定背景 我们今天继续进行排序的相关&#xff0c;虽然基本已经完成了&#xff0c;但还是想收尾一下&#xff0c;让整个流程更完整。其实这次排序只是个借口&#xff0c;主要是想顺便聊一聊一些计算机科学的知识点&#xff0c;这些内容在我们项目中平时不会…...

系分架构论文《论高并发场景的架构设计和开发方法》

系统分析师论文范文系列 【摘要】 2022年8月&#xff0c;我司承接了某知名电商平台“秒杀系统架构优化”项目&#xff0c;我作为系统分析师主导了整体架构设计与技术选型工作。该平台在促销活动中面临瞬时流量超过50万QPS的挑战&#xff0c;原有架构存在数据库崩溃、服务响应延…...

最新得物小程序sign签名加密,请求参数解密,响应数据解密逆向分析

点击精选&#xff0c;出现https://app.dewu.com/api/v1/h5/index/fire/index 这个请求 直接搜索sign的话不容易定位 直接搜newAdvForH5就一个&#xff0c;进去再搜sign&#xff0c;打上断点 可以看到t.params就是没有sign的请求参数&#xff0c; 经过Object(a.default)该函数…...

jangow靶机笔记(Vulnhub)

环境准备&#xff1a; 靶机下载地址&#xff1a; https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova kali地址&#xff1a;192.168.144.128 靶机&#xff08;jangow&#xff09;地址&#xff1a;192.168.144.180 一.信息收集 1.主机探测 使用arp-scan进行主机探…...

Spring Boot + Caffeine:打造高性能缓存解决方案

1. 引言 1.1 缓存的重要性 缓存是提升系统性能的关键技术之一,通过将频繁访问的数据存储在内存中,减少对数据库或其他外部系统的访问次数,从而降低延迟并提高吞吐量。 缓存的基本概念:缓存是一种临时存储机制,用于快速访问常用数据。缓存在提升系统性能中的作用:减少数…...

C++入门小馆: 深入string类

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...

命令行基础

学习目标 掌握VRP命令行的基础知识 利用VRP命令行进行基本的配置 VRP命令行的基础知识 一、VRP 命令行基本架构 1. 用户视图&#xff08;User View&#xff09; 进入方式&#xff1a;设备启动后默认进入&#xff0c;提示符为 &#xff1c;HUAWEI&#xff1e;。功能&#…...

10-DevOps-Jenkins参数化构建实现多版本发布

在之前的Jenkins配置中&#xff0c;固定写死了程序的版本号&#xff0c;实际情况是随着版本的不断迭代&#xff0c;版本号也是不断变化的&#xff0c;版本号由代码仓库&#xff08;GitLab&#xff09;设置。 当前Jenkins配置是固定写的1.0&#xff0c;本节我们要把它改成动态的…...

C++游戏服务器开发之⑦redis的使用

目录 1.当前进度 2.守护进程 3.进程监控 4.玩家姓名添加文件 5.文件删除玩家姓名 6.redis安装 7.redis存取命令 8.redis链表存取 9.redis程序结构 10.hiredisAPI使用 11.基于redis查找玩家姓名 12.MAKEFILE编写 13.游戏业务实现总结 1.当前进度 2.守护进程 3.进程监…...

二进制裁剪命令mips-linux-gnu-strip 命令的使用

-s 或者--strip-all:移除所有符号和调试信息 -g 或者--strip-debug:仅移除调试信息 -d 或者--strip-unneeded:移除不需要的符号 默认不传任何参数 也是移除所有符号和调试 应用:把文件系统所有二进制镜像使用一遍,缩小文件系统大小 79K Apr 19 15:47 fat.ko //使用前 mips-l…...

【Bluedroid】蓝牙存储模块配置管理:启动、读写、加密与保存流程解析

本文围绕蓝牙存储模块展开&#xff0c;主要解析了蓝牙存储模块&#xff08;StorageModule&#xff09;的初始化流程&#xff0c;重点围绕配置文件校验、读取、设备类型修复及加密处理展开。通过工厂重置检测、校验和验证、多源配置加载、设备类型推断修正等步骤&#xff0c;确保…...

SpringBoot启动后初始化的几种方式

目录 一、静态代码块 二、构造方法 三、PostConstruct 四、InitializingBean 接口 五、 Bean 注解中的 initMethod 六、 CommandLineRunner 接口 七、ApplicationRunner 接口 八、EventListener事件 九、SmartInitializingSingleton接口 十、ApplicationListener接口…...

asp.net core webapi+efcore

简洁的restfull风格 目前c#提供了多种风格的web编程&#xff0c;因为微软有自己的前端&#xff0c;所以集成了很多内容&#xff0c;不过基于现在编程前后端分离的模式&#xff0c;webapi是合适的。 webapi 目前网络上有很多介绍&#xff0c;不反复说这个了。在建立控制器时&…...

java怎么完善注册,如果邮箱中途更换,能否判断

解析在下面 附赠代码 private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code code;this.timestamp timestamp;}}// 存储验证码&#xff08;邮箱 -> 验证码信息&#xff09;(保证线程安全) 以免中途更改邮箱pri…...

实战设计模式之备忘录模式

概述 与解释器模式、迭代器模式一样&#xff0c;备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态&#xff0c;并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式&#xff0c;开发者可以轻松添加诸…...

数据库表设计

一对一关系 共享主键 两个表的主键是相同的 唯一外键 从表中记录主表的id 一对多关系 从表&#xff08;多的表&#xff09;存储主表的id 多对多关系 设计一个中间表&#xff08;关联表&#xff09;&#xff0c;它有两列分别记录两个主表&#xff08;A 和 B&#xff09;…...

Linux 桌面环境 LXQt 2.2 发布

Linux 桌面环境 LXQt 2.2 于 2025 年 4 月 17 日正式发布。这是该轻量级开源 Qt 桌面环境的最新稳定版本&#xff0c;带来了诸多改进&#xff0c;特别是在 Wayland 支持方面。以下是一些主要的更新内容&#xff1a; Wayland 支持增强&#xff1a; 提升了多屏支持&#xff0c;使…...

多人五子棋联机对战平台 测试报告

目录 项目介绍 测试用例设计 部分功能测试示例 自动化测试 测试范围 排除范围 自动化测试目录​编辑 执行全部自动化测试用例 性能说明 总结 性能测试 结果分析 测试总结 项目介绍 该项目基于WebSocket实现实时通信&#xff0c;采用SSM框架构建在线五子棋多人联机…...

探索 .bat 文件:自动化任务的利器

在现代计算机操作中&#xff0c;批处理文件&#xff08;.bat 文件&#xff09;是一种简单而强大的工具&#xff0c;它可以帮助我们自动化重复性任务&#xff0c;工作效率提高。尽管随着编程语言和脚本工具的发展&#xff0c;.bat 文件的使用频率有所下降&#xff0c;但它依然是…...

240419 leetcode exercises

240419 leetcode exercises jarringslee 文章目录 240419 leetcode exercises[19. 删除链表的倒数第 N 个结点](https://leetcode.cn/problems/remove-nth-node-from-end-of-list/)&#x1f501; 经典方法&#xff1a;两次遍历暴力求解&#x1f501; 双指针法 &#xff1a;快慢…...

开源Midjourney替代方案:企业级AI绘画+PPT生成系统+AI源码

「AI取代设计师&#xff1f;」开源Midjourney替代方案&#xff1a;企业级AI绘画PPT生成系统 ——零代码私有化部署&#xff0c;5倍速出图100%版权合规 设计师行业的危机与机遇 1. 传统设计流程的致命短板 痛点 人工设计 AI系统 单张海报耗时 3小时&#xff08;含反复修改…...

学习笔记十七——Rust 支持面向对象编程吗?

&#x1f9e0; Rust 支持面向对象编程吗&#xff1f; Rust 是一门多范式语言&#xff0c;主要以 安全、并发、函数式、系统级编程为核心目标&#xff0c;但它同时也支持面向对象的一些关键特性&#xff0c;比如&#xff1a; 特性传统 OOP&#xff08;如 Java/C&#xff09;Ru…...

图灵奖得主LeCun:DeepSeek开源在产品层是一种竞争,但在基础方法层更像是一种合作;新一代AI将情感化

图片来源&#xff1a;This is World 来源 | Z Potential Z Highlights&#xff1a; 新型的AI系统是以深度学习为基础&#xff0c;能够理解物理世界并且拥有记忆、推理和规划能力的。一旦成功构建这样的系统&#xff0c;它们可能会有类似情感的反应&#xff0c;但这些情感是基…...