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

【redis】集群 数据分片算法:哈希求余、一致性哈希、哈希槽分区算法

文章目录

  • 什么是集群
  • 数据分片算法
    • 哈希求余
      • 分片搬运
    • 一致性哈希
      • 扩容
    • 哈希槽分区算法
      • 扩容
      • 相关问题

什么是集群

广义的集群,只要你是多个机器,构成了分布式系统,都可以称为是一个“集群

  • 前面的“主从结构”和“哨兵模式”可以称为是“广义的集群”

此处我们介绍的是狭义的集群,redis 提供的“集群模式”,主要是解决存储空间不足的问题(拓展存储空间)

哨兵模式提高了系统的可用性。但是其本质上还是 redis 的主从节点存储数据。其中就要求一个主节点/从节点,就得存储整个数据的“全集”

  • 是用内存存储数据的,内存空间也都有限,很可能出现存储不下的情况

此处关键问题,就是引入多台机器,每台机器存储一部分数据

  • 随着机器数目的增加,每个机器存储的数据量就减少了
  • 只要机器的规模足够多,就可以存储任意大小的数据了(公司的实力)

不是说光引入多台机器就够了,每个存储数据的机器还需要搭配若干多个从节点image.png

数据分片算法

每块数据都称为是一个“分片”(上图的每个红框)

哈希求余

借鉴了哈希表的基本思想。借助 hash 函数,把一个 key 映射到一个整数,再针对数组长度求余,就可以得到一个数组下标

比如有三个分片:0、1、2

  1. 此时就可以针对要插入的 keyredis 都是键值对结构的数据),计算 hash 值(比如 MD5
  2. 再把这个 hash 值余上分片个数 N,就得到了一个下标
  3. 此时就可以把这个数据放到该下表对应的分片中了
  • hash(key) % N => 0 ,此时这个 key 就要存储在 0 号分片中
    后续查询 key 的时候,还是同样的算法
  • key 是一样的,hash 函数是一样的,得到的分片值就是一样的

[!quote] MD5 算法
其本身就是一个计算 hash 值的算法,针对一个字符串,里面的内容进行一系列的数学变换,得到的是一个十六进制的数字

  • MD5 计算结果是定长的;无论输入的原字符串多长,最终算出的结果就是固定长度
  • MD5 计算结果是分散的(哈希函数);两个原字符串,哪怕大部分都相同,只有一个小的地方不同,算出来的 MD5 值也会差别很大
  • MD5 计算结果是不可逆的(加密);给你原字符串,可以很容易算出 MD5 的值,给你 MD5 的值,很难还原出原始的字符串(理论上是不可行的)

分片搬运

一旦服务器需要扩容,就需要更高的成本了

分片主要目的是为了能提高存储能力,分片越多,能存的数据越多,成本也越高

  • 一般都是先搞几个分片(3 个)
  • 但是随着业务增长,数据变多了,3 个分片就已经不足以保存了,就需要扩容

但是引入新的分片之后,N 就改变了。hash(key) % N => 0

  • hash 函数和 key 都不变的情况下,如果 N 改变了,整体的分片结果仍然会变
  • 如果我们发现某个数据,在扩容之后,不应该待在当前的分片中了,就需要搬运

此处我们列出的这些值,可以脑补成 hash(key)。假设当前计算完 hash 值之后,得到的数值正好是 100-120image.png

  • 扩容后,绝大部分 key 都是需要进行搬运的
  • 搬运的时候,不仅仅只搬主节点,相关从节点也是都要搬运的,非常麻烦

如果是 20亿 个数据呢?

  • 这个级别的扩容,开销极大,往往是不能直接在生产环境上操作的,只能通过“替换”的方式来实现扩容
  • 这样依赖的机器更多了,成本更高,操作步骤非常复杂

一致性哈希

可以有效的降低上面搬运的开销

  1. 0->2^32-1 这个数据空间,映射到一个圆环上,数据按照顺时针方向增长![[Pasted Image 20250326152129_941.png|426]]

  2. 假设当前存在三个分片,就把分片放到圆环的某个位置上image.png|386

  3. 假定有一个 key,计算得到 hashH,那么这个 key 映射到哪个分片呢?

    • 就是从 H 所在位置,顺时针往下找,找到的第一个分片,即为该 key 所从属的分片
      image.png

这就相当于,N 个分片的位置,把整个圆环分成了 N 个管辖区间,keyhash 值落在某个区间内,就归对应区间管理image.png

  • 哈希求余这种操作中,当前 key 属于哪个分片,是交替的,而这种交替出现就会导致成本变大
    • 101 属于 0
    • 102 属于 1
    • 103 属于 2
  • 在一致性哈希这样的设定下,把交替出现改成了连续出现

扩容

原有分片在环上的位置不动,只要在环上新安排一个分片位置即可image.png

  • 此时,只需要把 0 号分片上的部分数据,搬运给 3 号分片即可。1 号和 2 号分片管理的区间都是不变的

优点:大大降低了扩容时数据搬运的规模,提高了扩容操作的效率
缺点:数据分配不均匀(有的多有的少,数据倾斜)

如果一次扩容高多个分片,确实是一个好的思路,可以避免刚才的数据倾斜的情况。总的搬运数量仍然是比最初的 hash 求余的方式更少的

  • 最大的问题:领导会给你批这么多机器码?

哈希槽分区算法

redis 真正采用的分片算法


hash_slot crc16(key) % 16384
  • crc16 是一种 hash 值的算法
  • 1638416 * 1024 => 2^14(16KB)
  • hash_slot 是哈希槽
  • 相当于是把整个哈希值,映射到 16384 个槽位上,也就是 [0, 16383],然后再把这些槽位比较均匀的分配给每个分片上,每个分片的节点都需要记录自己持有哪些分片

假设当前有三个分片,一种可能的分配方式:

  • 0 号分片:[0, 5461],共 5462 个槽位
  • 1 号分片: [5462, 10923],共 5462 个槽位
  • 2 号分片: [10924, 16383],共 5460 个槽位
    虽然不是严格意义的均匀,但是差异非常小。此时这三个分片上的数据就是比较均匀的了

这种算法,本质就是把一致性哈希和哈希求余这两种方法结合了一下

上面只是一种可能的分片方式,实际上分片是非常灵活的。每个分片持有的槽位号,可以使连续的,也可以是不连续的,只要数量差不多

  • 此处每个分片都会使用“位图”这样的数据结构,表示出当前有多少槽位号
  • 16384bit 位,用每一位 0/1 来区分自己这个分片当前是否持有该槽位号

扩容

如果需要扩容,比如新增一个 3 号分片,就可以针对原有的槽位进行重新分配

比如可以把之前每个分片持有的槽位,各拿出一点,分给新分片。一种可能得分配方式:

  • 0 号分片:[0, 4095],共 4096 个槽位
  • 1 号分片:[5462, 9557],共 4096 个槽位
  • 2 号分片:[10924, 15019],共 4096 个槽位
  • 3 号分片:[4096, 5461] + [9558, 10923] + [15019, 16383] ,共 4096 个槽位

我们在实际使用 redis 集群分片的时候,不需要手动指定哪些槽位分配给哪个分片,只要告诉某个分片应该持有多少个槽位即可,redis 会自动完成后续的槽位分配,以及对应的 key 搬运的工作

  • 不过也可以手动配置

相关问题

  1. redis 集群是最多有 16384 个分片吗?

并非如此,如果每个分片上就只有一个槽位,此时很难保证数据在各个分片上的均衡性

  • key 是要先映射到槽位,再映射到分片。如果每个分片包含的槽位较多,如果槽位个数相当,就可以认为是包含的 key 数量相当
  • 如果每个分片包含的槽位非常少,槽位个数不一定能直观的反映到 key 的数目
  • 有的槽位可能是有多个 key;有的槽位可能是没有 key

实际上 redis 的作者建议集群分片数不应该超过 1000

  • 如果真是 1.6w 个分片,整个数据服务器的集群规模就太可怕了,几万台主机构成的集群了,整个集群的可用性是非常堪忧的
  1. 槽位数量为什么是 16384

redis 作者的答案: https://github.com/redis/redis/issues/2576
The reason is:

  1. Normal heartbeat packets carry the full configuration of a node, that can be replaced in an idempotent way with the old in order to update an old config. This means they contain the slots configuration for a node, in raw form, that uses 2k of space with16k slots, but would use a prohibitive 8k of space using 65k slots.
  2. At the same time it is unlikely that Redis Cluster would scale to more than 1000 mater nodes because of other design tradeoffs.

So 16k was in the right range to ensure enough slots per master with a max of 1000 maters, but a small enough number to propagate the slot configuration as a raw bitmap easily. Note that in small clusters the bitmap would be hard to compress because when N is small the bitmap would have slots/N bits set that is a large percentage of bits set.

翻译过来⼤概意思是:

  • 节点之间通过⼼跳包通信. ⼼跳包中包含了该节点持有哪些 slots. 这个是使⽤位图这样的数据结构表⽰的. 表⽰ 16384 (16k) 个 slots, 需要的位图⼤⼩是 2KB. 如果给定的 slots 数更多了, ⽐如 65536 个了, 此时就需要消耗更多的空间, 8KB 位图表⽰了. 8KB, 对于内存来说不算什么, 但是在频繁的网络⼼跳包中, 还是⼀个不⼩的开销的.

  • 另⼀⽅⾯, Redis 集群⼀般不建议超过 1000 个分⽚. 所以 16k 对于最⼤ 1000 个分⽚来说是⾜够⽤的, 同时也会使对应的槽位配置位图体积不⾄于很⼤

  • 虽然 8KB2KB 也打不了多少,但是心跳包是周期性通信的,非常频繁,很吃网络带宽
  • 这个值个数上基本够用了,同时占用的硬件资源(网络带宽)又不是很大

相关文章:

【redis】集群 数据分片算法:哈希求余、一致性哈希、哈希槽分区算法

文章目录 什么是集群数据分片算法哈希求余分片搬运 一致性哈希扩容 哈希槽分区算法扩容相关问题 什么是集群 广义的集群,只要你是多个机器,构成了分布式系统,都可以称为是一个“集群” 前面的“主从结构”和“哨兵模式”可以称为是“广义的…...

计算机组成原理笔记(六)——2.2机器数的定点表示和浮点表示

计算机在进行算术运算时,需要指出小数点的位置,根据小数点的位置是否固定,在计算机中有两种数据格式:定点表示和浮点表示。 2.2.1定点表示法 一、基本概念 定点表示法是一种小数点的位置固定不变的数据表示方式,用于表示整数或…...

将树莓派5当做Ollama服务器,C#调用generate的API的示例

其实完全没这个必要,性能用脚后跟想都会很差。但基于上一篇文章的成果,来都来了就先简单试试吧。 先来看看这个拼夕夕上五百多块钱能达到的效果: 只要对速度没要求,那感觉就还行。 Ollama默认只在本地回环(127.0.0…...

MYSQL数据库(一)

一.数据库的操作 1.显示数据库 show databases; 2.创建数据库 create database 数据库名; 3.使用数据库 use 数据库名; 4.删除数据库 drop database 数据库名; drop database if exists 数据库名; 二.表的操作 1.显示所有表 show tables; 2.查看表结构 des…...

Python Cookbook-4.15 字典的一键多值

任务 需要一个字典,能够将每个键映射到多个值上。 解决方案 正常情况下,字典是一对一映射的,但要实现一对多映射也不难,换句话说,即一个键对应多个值。你有两个可选方案,但具体要看你怎么看待键的多个对…...

IDEA 终端 vs CMD:为什么 java -version 显示的 JDK 版本不一致?

前言:离谱的 JDK 版本问题 今天遇到了一个让人抓狂的现象:在 Windows 的 CMD 里输入 java -version 和在 IntelliJ IDEA 终端输入 java -version,居然显示了不同的 JDK 版本! 本以为是环境变量、缓存或者 IDEA 设置的问题&#x…...

Flask登录页面后点击按钮在远程CentOS上自动执行一条命令

templates文件夹和app.py在同一目录下。 templates文件夹下包括2个文件:index.html login.html app.py代码如下: import os import time from flask import Flask, render_template, request, redirect, session, make_response import mysql.con…...

深度解析:文件夹变白色文件的数据恢复之道

在数字化时代,数据的重要性不言而喻。然而,当我们在使用计算机时,偶尔会遇到一些棘手的问题,其中“文件夹变白色文件”便是一个令人困惑且亟待解决的难题。这一现象不仅影响了文件的正常访问,更可能隐藏着数据丢失的风…...

【Matlab】-- 基于MATLAB的飞蛾扑火算法与反向传播算法的混凝土强度预测

文章目录 文章目录 01 内容概要02 MFO-BP模型03 部分代码04 运行结果05 参考文献06 代码下载 01 内容概要 本资料介绍了一种基于飞蛾扑火算法(Moth Flame Optimization, MFO)与反向传播算法(Backpropagation, BP)的混凝土强度预…...

【Python实例学习笔记】图像相似度计算--哈希算法

【Python实例学习笔记】图像相似度计算--哈希算法 一、哈希算法的实现步骤:二、对每一步都进行注解的代码 一、哈希算法的实现步骤: 1、缩小尺寸: 将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节&#xff0c…...

2025DevSecOps标杆案例|智能制造国际领导厂商敏捷安全工具链实践

某智能制造国际领导厂商是涵盖智能家居、楼宇科技,工业技术、机器人与自动化和数字化创新业务五大业务板块为一体的全球化科技集团,连续入选《财富》世界500强,每年为全球超过4亿用户、各领域的重要客户与战略合作伙伴提供产品和服务。 数智化…...

【YOLOv11】目标检测任务-实操过程

目录 一、torch环境安装1.1 创建虚拟环境1.2 启动虚拟环境1.3 安装pytorch1.4 验证cuda是否可用 二、yolo模型推理2.1 下载yolo模型2.2 创建模型推理文件2.3 推理结果保存路径 三、labelimg数据标注3.1 安装labelimg3.2 解决浮点数报错3.3 labelimg UI界面介绍3.4 数据标注案例…...

第十七章:Python数据可视化工工具-Pyecharts库

一、Pyecharts简介 资源绑定附上完整资源供读者参考学习! Pyecharts是一个基于百度开源可视化库ECharts的Python数据可视化工具,支持生成交互式的HTML格式图表。相较于Matplotlib等静态图表库,Pyecharts具有以下优势: 丰富的图表…...

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误

解决【vite-plugin-top-level-await】 插件导致的 Bindings Not Found 错误 环境设置 操作系统: macOS硬件平台: M1 Pro前端框架: Vue 3Node.js 版本: 20 在使用 Vue 项目时,我们尝试集成 vite-plugin-top-level-await 插件以支持顶层 await 语法。然而&#xff…...

《八大排序算法》

相关概念 排序:使一串记录,按照其中某个或某些关键字的大小,递增或递减的排列起来。稳定性:它描述了在排序过程中,相等元素的相对顺序是否保持不变。假设在待排序的序列中,有两个元素a和b,它们…...

六十天前端强化训练之第三十七天之Docker 容器化部署实战指南(大师级详解)

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、Docker 核心知识体系 1.1 容器革命:改变开发方式的技术 1.2 Docker 三剑客 1.3 Docker 生命周期管理 1.4 关键命令详解 二、前端容器化实战案例&#xff…...

RabbitMQ--延迟队列事务消息分发

目录 1.延迟队列 1.1应用场景 1.2利用TTL死信队列模拟延迟队列存在的问题 1.3延迟队列插件 1.4常见面试题 2.事务 2.1配置事务管理器 3.消息分发 3.1概念 3.2应用场景 3.2.1限流 3.2.2负载均衡 1.延迟队列 延迟队列(Delayed Queue),即消息被发送以后, 并…...

列表,元组,字典,集合,之间的嵌套关系

在 Python 中,列表、元组、字典和集合的嵌套关系需要遵循各自的特性(如可变性、可哈希性)。以下是它们之间的嵌套规则、示例和典型应用场景的详细梳理: 1. 列表(List)的嵌套 特性: 可变、有序…...

【行驶证识别】批量咕嘎OCR识别行驶证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式

项目背景 在许多业务场景中,如物流管理、车辆租赁、保险理赔等,常常需要处理大量的行驶证照片复印件。手动录入行驶证上的文字信息,像车主姓名、车辆型号、车牌号码等,不仅效率低下,还容易出现人为错误。借助 OCR(光学字符识别)技术,能够自动识别行驶证图片中的文字信…...

鸿蒙HarmonyOS NEXT设备升级应用数据迁移流程

数据迁移是什么 什么是数据迁移,对用户来讲就是本地数据的迁移,终端设备从HarmonyOS 3.1 Release API 9及之前版本(单框架)迁移到HarmonyOS NEXT(双框架)后保证本地数据不丢失。例如,我在某APP…...

MCP从零开始

MCP简介 MCP,全称是Model Context Protocol,模型上下文协议,由Claude母公司Anthropic于去年11月正式提出。MCP解决的最大痛点就是Agent开发中调用外部工具的技术门槛过高的问题。 能调用外部工具,是大模型进化为智能体Agent的关…...

Three.js 快速入门教程【十九】CSS2DRenderer(CSS2D渲染器)介绍,实现场景中物体或设备标注标签信息

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…...

横扫SQL面试——连续性登录问题

横扫SQL面试 📌 连续性登录问题 在互联网公司的SQL面试中,连续性问题堪称“必考之王”。💻🔍 用户连续登录7天送优惠券🌟,服务器连续报警3次触发熔断⚠️,图书馆连续3天人流破百开启限流⚡” …...

爱因斯坦求和 torch

目录 向量点积 矩阵乘法 矩阵转置 向量转换相机坐标系 在 Python 的科学计算库(如 NumPy)中,einsum 是一个强大的函数,它可以简洁地表示各种张量运算。下面是几个不同类型的使用示例: 向量点积 向量点积是两个向量…...

Spring Initializr搭建spring boot项目

介绍 Spring Initializr 是一个用于快速生成 Spring Boot 项目结构的工具。它为开发者提供了一种便捷的方式,可以从预先定义的模板中创建一个新的 Spring Boot 应用程序,从而节省了从头开始设置项目的大量时间。 使用 Spring Initializr,你…...

【实战】渗透测试下的文件操作

目录 Linux查找文件 Windows查找文件 查找可写目录 windows Linux 创建 Windows Linux 压缩 解压 远程解压文件 Linux查找文件 >find / -name index.php 查找木马文件 >find . -name *.php | xargs grep -n eval( >find . -name *.php | xargs grep -n ass…...

MATLAB 控制系统设计与仿真 - 30

用极点配置设计伺服系统 方法2-反馈修正 如果我们想只用前馈校正输入,从而达到伺服控制的效果,我们需要很精确的知道系统的参数模型,否则系统输出仍然具有较大的静态误差。 但是如果我们在误差比较器和系统的前馈通道之间插入一个积分器&a…...

P1091 [NOIP 2004 提高组] 合唱队形

题目链接: 思路: 题目意思,找出最少的同学出列,保证学生 1-t 上升, t-n 下降。我们只要求出每个点的最长上升子序列和最长不上升子序列,然后总人数-最长上升子序列和最长不上升子序列1,就是最少…...

小林coding-12道Spring面试题

1.说一下你对 Spring 的理解?spring的核心思想说说你的理解? 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc?依赖倒置,依赖注入,控制反转分别是什么?依赖注…...

通过Spring Boot集成WebSocket进行消息通信

文章目录 通过Spring Boot集成WebSocket进行消息通信1. 创建 Spring Boot 项目2. 添加 WebSocket 依赖3. 配置 WebSocket4. 创建 WebSocket 处理器5. 创建控制器(可选)6. 前端页面测试7. 运行项目注意事项 通过Spring Boot集成WebSocket进行消息通信 1.…...

ComfyUI发展全景:从AI绘画新星到多功能创意平台的崛起

在人工智能技术迅猛发展的浪潮中,ComfyUI作为基于Stable Diffusion的开源工具,已经从最初的AI绘画辅助软件成长为支持多模态创作的强大平台。本文将全面梳理ComfyUI的发展历程、技术特点、应用场景及其在AIGC生态中的独特地位,同时展望这一工…...

11-项目涉及设备的问题

我们部门在开发一些项目时,确实需要借用设备,但每次开发新需求时都要从硬件部门借设备,开发完成后又要归还。这种频繁的借还流程不仅增加了沟通成本,还导致项目负责人和开发人员对设备的功能和应用场景缺乏直观的了解。有时甚至连…...

将 Markdown 表格结构转换为Excel 文件

在数据管理和文档编写过程中,我们经常使用 Markdown 来记录表格数据。然而,Markdown 格式的表格在实际应用中不如 Excel 方便,特别是需要进一步处理数据时。因此,我们开发了一个使用 wxPython 的 GUI 工具,将 Markdown…...

C++学习之Linux文件编译、调试及库制作

目录 1.rwx对于文件和目录的区别 2.gcc编译过程 3.数据段合并和地址回填说明 4.gcc编译其他参数 5.函数库简介 6.静态库的使用 7.动态库的简介 8.动态库制作基本流程 9.启动APP错误解决方案12 10.启动APP错误解决方案34 11.makefile一组规则 12.makefile的两个函数 …...

neo4j中导入csv格式的三元组数据

csv数据格式: head_entity,relation,tail_entity 02.02类以外的脂肪乳化制品,包括混合的和(或)调味的脂肪乳化制品,允许添加,β-胡萝卜素 02.02类以外的脂肪乳化制品,包括混合的和(或)调味的脂…...

高项第十六章——项目采购管理

什么是采购管理?项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。 项目采购管理包括编制和管理协议所需的管理和控制过程。 16_1 管理基础 什么是协议?协议是用于明确项目初步意向的任何文件或沟通结果,协议的范…...

架构师面试(二十二):TCP 协议

问题 今天我们聊一个非常常见的面试题目,不管前端还是后端,也不管做的是上层业务还是底层框架,更不管技术方向是运维还是架构,都可以思考和参与一下哈! TCP协议无处不在,我们知道 TCP 是基于连接的端到端…...

五.ubuntu20.04 - ffmpeg推拉流以及Nginx、SRS本地部署

一.本地部署nginx 1.编译ffmpeg,参考这位博主的,编译选项有的enable找不到的不需要的可以直接删除,但是像sdl(包含ffplay)、h264、h265这些需要提前下载好,里面都有下载指令。 Ubuntu20.04 编译安装 FFmp…...

JS 手撕题高频考点

前端面试中,JS 手撕题是高频考点,主要考察 编程能力、算法思维、JS 核心知识。以下是最常见的手撕题分类 代码示例: 目录 📌 1. 手写函数柯里化📌 2. 手写 debounce(防抖)📌 3. 手写…...

Hyperlane框架临时上下文数据管理:提升Web开发效率的利器

Hyperlane框架临时上下文数据管理:提升Web开发效率的利器 在现代Web开发中,临时上下文数据管理是实现高效请求处理的关键。Hyperlane框架通过创新的临时上下文存储机制,为开发者提供了一套简洁、安全的解决方案,让数据在请求生命…...

QT操作PDF文件

Qt 早期本身不提供原生的 PDF 操作功能。从 Qt 5.15 开始,Qt 提供了 PDF 模块,可以显示和提取 PDF 内容。Qt中有如下几种方式实现 PDF 文件的生成、读取和操作。 1、使用 QPrinter 生成 PDF 2、使用 Qt PDF 模块 (Qt 5.15+) 3、使用第三方库(比如:Poppler) 一、使用 Q…...

【算法手记8】NC95 数组中的最长连续子序列 字母收集

🦄个人主页:修修修也 🎏所属专栏:刷题 ⚙️操作环境:牛客网 目录 一.NC95 数组中的最长连续子序列 题目详情: 题目思路: 解题代码: 二.字母收集 题目详情: 题目思路: 解题代码: 结语 一.NC95 数组中的最长连续子序列 牛客网题目链接(点击即可跳转):NC95 …...

AI渗透测试:网络安全的“黑魔法”还是“白魔法”?

引言:AI渗透测试,安全圈的“新魔法师” 想象一下,你是个网络安全新手,手里攥着一堆工具,正准备硬着头皮上阵。这时,AI蹦出来,拍着胸脯说:“别慌,我3秒扫完漏洞&#xff0…...

使用perf工具分析Linux系统的性能瓶颈

想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring 使用perf工具分析Linux系统的性能瓶颈 在现代计算系统中,性能瓶颈是一个经常遇到…...

知识就是力量——HELLO GAME WORD!

你好!游戏世界! 简介环境配置前期准备好文章介绍创建头像小功能组件安装本地中文字库HSV颜色空间音频生成空白的音频 游戏UI开发加载动画注册登录界面UI界面第一版第二版 第一个游戏(贪吃蛇)第二个游戏(俄罗斯方块&…...

LeetCode算法题(Go语言实现)_20

题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中: answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成…...

ES拼音分词自动补全实现

#测试拼音分词 POST /_analyze { "text":"如家酒店真不错", "analyzer": "pinyin" } #这里把拼音的首字母放到这里,也说明了这句话没有被分词,而是作为一个整体出现的 #还把每一个字都形成了一个拼音&#…...

Spring Boot 日志 配置 SLF4J 和 Logback

文章目录 一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback 一、前言 在开发 Java 应用时,日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息,帮助开发者…...

构建大语言模型应用:数据准备(第二部分)

本专栏通过检索增强生成(RAG)应用的视角来学习大语言模型(LLM)。 本系列文章 简介数据准备(本文)句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 如上…...

mac m 芯片 动态切换 jdk 版本jdk8.jdk11.jdk17

下载 jdk 版本. 默认安装路径在. /Library/Java/JavaVirtualMachines配置环境变量 # 动态获取所有 JDK 路径 export JAVA_8_HOME$(/usr/libexec/java_home -v 1.8) export JAVA_11_HOME$(/usr/libexec/java_home -v 11) export JAVA_17_HOME$(/usr/libexec/java_home -v 17)#…...