Milvus向量数据库

news2024/11/22 19:03:32

Milvus vector database

第一章 Milvus概述

Milvus创建于2019年,唯一的目标是:存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量embedding vectors。

存储对象:向量

NOTE:embedding vectors是对非结构化数据的特征抽象,比如电子邮件、物联网传感器数据、Instagram照片、蛋白质结构等等。现代嵌入技术用于将非结构化数据转换为嵌入向量,从数学上讲,嵌入向量是浮点数或二进制数的数组。

Milvus能够通过计算两个向量的相似距离来分析它们之间的相关性,如果两个嵌入向量非常相似,则意味着原始数据源也是相似的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kfvEkNYE-1685439244147)(assets/image-20230304215708039.png)]

1.1相关应用

  • 图像相似性搜索:图像可搜索,并立即从海量数据库中返回最相似的图像。

  • 视频相似度搜索:通过将关键帧转换为向量,然后将结果输入Milvus,可以近乎实时地搜索和推荐数十亿个视频。

  • 音频相似度搜索:快速查询语音、音乐、音效、表面相似声音等海量音频数据。

  • 分子相似性搜索:对特定分子进行快速相似性搜索、子结构搜索或上层结构搜索。

  • 推荐系统:推荐

官网:https://milvus.io/bootcamp/

1.2Milvus是如何设计的?

作为一个云原生矢量数据库,Milvus通过设计分离了存储和计算。为了增强弹性和灵活性,Milvus中的所有组件都是无状态的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNx0Ifdw-1685439244148)(assets/image-20230304220347552.png)]

该系统分为四个层次:

  • 访问层:访问层由一组无状态代理组成,作为系统的前端层和用户的端点。

  • 协调服务:协调服务将任务分配给工作节点,并发挥系统大脑的作用。

  • 工作节点:工作节点就像手臂和腿,是哑执行器,遵循协调器服务的指令,执行用户触发的DML/DDL命令。

  • 存储:存储是系统的骨架,负责数据持久性。它包括元存储、日志

有关更多信息,请参见体系结构概述Architecture Overview.

1.3开发者工具

Milvus由丰富的api和工具支持,以促进DevOps。

Milvus有包装在Milvus API之上的客户端库,可用于从应用程序代码中以编程方式插入、删除和查询数据。

PyMilvus

Node.js SDK

Go SDK

Java SDK

第二章 快速开始

2.1安装Milvus

使用docker-compose安装Milvus Standalone

【第一步】下载milvus-standalone-docker-compose.yml,并保存为docker-compose.yml

https://github.com/milvus-io/milvus/releases/download/v2.2.3/milvus-standalone-docker-compose.yml

linux

wget https://github.com/milvus-io/milvus/releases/download/v2.2.3/milvus-standalone-docker-compose.yml -O docker-compose.yml

【第二步】在与docker-compose.yml相同的目录中,启动所有docker-compose服务并后台运行

docker-compose up -d

【第三步】展示当前docker-compose编排过的运行的所有容器

docker-compose ps

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-45WxVsFu-1685439244149)(assets/image-20230309191411127.png)]

停止服务

docker-compose down

停止Milvus后删除数据,执行

sudo rm -rf  volumes

第三章 学习

前提下载:PyMilvus 2.2.2

pip3 install pymilvus==2.2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

3.1Manage Milvus Connections (连接管理)

如何连接和断开Milvus服务器

milvus支持两个端口:195309091

  • gRPC支持19530端口

    它是连接不同Milvus sdk的Milvus服务器时的默认端口。

  • RESTful API支持9091端口

    当使用HTTP客户端连接到Milvus服务器时使用它。

连接Milvus服务器

建立一个Milvus连接。在进行任何操作之前,请确保连接到Milvus服务器。

示例代码:

from pymilvus import connections

connections.connect(
  alias="default", 
  host='localhost', 
  port='19530'
)
ParameterDescription
alias要构造的Milvus连接的别名。
hostMilvus服务器IP地址。
portMilvus服务器端口。

返回值:由传递的参数创建的Milvus连接

NOTE:最大连接数为65,536。

Milvus服务器断开连接

示例代码:

connections.disconnect("default")
ParameterDescription
alias要断开连接的Milvus服务器的别名。

3.2Manage Collections(集合管理)

要创建的集合必须包含一个主键字段和一个向量字段。主键字段支持的数据类型为INT64和String。

Prepare Schema(准备schema)

首先,准备参数,包括field schema, collection schema, and collection name.、

示例代码:

from pymilvus import CollectionSchema, FieldSchema, DataType

book_id = FieldSchema(
  name="book_id", 
  dtype=DataType.INT64, 
  is_primary=True, 
)

book_name = FieldSchema(
  name="book_name", 
  dtype=DataType.VARCHAR, 
  max_length=200,
)

word_count = FieldSchema(
  name="word_count", 
  dtype=DataType.INT64,  
)

book_intro = FieldSchema(
  name="book_intro", 
  dtype=DataType.FLOAT_VECTOR, 
  dim=2
)

schema = CollectionSchema(
  fields=[book_id, book_name, word_count, book_intro], 
  description="Test book search"
)

collection_name = "book"
ParameterDescriptionOption
FieldSchema要创建的集合中的字段的模式。N/A
name要创建的字段的名称N/A
dtype要创建的字段的数据类型。DataType.INT64DataType.VARCHARDataType.BOOLDataType.INT64``DataType.FLOATDataType.DOUBLE BINARY_VECTOR FLOAT_VECTOR
is_primary 主键字段为必选项要创建的字段是否为主键True or False
auto_id (主键字段为必选项)启用或禁用自动ID(主键)分配。True or False
max_length (VARCHAR字段的必填项)允许插入的最大字符串长度。[1, 65,535]
dim (向量字段是必须的)向量的维数。[1, 32,768]
description (可选)字段的描述。N/A
CollectionSchema要创建的集合的模式。N/A
fields要创建的集合的字段。N/A
description (可选)要创建的集合的描述。N/A
collection_name要创建的集合的名称。N/A

Create a collection(创建集合)

示例代码:

from pymilvus import Collection
collection = Collection(
    name=collection_name, 
    schema=schema, 
    using='default', 
    shards_num=2
    )
ParameterDescriptionOption
using 可选通过在这里指定服务器别名,选择在哪个Milvus服务器中创建集合。N/A
shards_num 可选要创建的集合的碎片数。[1,256]
properties: collection.ttl.seconds 可选TTL (Collection time to live)是收集的过期时间。过期集合中的数据将被清理,并且不会涉及到搜索或查询。TTL以秒为单位。该值应该为0或更大。0表示关闭TTL。

限制

FeatureMaximum limit
Length of a collection name255 characters
Number of partitions in a collection4,096
Number of fields in a collection64
Number of shards in a collection256

Modify a collection(修改集合)

示例代码:

collection.set_properties(properties={"collection.ttl.seconds": 1800})

TTL (Collection time to live)是集合中数据的过期时间。集合中过期的数据将被清理,并且不会涉及到搜索或查询。TTL以秒为单位。该值应该为0或更大。缺省值为0,即关闭TTL功能。

Check Collection Information(核对集合信息)

检查是否存在集合

from pymilvus import utility

utility.has_collection("book")

检查集合的具体信息

from pymilvus import Collection
collection = Collection("book") # Get an existing collection.

collection.schema             # Return the schema.CollectionSchema of the collection.
collection.description        # Return the description of the collection.
collection.name               # Return the name of the collection.
collection.is_empty           # Return the boolean value that indicates if the collection is empty.
collection.num_entities          # Return the number of entities in the collection.
collection.primary_field         # Return the schema.FieldSchema of the primary key field.
collection.partitions            # Return the list[Partition] object.
collection.indexes               # Return the list[Index] object.
collection.properties		# Return the expiration time of data in the collection.

列出这个Milvus实例中的所有集合。

from pymilvus import utility
utility.list_collections()

Drop a collection(删除一个集合)

from pymilvus import utility
utility.drop_collection("book")

Collection Alias(集合别名)

集合别名管理;别名的长度不能超过255个字符

创建集合别名
from pymilvus import utility
utility.create_alias(
  collection_name = "book",
  alias = "publication"
)
删除集合别名
from pymilvus import utility
utility.drop_alias(alias = "publication")
更改集合别名
from pymilvus import utility
utility.alter_alias(
  collection_name = "book",
  alias = "publication"
)

Load a Collection(加载一个集合)

将集合加载到内存中;Milvus中的所有搜索和查询操作都在内存中执行。

示例代码:

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load(replica_number=2)
ParameterDescription
partition_name (optional)要加载的分区名称
replica_number (optional)要加载的副本的编号

获取副本信息

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load(replica_number=2)    # Load collection as 2 replicas
result = collection.get_replicas()
print(result)

Release a Collection(释放一个集合)

从内存中释放集合,以减少内存使用。

示例代码:

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.release()

3.3Manage Partitions(分区管理)

Create a Partition(创建一个分区)

Milvus允许将大量矢量数据划分为少量的分区,然后可以将搜索和其他操作限制在一个分区上,以提高性能

集合由一个或多个分区组成。在创建一个新集合时,Milvus创建了一个默认分区_default

集合中的分区数不能超过4096

示例:在集合book中构建分区novel。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.create_partition("novel")

Check Partition Information(核对分区信息)

1)检查是否存在分区 collection.has_partition()

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.has_partition("novel")

2)列出所有分区collection.partitions

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.partitions

Drop Partitions(删除分区)

删除指定集合中的分区

collection.drop_partition("novel")
ParameterDescription
partition_name要删除的分区的名称。

Load a Partition(加载分区)

将分区加载到内存

将分区而不是整个集合加载到内存中可以显著降低内存使用,Milvus中的所有搜索和查询操作都在内存中执行。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load(["novel"], replica_number=2)

from pymilvus import Partition
partition = Partition("novel")       # Get an existing partition.
partition.load(replica_number=2)
ParameterDescription
partition_name分区名称。
replica_number (optional)要加载的副本的编号。
Get replica information(获取副本信息)

示例代码:

from pymilvus import Partition
partition = Partition("novel")       # Get an existing partition.
partition.load(replica_number=2)     # Load partition as 2 replicas
result = partition.get_replicas()
print(result)

Release a Partition(释放分区)

在执行搜索或查询操作后,将分区从内存中释放,以减少对内存的占用。

示例代码:

from pymilvus import Partition
partition = Partition("novel")       # Get an existing partition.
partition.release()
ParameterDescription
partition_name分区的名称

3.4Manage Data(数据管理)

Insert Entities(插入实体)

Prepare data(准备数据)

首先,准备要插入的数据。要插入的数据的数据类型必须与集合的模式匹配,否则Milvus将引发异常。

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
]
Insert data to Milvus(数据存储)

指定partition_name,选择将数据插入哪个分区。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
mr = collection.insert(data)
ParameterDescription
dataData to insert into Milvus.
partition_name (optional)要插入数据的分区名称。

Delete Entities(删除实体)

Milvus支持通过布尔表达式过滤的主键删除实体。

Prepare boolean expression

Milvus只支持删除带有明确指定主键的实体,这可以通过术语 in实现

其他运算符只能用于向量搜索中的查询或标量过滤。

下面的示例过滤主键值为0和1的数据。

expr = "book_id in [0,1]"
Delete entities

删除满足布尔表达式的实体。Milvus返回已删除实体的ID列表。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.delete(expr)
ParameterDescription
expr布尔表达式,指定要删除的实体。
partition_name (optional)删除实体的分区名称。

3.5Manage Indexes(索引管理)

Build an Index on Vectors

向量索引是元数据的组织单位,用于加速向量相似性搜索。如果没有建立在向量上的索引,Milvus将默认执行暴力搜索。

下面的例子用欧几里得距离(L2)作为相似度度量来构建一个1024个集群的IVF_FLAT索引。

更多的相似度测量:https://milvus.io/docs/metric.md

Prepare index parameter
index_params = {
  "metric_type":"L2",
  "index_type":"IVF_FLAT",
  "params":{"nlist":1024}
}

参数说明:

1)metric_type 用于度量向量相似性的度量类型。

  • 浮点向量
    • L2 (Euclidean distance) 欧几里得距离
    • IP (Inner product) 内积(即点积)
  • 二进制向量
    • JACCARD (Jaccard distance) 杰卡德距离
    • TANIMOTO (Tanimoto distance) Tanimoto距离
    • HAMMING (Hamming distance) 海明距离
    • SUPERSTRUCTURE (Superstructure)
    • SUBSTRUCTURE (Substructure)

2)index_type 用于加速向量搜索的索引类型。

  • 浮点向量

    • FLAT (FLAT)
    • IVF_FLAT (IVF_FLAT)
    • IVF_SQ8 (IVF_SQ8)
    • IVF_PQ (IVF_PQ)
    • HNSW (HNSW)
    • ANNOY (ANNOY)
    • DISKANN* (DISK_ANN)
  • 二进制向量

    • BIN_FLAT (BIN_FLAT)
    • BIN_IVF_FLAT (BIN_IVF_FLAT)

3)params

针对索引构建参数,请参阅内存索引和磁盘索引。See In-memory Index and On-disk Index for more information.

Build index

针对向量字段构建索引

通过指定向量字段名和索引参数来构建索引。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.create_index(
  field_name="book_intro", 
  index_params=index_params
)
ParameterDescription
field_name要在其上构建索引的向量字段的名称。
index_params要构建的索引的参数。

Build an Index on Scalars

针对标量构建索引。

不像向量,向量有大小和方向,标量只有大小。Milvus将单个数字和字符串视为标量。下面是Milvus中标量字段可用数据类型的列表。

为了加快混合搜索中的属性过滤,从Milvus v2.1.0开始,可以在标量字段上构建索引。

Build index

针对标量构建索引

要在标量字段上构建索引,不需要设置任何索引参数。标量字段索引名的默认值为default_idx。您可以将它设置为另一个合适的值。

下面的代码片段假设一个名为book的集合已经存在,并且要在字符串字段book_name上创建索引。

from pymilvus import Collection

collection = Collection("book")   
collection.create_index(
  field_name="book_name", 
  index_name="scalar_index",
)
collection.load()

一旦创建了索引,可以在向量相似度搜索中包含一个布尔表达式:

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}},
  "limit": 2,
  "expr": "book_name like \"Hello%\"", 
}
res = collection.search(**search_param)

Drop an Index(删除一个索引)

示例代码:

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.drop_index()

3.6Search And Query

Conduct a Vector Similarity Search(向量相似度搜索)

Milvus中的向量相似搜索,计算查询向量与集合中具有指定相似度量的向量之间的距离,并返回最相似的结果。通过指定筛选标量字段或主键字段的布尔表达式【boolean expression 】,您可以执行混合搜索【 hybrid search 】,甚至使用Time Travel【 Time Travel】进行搜索。

需求:在包含图书ID(主键)、字数(标量字段)和图书介绍(向量字段)的2000行数据集上执行向量相似度搜索,模拟基于向量搜索某些图书的情况。Milvus将根据定义的查询向量和搜索参数返回最相似的结果。
Load collection 加载集合

Milvus中的所有搜索和查询操作都在内存中执行。在进行向量相似性搜索之前,将集合加载到内存中。

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load()
Prepare search parameters 准备查询参数

准备适合搜索场景的参数。

下面的示例定义了搜索策略,使用欧几里得距离计算距离,并从IVF_FLAT索引构建的10个最近的群集中检索向量。

search_params = {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 5}
ParameterDescription
metric_type用于度量向量的相似性策略。See Simlarity Metrics for more information.
params特定于索引的搜索参数. See Vector Index for more information.
Conduct a vector search 执行向量查询

若要在特定分区 partition中搜索,请指定分区名称列表。

results = collection.search(
	data=[[0.1, 0.2]], 
	anns_field="book_intro", 
	param=search_params,
	limit=10, 
	expr=None,
	consistency_level="Strong"
)
ParameterDescription
data用于搜索的向量
anns_field要搜索的字段的名称。
param特定于索引的搜索参数。See Vector Index for more information.
offset返回集中要跳过的结果数。这个值和“limit”的和应该小于16384。
limit数最相似的结果返回。这个值和offset的和应该小于16384。
expr用于过滤属性的布尔表达式. See Boolean Expression Rules for more information.
partition_names (optional)要搜索的分区的名称列表。
output_fields (optional)要返回的字段的名称。当前版本不支持向量字段。
timeout (optional)允许RPC的持续时间(以秒为单位)。当设置为None时,客户端等待服务器响应或发生错误。
round_decimal (optional)返回距离的小数位数
consistency_level (optional)搜索的一致性级别。

检查最相似向量的主键值及其距离。

results[0].ids
results[0].distances

释放在Milvus中加载的集合,以减少搜索完成时的内存消耗。

collection.release()

Conduct a Hybrid Search(混合搜索)

混合搜索本质上是带有属性过滤的向量搜索,通过指定过滤标量字段或主键字段的布尔表达式,可以用某些条件限制搜索。

需求:假设根据向量化搜索某些书籍,但只想要字数在特定范围内的书籍,然后可以指定布尔表达式来过滤搜索参数中的word_count字段。Milvus将只在与表达式匹配的实体中搜索相似的向量。
Load collection(加载集合)
from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load()
Conduct a hybrid vector search(执行混合向量搜索)

通过指定布尔表达式,可以在向量搜索期间过滤实体的标量字段。

示例代码:将搜索范围限制为指定的word_count值范围内的向量。

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}},
  "offset": 0,
  "limit": 2,
  "expr": "word_count <= 11000",
}
res = collection.search(**search_param)

NOTE:collection.search返回结果为 SearchResult对象,一个可迭代的2d数组类,其第一个维度是要查询的向量数(nq),第二个维度是极限数(topk)。

Conduct a Vector Query(向量查询)

与向量相似度搜索不同,向量查询通过基于布尔表达式的标量过滤来检索向量。Milvus支持标量字段中的许多数据类型和各种布尔表达式。布尔表达式对标量字段或主键字段进行筛选,并检索与筛选器匹配的所有结果。

需求:对2000行的图书ID(主键)、字数(标量字段)和图书介绍(向量字段)数据集执行向量查询,模拟根据其ID查询某些图书的情况。
Load collection(加载集合)
from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load()
Conduct a vector query(执行向量查询)
res = collection.query(
  expr = "book_id in [2,4,6,8]",
  offset = 0,
  limit = 10, 
  output_fields = ["book_id", "book_intro"],
  consistency_level="Strong"
)

3.7Similarity Metrics

在Milvus中,相似性度量用于度量向量之间的相似性。选择一个好的距离度量有助于显著提高分类和聚类性能。下表显示了这些广泛使用的相似性度量如何与各种输入数据形式和Milvus索引相匹配。

欧式距离(L2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9TlHdqon-1685439244150)(assets/image-20230530161651453.png)]

其中,a = (a1, a2,…), an) 、b = (b1, b2,…, bn)是n维欧几里德空间中的两个点。

适用于连续性数据

内积(IP)

两个向量之间的内积定义如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-frfqYOLE-1685439244150)(assets/image-20230530162501522.png)]

其中A和B是向量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/589584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#快速入门(下)

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;Inline和lambda委托和lambda &#x1f449;&#x1f…

上海斯歌荣获中国低代码/零代码行业“卓越影响力厂商奖”

3月19日&#xff0c;在「第三届中国 ISIG 产业智能大会」隆重的颁奖典礼上&#xff0c;上海斯歌被授予“卓越影响力厂商奖”&#xff0c;并入围国内权威咨询机构LowCode低码时代的《2022年中国低代码&零代码行业研究报告》卓越影响力榜单。 「第三届ISIG中国产业智能大会」…

如何编写接口自动化框架系列通过yaml来管理测试用例(四)

本文是接口自动化测试框架系列篇的第四篇 &#xff0c;主要介绍yaml包的使用 。自动化测试的本质是将功能测试用例交给代码去 目录 1. yaml介绍&#xff1f; 2.python中的yaml包 3.项目中使用yaml包 4 项目总结 执行 &#xff0c;测试人员往往是在自动化框架添加对应的测试…

惠普83752B高功率合成扫频器,20 GHz

惠普83752B扫频仪为元器件测试市场带来了卓越的综合性能&#xff0c;在通用台式扫频仪、扫频仪或标量测试应用中&#xff0c;83752B提供了性价比最高的性能。这款扫频仪在保持模拟源速度的同时&#xff0c;提供了卓越的精度和稳定性。全合成CW、步进和科坡扫描模式可在宽带和窄…

QT+OpenGL几何着色器

QTOpenGL几何着色器 本篇完整工程见gitee:QtOpenGL 对应点的tag&#xff0c;由turbolove提供技术支持&#xff0c;您可以关注博主或者私信博主 几何着色器 几何着色器的输入是一个图元&#xff08;如点或者三角形&#xff09;的一组顶点几何着色器可以再顶点发送到下一着色器…

Linux——进程的等待

目录 前言&#xff1a; 一.进程等待 父进程回收子进程信息的相关函数1&#xff1a;wait函数 实验案例1&#xff1a;设置wait函数参数为NULL 实验案例2&#xff1a;wait函数带wstatus参数的案例&#xff1a;当子进程正常运行完退出时 情况3&#xff1a; wait函数带wstatus参数…

Softing“物联网连接和OPC UA通信”系列研讨会

— 免费线上研讨会概览 — 您是否正在为车间应用寻找机器连接&#xff1f;您是否需要为创新的物联网解决方案制定架构决策&#xff1f;或者您是否已经选择了物联网平台&#xff0c;需要连接组件来访问自动化网络中的数据&#xff1f;在Softing线上研讨会中&#xff0c;我们将讨…

JavaScript 进阶 (三)

目录 编程思想 面向过程编程 面向对象编程 构造函数 原型 原型 constructor 属性 对象原型 原型继承 原型链 编程思想 面向过程编程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用…

Python中的封装、继承与多态

1. 前言 面向对象的三大特性&#xff0c;想必大家肯定是耳熟能详。就是今天要介绍的内容&#xff1a;封装、继承、多态。面向对象的思想都是一样的&#xff0c;这里我用Python进行实现&#xff01; 2. 封装 2.1 什么是封装呢&#xff1f; 封装就是&#xff1a;我写了一个类…

【T6/T3】根据畅捷通T6/T3账套备份文件判断软件的版本

【问题需求】 当畅捷通T6/T3软件只有正常的账套备份文件的时候&#xff0c; 通过账套备份文件判断软件版本&#xff0c; 进而安装软件恢复数据。 【解决方法】 【畅捷通T6】 找到T6的备份文件&#xff0c; 用记事本打开【UfErpAct.lst】文件。 查看【VersionbatchflagForUFDAT…

【linux】web基础与HTTP协议

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 web基础与HTTP协议 一、DNS/HTML1.域名的概述2.域名注册3.网页的概念4.HTML概述5.网页基本标签 二、web基础1.web概述2.静态网页3.静态网页特点4.动态网页5.动态网页的特点 三…

软件开发SOLID设计原则

前言&#xff1a;SOLID设计原则&#xff0c;不管是软件系统还是代码的实现&#xff0c;遵循SOLID设计原则&#xff0c;都能够有效的提高系统的灵活和可靠性&#xff0c;应对代码实现的需求变化也能更好的扩展和维护。因此提出了五大原则——SOLID。 我是通过老师讲解以及老师…

【深入浅出Spring Security(三)】默认登录认证的实现原理

Spring Security 默认登录认证的实现原理 一、默认配置登录认证过程二、流程分析登录页面的由来表单登录认证过程&#xff08;源码分析&#xff09; 三、UserDetailsServiceSpring Security 中 UserDetailsService 的实现默认的 UserDetailsService 配置&#xff08;源码分析&a…

【送书福利-第七期】《分布式中间件核心原理与RocketMQ最佳实践》

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、内容介绍三、作者介…

孪生诱捕网络在欺骗防御领域的应用

随着以数字化、网络化和智能化为特征的信息化浪潮的蓬勃兴起&#xff0c;信息已经成为重要的战略资源与重要生产要素&#xff0c;在国家的发展和人们的生产生活中起到至关重要的作用。信息化在给人们带来便利的同时&#xff0c;网络信息安全问题也日益凸显。经过多年的网络安全…

【Linux】Linux 文件系统与设备文件

Ref: 《Linux设备驱动开发详解&#xff1a;基于最新的Linux4.0内核》中的第5章《Linux 文件系统与设备文件》 基于Linux 5.10 本文结合源码和实例分析了Linux 文件系统与设备文件&#xff0c;主要介绍文件系统的构成和发展&#xff0c;以及三种虚拟文件系统debugfs procfs sysf…

《微服务实战》 第二十七章 CAS

前言 本章节介绍CAS 1、CAS的概念 CAS的全称为&#xff1a;CompareAndSwap,直译为对比和交换。 CAS实际是普遍处理器都支持的一条指令&#xff0c;这条指令通过判断当前内存值V、旧的预期值A、即将更新的值B是否相等来对比并设置新值&#xff0c;从而实现变量的原子性。 Syn…

二进制安装Kubernetes(K8s)集群---从零安装教程(带证书)

一、实验环境 1、安装说明 selinux iptables off 官方网站&#xff1a;https://kubernetes.io/zh-cn/docs/home 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster0210.10.10.22rhel7.5nginx、…

【细读Spring Boot源码】Spring如何获取一个Bean?BeanFactory的getBean方法

前言 在读refresh(context);时&#xff0c;finishBeanFactoryInitialization(beanFactory);中beanFactory.preInstantiateSingletons();用于实例化剩余所有的non-lazy-init的单例。这里包含了前置处理器和后置处理器 这里面就用到了本文主题getBean(beanName); 下面具体看看这…

4.数据结构期末复习之树

1.树的概念(一对多)(要求会写遍历序列) 1)n>个节点,n0时为空树2)仅有一个根节点3)左右节点互不相交,子节点一对多2.树的特点 1.子树之间没有关系 2.节点不属于多个子树(一个节点只能在一颗子树里面)3.没有回路(就是成环)4.有层次性3.术语 1.节点的度:拥有子树的个数…