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

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

在微服务架构中,数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统,不仅可以用作缓存、消息代理,还可以扩展为向量数据库,实现高效的相似性搜索。本文将详细介绍如何使用Spring Boot整合Redis Stack,构建本地向量数据库,并进行相似性查询。

一、Redis Stack简介

Redis Stack(也称为Redis Enterprise或Redis Cloud)是一个全面的Redis解决方案,它包括了Redis数据库、Redis搜索、Redis AI、Redis JSON等多个模块,为开发者提供了丰富的数据结构和强大的功能。其中,Redis搜索模块允许我们将Redis用作向量数据库,进行相似性搜索。

二、环境准备

在开始之前,我们需要准备以下环境:

  1. JDK:确保已安装Java Development Kit(JDK),版本建议为17或更高。
  2. Maven:用于构建和管理Java项目依赖。
  3. Docker:用于运行Redis Stack容器。
  4. Spring Boot:用于构建微服务应用。
三、Redis Stack安装与配置

我们将使用Docker来安装Redis Stack。以下是安装步骤:

  1. 拉取Redis Stack镜像

    docker pull redis/redis-stack
    
  2. 运行Redis Stack容器

    docker run -d --name redis-stack -p 6379:6379 -p 5540:5540 redis/redis-stack
    

    这将启动Redis Stack容器,并暴露Redis服务(端口6379)和Redis Insight管理界面(端口5540)。

  3. 访问Redis Insight

    打开浏览器,访问http://localhost:5540,即可进入Redis Insight管理界面,进行Redis数据库的可视化管理。

四、Spring Boot项目构建

接下来,我们将使用Spring Boot构建一个微服务应用,用于与Redis Stack进行交互,实现向量数据库的相似性查询。

  1. 创建Spring Boot项目

    使用Spring Initializr或Maven命令创建一个新的Spring Boot项目,并添加以下依赖:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency><!-- 其他依赖,如Spring AI(可选) --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-redis-spring-boot-starter</artifactId><version>${spring-ai.version}</version></dependency>
    </dependencies>
    
  2. 配置Redis连接

    application.ymlapplication.properties文件中配置Redis连接信息:

    spring:redis:host: localhostport: 6379# 其他配置,如密码、连接池等(可选)
    
  3. 创建Redis配置类

    创建一个Redis配置类,用于配置RedisTemplate和其他必要的Bean:

    @Configuration
    public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));return template;}// 其他配置,如HashOperations、ValueOperations等(可选)
    }
    
  4. 实现向量存储与查询

    为了将文本或数据转换为向量,并使用Redis进行存储和查询,我们需要一个嵌入模型(如Word2Vec、BERT等)来生成向量。这里,我们假设已经有一个向量化工具(如vectorStore),它可以将指定的字段转换为高维向量,并存储在Redis中。

    @Service
    public class VectorService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;// 存储向量到Redispublic void storeVector(String key, double[] vector) {// 将向量序列化为字符串或其他可存储的格式(如JSON)String vectorStr = Arrays.toString(vector);redisTemplate.opsForValue().set(key, vectorStr);}// 查询与给定向量最相似的K个向量public List<String> similaritySearch(double[] queryVector, int k) {// 将查询向量转换为与存储在Redis中相同格式的字符串(可选)String queryVectorStr = Arrays.toString(queryVector);// 使用Redis的搜索功能进行相似性搜索(这里需要实现具体的搜索逻辑)// 假设有一个`vectorStore.similaritySearch`方法可以进行相似性计算// List<Document> results = vectorStore.similaritySearch(queryVector, k);// 返回结果(这里仅为示例,实际应返回相似向量的键或其他相关信息)// return results.stream().map(Document::getKey).collect(Collectors.toList());// 由于Redis原生不支持向量搜索,这里可以使用第三方库或自定义实现// 以下是一个简单的示例,使用余弦相似度进行手动计算(不推荐用于生产环境)Map<String, Double> similarityMap = new HashMap<>();redisTemplate.keys("*").forEach(redisKey -> {String vectorStr = (String) redisTemplate.opsForValue().get(redisKey);double[] storedVector = Arrays.stream(vectorStr.replaceAll("[\\[\\]\\s]", "").split(",")).mapToDouble(Double::parseDouble).toArray();double similarity = cosineSimilarity(queryVector, storedVector);similarityMap.put(redisKey, similarity);});// 按相似度排序并返回前K个结果List<Map.Entry<String, Double>> sortedEntries = similarityMap.entrySet().stream().sorted((e1, e2) -> Double.compare(e2.getValue(), e1.getValue())).collect(Collectors.toList());return sortedEntries.stream().limit(k).map(Map.Entry::getKey).collect(Collectors.toList());}// 计算余弦相似度private double cosineSimilarity(double[] a, double[] b) {double dotProduct = 0.0;double normA = 0.0;double normB = 0.0;for (int i = 0; i < a.length; i++) {dotProduct += a[i] * b[i];normA += a[i] * a[i];normB += b[i] * b[i];}return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));}
    }
    

    注意:上述代码中的vectorStore.similaritySearch方法是一个假设的方法,Redis原生并不支持向量搜索。在实际应用中,我们可以使用Redis的搜索模块(需要安装Redis Search插件)或第三方库(如Elasticsearch、FAISS等)来实现高效的向量搜索。此外,上述代码中的余弦相似度计算是手动实现的,仅用于示例,不推荐在生产环境中使用。

  5. 创建控制器

    创建一个控制器,用于接收客户端的请求,并调用VectorService进行向量存储和查询:

    @RestController
    @RequestMapping("/vectors")
    public class VectorController {@Autowiredprivate VectorService vectorService;// 存储向量@PostMapping("/store")public ResponseEntity<Void> storeVector(@RequestBody Map<String, double[]> requestBody) {String key = requestBody.keySet().iterator().next();double[] vector = requestBody.get(key);vectorService.storeVector(key, vector);return ResponseEntity.ok().build();}// 查询相似向量@GetMapping("/search")public ResponseEntity<List<String>> similaritySearch(@RequestParam double[] queryVector, @RequestParam int k) {List<String> similarKeys = vectorService.similaritySearch(queryVector, k);return ResponseEntity.ok(similarKeys);}
    }
    
  6. 运行应用

    使用Maven或IDE运行Spring Boot应用,然后可以通过Postman或其他HTTP客户端发送请求,进行向量存储和查询。

五、总结

通过上述步骤,我们成功使用Spring Boot整合了Redis Stack,并构建了一个本地向量数据库,实现了相似性查询。然而,需要注意的是,Redis原生并不支持向量搜索,因此在实际应用中,我们需要借助Redis的搜索模块、

相关文章:

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中&#xff0c;数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统&#xff0c;不仅可以用作缓存、消息代理&#xff0c;还可以扩展为向量数据库&#xff0c;实现高效的相…...

设计模式-装饰者模式

背景 有一个咖啡馆有 单品咖啡&#xff1a;意大利浓咖啡、美式咖啡、无因咖啡 调料&#xff1a;牛奶、巧克力 点单时需要点一个单品咖啡&#xff0c;可以选择加调料或者不加。 最后计算价格。 较好的传统思路&#xff1a; 创建一个抽象的咖啡类&#xff0c;其中有各个调…...

.NetCore 过滤器和拦截器 的区别

Asp.NET Core 中的过滤器&#xff08;Filter&#xff09;和拦截器&#xff08;Interceptor&#xff09;是两个不同的概念&#xff0c;但它们在某些方面有相似之处&#xff0c;也有明显的区别。 &#x1f511;过滤器&#xff08;Filter&#xff09; 过滤器是Asp.NET Core中用于…...

uniapp实现APP版本升级

App.vue 直接上代码 <script>export default {methods: {//APP 版本升级Urlupload() {// #ifdef APP-PLUSplus.runtime.getProperty(plus.runtime.appid, (info) > {// 版本号变量持久化存储getApp().globalData.version info.version;this.ToLoadUpdate(info.versi…...

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…...

k8s集群增加nfs-subdir-external-provisioner存储类

文章目录 前言一、版本信息二、本机安装nfs组件包三、下载nfs-subdir-external-provisioner配置文件并进行配置1.下载文件2.修改配置 三、进行部署备注&#xff1a;关于镜像无法拉取问题的处理 前言 手里的一台服务器搭建一个单点的k8s集群&#xff0c;然后在本机上使用nfs-su…...

IT成长之路-ubuntu驱动篇

历时3天的蹂躏&#xff0c;总结驱动安装全面教程。 步骤一、安装gcc、g和make包 #脚本更新 sudo apt-get update #编译gcc sudo apt-get install gcc #编译g sudo apt-get install g #编译make sudo apt-get install make 注意&#xff1a; gcc、g版本可能会导致显卡驱动安…...

AI大模型如何赋能电商行业,引领变革

目录 1.概述 1.1. 购物推荐系统 1.2. 会员分类与客户细分 1.3. 动态商品定价 1.4. 库存和供应链管理 1.5. 客户服务与体验 1.6. 内容生成与管理 2.AI技术在电商中的创新应用 2.1.淘宝 2.2.京东 2.3.华为 2.4.小米 3.AI技术在提高电商平台销售效率方面发挥的作用 …...

QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译 使用纯代码编写程序新建工程 使用其他编辑器纯代码编写程序并在命令行运行使用 .ui 表单文件生成界面使用自定义 C 窗口类使用现成的QT Designer界面类 使用纯代码编写程序 我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局&#xff0c…...

地平线 bev_cft_efficientnetb3 参考算法-v1.2.1

01 概述 在自动驾驶感知算法中 BEV 感知成为热点话题&#xff0c;BEV 感知可以弥补 2D 感知的缺陷构建 3D “世界”&#xff0c;更有利于下游任务和特征融合。 地平线集成了基于 bev 的纯视觉算法&#xff0c;目前已支持 ipm-based 、lss-based、 transformer-based&#xff…...

【linux】shell脚本

文章目录 1. jar包启动脚本1.1 方式一1.2 方式二 2. 进程关闭脚本3. 操作mysql4. impala建表语句提取5. 监控磁盘存量6. 清日志脚本7. 替换tomcat的启动端口8. 将一行数据按照空格依次读取 1. jar包启动脚本 1.1 方式一 #!/bin/sh RESOURCE_NAME/usr/local/applications/scre…...

构建一个去中心化的零售生态参与者的商业模型

在数字化和去中心化技术快速发展的背景下&#xff0c;传统零售行业正迎来革命性的转型。去中心化零售生态不仅让消费者、商家和内容创作者在同一平台上共同参与价值的创造和分配&#xff0c;还推动了零售体验、数据控制和社会互动的彻底变革。本文将探讨如何构建一个去中心化的…...

Spring Boot开发实战:从入门到构建高效应用

Spring Boot 是 Java 开发者构建微服务、Web 应用和后端服务的首选框架之一。其凭借开箱即用的特性、大量的自动化配置和灵活的扩展性&#xff0c;极大简化了开发流程。本文将以实战为核心&#xff0c;从基础到高级&#xff0c;全面探讨 Spring Boot 的应用开发。 一、Spring B…...

MyBatis(mybatis_plus)中TypeHandler的使用教程

MyBatis&#xff08;mybatis_plus&#xff09;中TypeHandler的使用教程 一.TypeHandler作用及其使用场景 在我们平常开发操作数据库时&#xff0c;查询、插入数据等操作行为&#xff0c;有时会报数据类型不匹配异常&#xff0c;就可以得知数据的类型是不唯一的必然是多种不同…...

【C++】IO库(三):string流

8.3 string 流 sstream 头文件定义了三个类型来支持内存 IO&#xff0c;这些类型可以向 string 写入数据&#xff0c;也可以从 string 读取数据&#xff0c;就像 string 是一个 IO 流一样。 istringstream 从 string 读数据&#xff1b;ostringstream 向 string 写入数据&…...

C# 反射详解

反射是C#中的一个强大特性&#xff0c;允许程序在运行时检查和操作类型和对象的信息。 通过反射&#xff0c;你可以获取类型的属性、方法、构造函数等信息&#xff0c;并可以动态创建对象、调用方法或访问属性&#xff0c;甚至可以实现某些框架或库的核心功能。 反射的基本概念…...

量化交易系统开发-实时行情自动化交易-8.量化交易服务平台(一)

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于收集整理的33个量化交易服…...

【开发商城系统】

在广西开发商城系统&#xff0c;可以按照以下步骤进行&#xff1a; 确定项目需求&#xff1a;与客户沟通&#xff0c;了解商城系统所需的功能和特性&#xff0c;并确定项目的预算和时间限制。 进行市场调研&#xff1a;了解广西地区的电商市场情况&#xff0c;包括竞争对手、消…...

C++设计模式-享元模式

动机(Motivation) 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中&#xff0c;从而带来很高的运行时代价——主要指内存需求方面的代价。如何在避免大量细粒度对象问题的同时&#xff0c;让外部客户程序仍然能够透明地使用面向对象的方式来进行操作…...

Spark——安装步骤详细教程

1、安装步骤 1、上传 cd /opt/modules 2、解压 tar -zxf spark-3.1.2-bin-hadoop3.2.tgz -C /opt/installs 3、重命名 cd /opt/installs mv spark-3.1.2-bin-hadoop3.2 spark-local 4、创建软链接 ln -s spark-local spark 5、配置环境变量&#xff1a; vi /etc/prof…...

摆烂仙君传——深度学习秘境奇缘

第一章&#xff1a;深度学习秘境 在修仙界与科技交织的边缘&#xff0c;八荒六合九天无上摆烂仙君在其高科技修炼室中感应到一股神秘的召唤。这股力量似乎与他的灵魂产生了共鸣&#xff0c;引导他前往传说中的深度学习秘境。在那里&#xff0c;古老的仙法与前沿的算法交织&…...

C++设计模式:桥接模式(Bridge)

什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09;是一个用来解耦的设计模式&#xff0c;它将抽象层和实现层分离开&#xff0c;让它们可以独立变化。用最简单的话来说&#xff0c;就是让你能够改变抽象的功能和具体的实现&#xff0c;而不需要修改…...

c++源码阅读__smart_ptr__正文阅读

文章目录 简介源码解析1. 引用计数的实现方式2. deleter静态方法的赋值时间节点3.make_smart的实现方式 与 好处4. 几种构造函数4.1 空构造函数4.2 接收指针的构造函数4.3 接收指针和删除方法的构造函数 , 以及auto进行模板lambda的编写4.4 拷贝构造函数4.5 赋值运算符 5. rele…...

halcon3D 1:1切片轮廓投影技术,透过像素距离,知实际物体的尺寸

首先说做个什么事儿 对一个物体的横截面进行1:1或者1:10的投影&#xff0c;也就是说世界物体1mm的话&#xff0c;投影到image中占1个或者10个像素值&#xff0c;这样&#xff0c;就可以透过直接计算image中的像素距离&#xff0c;知道实际物体的尺寸 用一张图说明是这样的。物…...

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法

npm库xss依赖的使用方法和vue3 中Web富文本编辑器 wangeditor 使用xss库解决 XSS 攻击的方法 1. npm库xss依赖的使用方法1.1 xss库定义1.2 xss库功能 2. vue3 中 wangeditor 使用xss库解决 XSS 攻击的方法和示例2.1 在终端执行如下命令安装 xss 依赖2.2 在使用 wangeditor 的地…...

计算机网络 实验七 NAT配置实验

一、实验目的 通过本实验理解网络地址转换的原理和技术&#xff0c;掌握扩展NAT/NAPT设计、配置和测试。 二、实验原理 NAT配置实验的原理主要基于网络地址转换&#xff08;NAT&#xff09;技术&#xff0c;该技术用于将内部私有网络地址转换为外部公有网络地址&#xff0c;从…...

UI设计-色彩、层级、字体、边距(一)

一.色彩&#xff1a;色彩可以影响人的心理与行动&#xff0c;具有不同的象征意义&#xff1b;有冷暖&#xff0c;轻重&#xff0c;软硬等等。 1.色彩情绪&#xff1a;最直观的视觉感受 一个活动的页面所用的颜色必须要与其内容相适应&#xff0c;让人看起来舒服。有时我们会不…...

【网络安全】

黑客入侵 什么是黑客入侵&#xff1f; “黑客”是一个外来词&#xff0c;是英语单词hacker的中文音译。最初&#xff0c;“黑客”只是一个褒义词&#xff0c;指的是那些尽力挖掘计算机程序最大潜力的点脑精英&#xff0c;他们讨论软件黑客的技巧和态度&#xff0c;以及共享文化…...

c++趣味编程玩转物联网:基于树莓派Pico控制有源蜂鸣器

有源蜂鸣器是一种简单高效的声音输出设备&#xff0c;广泛应用于电子报警器、玩具、计时器等领域。在本项目中&#xff0c;我们结合树莓派Pico开发板&#xff0c;通过C代码控制有源蜂鸣器发出“滴滴”声&#xff0c;并解析其中涉及的关键技术点和硬件知识。 一、项目概述 1. 项…...

【MySQL】MySQL从入门到放弃

文章目录 声明MYSQL一,架构1.1.网络连接层数据库连接池 1.2.系统服务层1.2.1.SQL接口1.2.2.存储过程1.2.3.触发器1.2.4.解析器1.2.5.优化器1.2.6.缓存,缓冲 1.3.存储引擎层1.4.文件系统层1.4.1.日志模块1.4.2.数据模块 二,SQL 执行2.1.执行流程2.2.刷盘2.3.返回 三.库表设计3.1…...

redis-cluster集群搭建

集群节点信息 192.168.222.131:46379 主要节点1 192.168.222.131:46380 从节点1 192.168.222.131:46381 从节点2192.168.222.132:46379 主要节点2 192.168.222.132:46380 从节点1 192.168.222.132:46381 从节点2192.168.222.133:46379 主要节点3 192.168.222.133:46380 从节点…...

C语言解决空瓶换水问题:高效算法与实现

标题&#xff1a;C语言解决空瓶换水问题&#xff1a;高效算法与实现 一、问题描述 在一个饮料促销活动中&#xff0c;你可以通过空瓶换水的方式免费获得更多的水&#xff1a;3个空瓶可以换1瓶水。喝完这瓶水后&#xff0c;空瓶会再次变为空瓶。假设你最初拥有一定数量的空瓶&a…...

单例模式入门

单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 它的运作方式是这样的&#xff1a; 如果你创建了一个对象&#xff0c; 同时过一会儿后你决定再创建一个新对象&#xff0c; 此时你会获得之前已创建的…...

MongoDB快速入门

1 MongoDB 1.1 MongoDB 概念 1.1.1 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在Mo…...

c语言中的extern是什么

在C语言中&#xff0c;extern 是一个关键字&#xff0c;用于声明变量或函数的外部链接。它告诉编译器该变量或函数的定义在其他文件中&#xff0c;编译器在编译当前文件时并不需要知道变量或函数的具体定义&#xff0c;而是将它们视作外部引用。 1. 变量的 extern 声明 当你在…...

CTF之密码学(摩斯密码)

一、历史背景 摩尔斯电码发明于1837年&#xff0c;是一种早期的数字化通信形式。它最初由艾尔菲德维尔和摩尔斯等人构思&#xff0c;通过点、划和中间的停顿&#xff0c;把各个字元以及标点符号彼此独立地发送出去。这种标识不同符号的方案后来被放入摩尔斯的专利中&#xff0…...

Flink 任务启动脚本-V2(包括ck启动)

#!/bin/bash#crontab时设置&#xff0c;如果依赖其他环境变量配置&#xff0c;可以在脚本执行一下环境变量脚本 source /etc/profile# 进入脚本目录 curdirdirname "$0" curdircd "$curdir"; pwd echo "进入启动脚本目录 $curdir"# 定义应用程序…...

16:00面试,16:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

selinux和防火墙

SElinux 1、selinux简介 SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linux。 SELinux 主要由美国国家安全局&#xff08;NSA&#xff09;开发&#xff0c;当初开发的目的是为了避免资源的误用。 SELinux是对程序、文件等权限设置依据的一个内核模块。…...

Android 13 Aosp Settings Android Studio版本

Android 13 Aosp Settings Android Studio版本 Settings相关源码 Settings https://android.googlesource.com/platform/packages/apps/Settings/+/refs/heads/android13-release SettingsIntelligence https://android.googlesource.com/platform/packages/apps/SettingsIn…...

[241127] Mistral AI 更新 Le Chat,免费提供前沿 AI 助手!| TrendForce 预测 2025 十大科技趋势

目录 Mistral AI 更新 Le Chat&#xff0c;免费提供前沿 AI 助手&#xff01;TrendForce 预测 2025 十大科技趋势 Mistral AI 更新 Le Chat&#xff0c;免费提供前沿 AI 助手&#xff01; Mistral AI 宣布对其免费 AI 助手 Le Chat 进行重大更新&#xff0c;新增多项强大功能&…...

go-carbon v2.5.0 发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库&#xff0c;提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。 carbon 目前已捐赠给 dromara 开源组织&#xff0c;已被 awesome-go 收录&am…...

linux安全管理-账号口令

文章目录 1 设备密码复杂度策略2 设备密码生存周期、最小长度、更改最小间隔天数和过期前警告天数3 使用 PAM 认证禁止指定组之外的用户使用 su 切换到 root4 制作用户权限对照表 1 设备密码复杂度策略 1、配置内容 检查密码复杂度策略中设置的特殊字符、大写字母、小写字母和…...

uni-app自定义底部tab并且根据字段显示和隐藏

首先将所有tab使用到的页面创建好并且在pages里面配置好&#xff0c;要在pages.json中的"tabBar里面配置"custom": true将自带的tab底部导航关闭 "pages": [{"path": "pages/mine/mine","style": {"navigationBa…...

C#开发合集

用C#轻松搞定m3u8视频下载与合并 嘿&#xff0c;程序员们&#xff01;今天咱们来聊聊如何用C#写个小程序&#xff0c;轻松下载和合并m3u8视频文件。没错&#xff0c;就是那种分段的流媒体视频。准备好了吗&#xff1f;让我们开始吧&#xff01; 准备工作 在动手之前&#xf…...

Chrome和edge浏览器如何为任何网站强制暗模式

前言 因为我的编辑器是黑色&#xff0c;可能是看的时间长了比较喜欢这种颜色了&#xff0c;感觉白色有些刺眼。尤其是看文章时&#xff0c;两边的空白纯白色&#xff0c;所以强迫症搜素设置了谷歌浏览器和edge如何设置成黑色。 Chrome和edge浏览器如何为任何网站强制暗模式 前…...

第二十章 Java多线程--JUC并发工具-CountDownLatch

目录 一、CountDownLatch基础概念 CountDownLatch 的核心概念 CountDownLatch 的常用方法 场景一&#xff1a;主线程等待多个子线程执行完毕 场景二&#xff1a;实现多个线程同时开始执行任务 场景三&#xff1a;统计报表优化 CountDownLatch 的局限性 结论 二、Count…...

限制对 etcd 的访问范围是确保 Kubernetes 集群安全的一个重要环节。

限制对 etcd 的访问范围是确保 Kubernetes 集群安全的一个重要环节。通常&#xff0c;etcd 只应当对 Kubernetes 控制平面的组件&#xff08;如 API Server、Controller Manager、Scheduler 等&#xff09;以及某些维护工具&#xff08;如备份工具&#xff09;开放访问权限&…...

shell脚本基础学习_总结篇(完结)

细致观看可以&#xff0c;访问shell脚本学习专栏&#xff0c;对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. S…...

Linux之网络基础

网络发展 网络的发展可以从人与人之间的工作模式开始谈起, 人与人的工作模式反应了机器与机器的工作模式: 1. 独立模式: 在网络发展的早期计算机间处于独立模式, 计算机之间相互独立 最开始计算机之间是独立运行的, 数据之间的交互需要人用软盘等存储介质拷贝过去, 一般涉及…...