六、Redis 分布式系统
六、Redis 分布式系统
- 六、Redis 分布式系统
- 6.1 数据分区算法
- 6.1.1 顺序分区
- 6.1.2 哈希分区
- 6.2 系统搭建与运行
- 6.2.1 系统搭建
- 6.2.2 系统启动与关闭
- 6.3 集群操作
- 6.3.1 连接集群
- 6.3.2 写入数据
- 6.3.3 集群查询
- 6.3.4 故障转移
- 6.3.5 集群扩容
- 6.3.6 集群收缩
- 6.4 分布式系统的限制
- 七、Redis 缓存
- 八、Lua脚本详解
- 九、分布式锁
数据库系列文章:
关系型数据库:
- MySQL —— 基础语法大全
- MySQL —— 进阶
非关系型数据库:
- 一、Redis 的安装与配置
- 二、Redis 基本命令(上)
- 三、Redis 基本命令(下)
- 四、Redis 持久化
- 五、Redis 主从集群
六、Redis 分布式系统
Redis 分布式系统,官方称为 Redis Cluster, Redis 集群,其是 Redis 3.0 开始推出的分布式解决方案。其可以很好地解决 不同 Redis 节点 存放不同数据,并将用户请求方便地路由到不同 Redis 的问题。
6.1 数据分区算法
分布式数据库系统 会根据不同的数据分区算法,将数据分散存储到不同的数据库服务器节点上,每个节点管理着整个数据集合中的一个子集。

常见的数据分区规则有两大类:顺序分区 与 哈希分区。
6.1.1 顺序分区
顺序分区规则可以将数据按照某种顺序平均分配到不同的节点。 不同的顺序方式,产生了不同的分区算法。 例如,轮询分区算法、时间片轮转分区算法、数据块分区算法 、业务主题分区算法等。由于这些算法都比较简单,所以这里就不展开描述了。
⭐️(1)轮询分区算法
每产生一个数据,就依次分配到不同的节点。该算法适合于数据问题不确定的场景。其分配的结果是,在数据总量非常庞大的情况下,每个节点中数据是很平均的。但生产者与数据节点间的连接要 长时间保持。
⭐️(2)时间片轮转分区算法
在某个固定长度的时间片内的数据都会分配到一个节点。时间片结束,再产生的数据就会被分配到下一个节点。这些节点会被依次轮转分配数据。该算法可能会出现节点数据 不平均 的情况(因为每个时间片内产生的数据量可能是不同的)。但生产者与节点间的连接只需占用当前正在使用的这个就可以,其它连接使用完毕后就立即释放。
⭐️(3)数据块分区算法
在整体数据总量确定的情况下,根据各个节点的存储能力,可以将连接的某一整块数据分配到某一节点。
⭐️(4)业务主题分区算法
数据可根据不同的业务主题,分配到不同的节点。
6.1.2 哈希分区
哈希分区规则是充分利用数据的哈希值来完成分配,对 数据哈希值 的 不同使用方式 产生了不同的哈希分区算法。哈希分区算法相对较复杂,这里详细介绍几种常见的哈希分区算法。
⭐️(1)节点取模分区算法
该算法的前提是,每个节点 都已分配好了一个唯一序号,对于 N 个节点的分布式系统,其序号范围为 [0, N - 1] 。然后选取数据本身或可以代表 数据特征 的数据的一部分作为 key 计算 hash(key) 与 节点数量 N 的模,该计算结果即为该数据的存储节点的序号。
该算法最大的优点是简单,但其也存在较严重的不足。如果分布式系统扩容或缩容,已经存储过的数据需要根据新的节点数量 N 进行 数据迁移,否则用户根据 key 是无法再找到原来的数据的。
生产中扩容一般采用 翻倍扩容 / 减半缩容 方式,以减少扩容时数据迁移的比例。
⭐️(2)一致性哈希分区算法
一致性 hash 算法通过一个叫作 一致性 hash环 的数据结构实现。这个环的起点是 0 ,终点是 2 32 − 1 2^{32} - 1 232−1 ,并且起点与终点重合。 环中间的整数按 逆/顺时针 分布,故这个环的整数分布范围是 [0, 2 32 − 1 2^{32} - 1 232−1 ] 。

上图中存在四个对象 o1 、 o2 、 o3 、 o4 ,分别代表四个待分配的数据,红色方块是这四个数据的 hash(o) 在 Hash 环中的落点。同时,图上还存在三个节点 m0 、 m1 、 m2 ,绿色圆圈是这三节点的 hash(m) 在 Hash 环中的落点。
现在要为数据分配其要存储的节点。该数据对象的 hash(o) 按 照逆/顺时针方向距离哪个节点的 hash(m) 最近,就将该数据存储在哪个节点。这样就会形成上图所示的分配结果。
该算法的最大优点是,节点的扩容与缩容,仅对按照逆/顺时针方向距离该节点 最近的节点有影响,对其它节点无影响。
当节点数量较少时,非常容易形成数据倾斜问题,且节点变化影响的节点数量占比较大,即影响的数据量较大。所以,该方式不适合数据节点较少的场景。
⭐️(3)虚拟槽分区算法
该算法首先虚拟出一个固定数量的 整数集合,该集合中的每个整数称为一个 slot槽。这个槽的数量一般是远远大于节点数量的。然后再将所有 slot 槽 平均映射到各个节点之上。例如, Redis 分布式系统中共虚拟了 16384 个 slot 槽,其范围为 [0, 16384]。假设共有 3 个节点,那么 slot 槽与节点间的映射关系如下图 所示:

而 数据 只与 slot 槽有关系, 与节点没有直接关系。 数据只通过其 key 的 hash(key) 映射到 slot 槽: slot = hash(key) % slotNums 。这也是该算法的一个优点,解耦了数据与节点,客户端无需维护节点,只需维护与 slot 槽的关系即可。
Redis 数据分区采用的就是该算法。 其计算槽点的公式为: slot = CRC16(key) % 16384 。CRC16() 是一种带有校验功能的 、具有良好分散功能的、 特殊的 hash 算法函数。
其实 Redis 中计算槽点的公式不是上面的那个,而是:
slot = CRC16(key) & 16383。
- 若要计算
a % b,如果b是2的整数次幂,那么a % b = a & (b - 1)。(位运算比数学运算快!!!)
6.2 系统搭建与运行
6.2.1 系统搭建
⭐️(1) 系统架构
下面要搭建的 Redis 分布式系统由 6 个节点构成,这 6 个节点的地址及角色分别如下表所示。一个 master 配备一个 slave ,不过 master 与 slave 的配对关系,在系统搭建成功后会自动分配。

⭐️(2) 删除持久化文件
先将之前“ Redis 主从集群 ”中在 Redis 安装目录下生成的 RDB 持久化文件 dump638*.conf 与 AOF 持久化文件 删除。因为 Redis 分布式系统要求创建在一个空的数据库之上。注意, AOF 持久化文件全部在 appendonlydir 目录中。
rm -rf dump638*.rdb appendonlydir638*.aof

⭐️(3) 创建目录
在Redis 安装目录中 mkdir 一个新的目录 cluster-dis ,用作分布式系统的工作目录。
mkdir cluster-dis
⭐️(4) 复制 2 个 配置文件
将 cluster 目录中的 redis.conf 与 redis6380.conf 文件复制到 cluster-dis 目录。
cd cluster-dis/
cp ../cluster/redis.conf ./
cp ../cluster/redis6380.conf ./

⭐️(5) 修改 redis.conf
对于redis.conf 配置文件,主要涉及到以下三个四个属性:
A、 dir

指定工作目录为前面创建的 cluster-dis 目录。持久化文件、节点配置文件将来都会在工作目录中自动生成。
命令模型下:
- 输入
:set nu显示行号- 输入
:set nonu不显示行号
B、 cluster-enabled

该属性用于开启 Redis 的集群模式。
C、 cluster-config-file

该属性用于指定集群节点的配置文件。该文件会在第一次节点启动时自动生成,其生成的路径是在 dir 属性指定的工作目录中。 在集群节点信息发生变化 后(如节点下线、故障转移等),节点会自动将集群状态信息保存到该配置文件中。
不过,该属性在这里仍保持注释状态。在后面的每个节点单独的配置文件中配置它。
D、 cluster-node-timeout

用于指定 “集群节点” 间通信的 超时时间阈值,单位毫秒。
⭐️(6) 修改 redis6380.conf
# 加上
cluster-config-file nodes-6380.conf

仅添加一个 cluster-config-file 属性即可。
⭐️(7) 复制 5 个 配置文件
使用 redis6380.conf 复制出 5 个配置文件 redis6381.conf 、 redis6382.conf 、 redis6383.conf 、redis6384.conf 、 redis6385.conf 。
cp redis6380.conf redis6381.conf
cp redis6380.conf redis6382.conf
cp redis6380.conf redis6383.conf
cp redis6380.conf redis6384.conf
cp redis6380.conf redis6385.conf

cluster-dis 中出现了 7 个配置文件。

⭐️(8) 修改 5 个配置文件
修改5 个配置文件 redis6381.conf 、 redis6382.conf 、 redis6383.conf 、 redis6384.conf 、redis6385.conf 的内容,将其中所有涉及 的 端口号 全部替换为当前文件名称中的端口号。例如,下面的是 redis6381.conf 的配置文件内容。
# 进入6381-6385 5个配置文件分别修改
vim redis6381.conf# 在命令模式下输入,将6380全部替换为6381
:%s/6380/6381 # 保存
:x

6.2.2 系统启动与关闭
⭐️(1) 启动节点
启动所有 Redis 节点。
redis-server redis6380.conf
redis-server redis6381.conf
redis-server redis6382.conf
redis-server redis6383.conf
redis-server redis6384.conf
redis-server redis6385.conf


此时查看 cluster-dis 目录,可以看到生成了 6 个 nodes 的配置文件。

⭐️(2) 创建系统
6个节点启动后,它们仍是 6 个独立的 Redis ,通过 redis-cli --cluster create 命令可将 6个节点创建了一个分布式系统。
# ip 换成自己的
redis-cli --cluster create --cluster-replicas 1 192.168.216.128:6380 192.168.216.128:6381 192.168.216.128:6382 192.168.216.128:6383 192.168.216.128:6384 192.168.216.128:6385

&enspi;该命令用于将指定的 6 个节点连接为一个分布式系统。 --cluster replicas 1 指定每个 master 会带有一个 slave 作为副本。
回车后会立即看到如下日志:

输入 yes 后回车,系统就会将以上显示的动态配置信息真正的应用到节点上,然后就可可看到如下日志:

⭐️(3) 测试系统
redis-cli -c -p 6380 cluster nodes

通过 cluster nodes 命令可以查看到系统中各节点的关系及连接情况。只要能看到每个节点给出 connected ,就说明分布式系统已经成功搭建。不过,对于客户端连接命令 redis-cli 需要注意两点:
redis-cli带有-c参数,表示这是要连接一个“集群”,而非是一个节点。- 端口号可以使用 6 个中的任意一个。
⭐️(4) 关闭系统
对于分布式系统的关闭,只需将各个节点 shutdown 即可 。
redis-cli -p 6380 shutdown

分布式系统启停脚本:
- 由于集群启动要一下启动好几个,所以可以写一个脚本
start-redis-cluster.sh进行启动:
#!/bin/bash
rm -rf dump638*.rdb
rm -rf nodes-638*.confredis-server redis6380.conf
redis-server redis6381.conf
redis-server redis6382.conf
redis-server redis6383.conf
redis-server redis6384.conf
redis-server redis6385.confredis-cli --cluster create --cluster-replicas 1 192.168.216.128:6380 192.168.216.128:6381 192.168.216.128:6382 192.168.216.128:6383 192.168.216.128:6384 192.168.216.128:6385

# 再将 start-redis-cluster.sh 设置为可执行文件
chmod 755 start-redis-cluster.sh

- 关闭脚本
#!/bin/bash
redis-cli -p 6380 shutdown
redis-cli -p 6381 shutdown
redis-cli -p 6382 shutdown
redis-cli -p 6383 shutdown
redis-cli -p 6384 shutdown
redis-cli -p 6385 shutdownps aux | grep redis

# 再将 start-redis-cluster.sh 设置为可执行文件
chmod 755 shutdown-redis-cluster.sh

脚本写好后运行脚本进行分布式系统启停
# 开启
./start-redis-cluster.sh# 查看是否启动成功
redis-cli -c -p 6381 cluster nodes# 关闭
./shutdown-redis-cluster.sh
注意:生产环境下,是在真实的主机上,这些脚本是用不上的!
6.3 集群操作
6.3.1 连接集群
无论要怎样操作分布式系统,都需要首先连接上。
redis-cli -c -p 6380

与之前单机连接相比的唯一区别就是增加了参数 -c 。
6.3.2 写入数据
⭐️(1) key 单个写入
无论 value 类型为 String 还是 List 、 Set 等集合类型,只要写入时操作的是一个 key ,那么在分布式系统中就没有问题。例如,

⭐️(2) key 批量操作
对一次写入多个 key 的操作,由于多个 key 会计算出多个 slot ,多个 slot 可能会对应多个节点。而由于一次只能写入一个节点,所以该操作会报错。

不过,系统也提供了一种对批量 key 的操作方案,为这些 key 指定一个统一的 group 让这个 group 作为计算 slot 的唯一值。

6.3.3 集群查询
⭐️(1) 查询 key 的 slot
通过 cluster keyslot 可以查询指定 key 的 slot 。例如,下面是查询 emp 的 slot 。
cluster keyslot emp

⭐️(2) 查询 slot 中 key 的数量
通过 cluster countkeysinslot 命令可以查看到指定 slot 所包含的 key 的个数。
cluster countkeysinslot 13178

⭐️(3) 查询 slot 中的 key
通过 cluster getkeysinslot 命令可以查看当前主机指定 slot 所包含的 key 。
cluster getkeysinslot 13178 3

6.3.4 故障转移
分布式系统中的某个 master 如果出现宕机,那么其相应的 slave 就会自动晋升为 master 。 如果原 master 又重新启动了,那么原 master 会自动变为新 master 的 slave 。
⭐️(1) 模拟故障
通过 cluster nodes 命令可以查看系统的整体架构及连接情况。

当然,也可以通过 info replication 查看当前客户端连接的节点的角色。可以看到, 6382 节点是 master ,其 slave 为 6384 节点 。

为了模拟 6382 宕机,直接将其 shutdown 。

通过客户端连接上 6384 节点后可以查看到,其已经自动晋升为了 master 。
redis-cli -c -p 6384

重启 6382 节点后查看其角色,发现其 自动成为 了 6384 节点的 slave 。

- 之所以
6382能被发现,找到原来那个master,是因为原来就在这个分布式系统里面,所有的配置都有;- 如果再加一个新的节点,就不会那么简单了!
⭐️(2) 全覆盖需求
如果某 slot 范围对应节点的 master 与 slave 全部宕机,那么整个分布式系统是否还可以对外提供读服务,就取决于属性 cluster-require-full-coverage 的设置。

该属性有两种取值:
yes:默认值。要求所有slot节点必须全覆盖的情况下系统才能运行。no:slot节点不全的情况下系统也可以提供查询服务。
6.3.5 集群扩容
下面要在 正在运行的 分布式系统中添加 两个新的节点:端口号为 6386 的节点为 master 节点,其下会有一个端口号为 6387 的 slave 节点。
⭐️(1) 复制并修改 2 个配置文件
使用 redis6380.conf 复制出 2 个配置文件 redis6386.conf 与 redis6387.conf ,并修改其中的各处端口号为相应端口号,为集群扩容做前期准备。
⭐️(2) 启动系统 与 2 个节点
由于要演示的是在分布式系统运行期间的动态扩容,所以这里先启动分布式系统。
要添加的两个节点是两个 Redis ,所以需要先将它们启动。只不过,在没有添加到分布式系统之前,它们两个是孤立节点,每个节点与其它任何节点都没有关系。
redis-server redis6386.conf
redis-server redis6387.conf
⭐️(3) 添加 master 节点
redis-cli -c --cluster add-node 192.168.216.128:6386 192.168.216.128:6380
通过命令 redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort} 可以将新的节点添加到系统中。 其中 {newHost}:{newPort} 是新添加节点的地址,{existHost}:{existPort} 是原系统中的任意节点地址。
添加成功后可看到如下日志。
redis-cli -c --cluster add-node 192.168.216.128:6386 192.168.216.128:6380

添加成功后,通过 redis-cli -c -p 6386 cluster nodes 命令可以看到其它 master 节点都分配有 slot ,只有新添加的 master 还没有相应的 slot 。当然,通过该命令也可以看到该新节点的动态 ID 。
redis-cli -c -p 6386 cluster nodes

⭐️(4) 分配 slot
为新的 master 分配的 slot 来自于其它节点,总 slot 数量并不会改变。所以 slot 分配过程本质是一个 slot 的移动过程。
通过 redis-cli -c --cluster reshard {existIP}:{existPort} 命令可开启 slot 分配流程。其中地址 {existIP}:{existPort} 为分布式系统中的任意节点地址。
redis-cli -c --cluster reshard 192.168.216.128:6380
该流程中会首先查询出当前节点的 slot 分配情况。

然后开始 Q&A 交互。一共询问了四个问题 ,这里有三个
- 准备移动多少
slot - 准备 由谁 来接收移动的
slot - 选择要移动
slot的源节点。有两种方案。- 如果选择键入
all,则所有已存在slot的节点都将作为slot源节点,即该方案将进行一次slot全局大分配。 - 也可以选择其它部分节点作为
slot源节点 。此时将源节点的动态 ID 复制到这里,每个 ID 键入完毕后回车,然后再复制下一个slot源节点动态 ID ,直至最后一个键入完毕回车后再键入done。
- 如果选择键入
这里键入的是 all ,进行全局大分配。

其首先会检测指定的 slot 源节点的数据,然后制定出 reshard 的方案。

这里会再进行一次 Q&A 交互,询问是否想继续处理 推荐的方案。键入 yes ,然后开始真正的全局分配,直至完成。

此时再通过 redis-cli -c -p 6386 cluster nodes 命令查看节点信息,可以看到 6386 节点中已经分配了 slot ,只不过分配的 slot 编号 并不连续。 master 节点新增完成。

⭐️(5) 添加 slave 节点
现要将 6387 节点添加为 6386 节点的 slave 。 当然,首先要确保 6387 节点的 Redis 是启动状态。
通过 redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort} --cluster-slave --cluster-master-id masterID 命令可将新添加的节点直接添加为指定 master 的 slave 。
redis-cli --cluster add-node 192.168.216.128:6387 192.168.216.128:6380 --cluster-slave --cluster-master-id 5bdccf9f756957e268c7e7d73c3dcec1d3c941be

回车后可看到如下的日志 ,说明添加成功。

此时再通过 redis-cli -c -p 6386 cluster nodes 命令可以看到其已经添加成功,且为指定 master 的 slave 。

6.3.6 集群收缩
下面要将 slave 节点 6387 与 master 节点 6386 从分布式系统中删除。
⭐️(1) 删除 slave 节点
对于 slave 节点,可以直接通过 redis-cli --cluster del-node <delHost>:<delPort> delNodeID 命令删除。
此时再查看集群,发现已经没有了 6387 节点。
⭐️(2) 移出 master 的 slot
在删除一个 master 之前,必须要保证该 master 上没有分配有 slot 。否则无法删除。所以,在删除一个 master 之前,需要先将其上分配的 slot 移出。
以上交互指定的是将 6386 节点中的 1999 个 slot 移动到 6380 节点。
注意:
- 要删除的节点所包含的 slot 数量在前面检测结果中都是可以看到的,例如, 6386 中的并不是 2000 个,而是 1999 个
- What is the receiving node ID? 仅能指定一个接收节点回车后继续。
此时再查看发现, 6386 节点中已经没有 slot 了。
⭐️(3) 删除 master 节点
此时就可以删除 6386 节点了。
此时再查看集群,发现已经没有了 6386节点。
6.4 分布式系统的限制
Redis 的分布式系统存在一些使用限制:
- 仅支持
0 号数据库 - 批量
key操作支持有限 - 分区仅限于
key - 事务支持有限
- 不支持分级管理
七、Redis 缓存
八、Lua脚本详解
九、分布式锁
🚀🚀🚀 Redis 快速食用:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
相关文章:
六、Redis 分布式系统
六、Redis 分布式系统 六、Redis 分布式系统6.1 数据分区算法6.1.1 顺序分区6.1.2 哈希分区 6.2 系统搭建与运行6.2.1 系统搭建6.2.2 系统启动与关闭 6.3 集群操作6.3.1 连接集群6.3.2 写入数据6.3.3 集群查询6.3.4 故障转移6.3.5 集群扩容6.3.6 集群收缩 6.4 分布式系统的限制…...
Unity相机跟随角色移动
相机跟随角色移动 使用LateUpdate();方法,根据角色移动而进行跟随,固定角度,类似2.5D视角。 需要将相机放到一个空对象,将角度调节好,挂载组件,将角色对象放入组件中,调整moveTime设…...
Lua的垃圾回收机制详解
Lua 是一种轻量级的编程语言,广泛用于嵌入到其他应用程序中,尤其是在游戏开发领域。Lua 的内存管理机制采用了自动垃圾收集(Garbage Collection)的方法。以下是Lua内存管理的一些关键方面: 垃圾收集原理概述 Lua 使用…...
java设计模式学习之【解释器模式】
文章目录 引言解释器模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用表达式解析示例代码地址 引言 在我们的日常生活中,语言的翻译和理解是沟通的关键。每种语言都有自己的语法规则,而翻译人员和计算机程序需要理解并遵循这些规则来…...
Unity中Shader旋转矩阵(四维旋转矩阵)
文章目录 前言一、围绕X轴旋转1、可以使用上篇文章中,同样的方法推导得出围绕X轴旋转的点阵。2、求M~rotate~ 二、围绕Y轴旋转1、可以使用上篇文章中,同样的方法推导得出围绕Y轴旋转的点阵。2、求M~rotate~ 三、围绕Z轴旋转1、可以使用上篇文章中&#x…...
【大数据】Centos 7安装教程
一、下载VMware 大家可以通过浏览器进入官网下载VMware,下载后打开VMware进行安装。 二、下载镜像的方式 1、进入Centos官网下载 2、进入阿里云、华为云镜像站下载 以阿里云为例,这里有很多,比如ubuntu、centos,点进去就可以选…...
2024 年 11 款最佳 Android 数据恢复软件应用
Android 设备上的数据丢失可能是一种令人痛苦的经历,通常会导致不可替代的信息瞬间消失。 意外删除、系统崩溃或格式错误都可能发生,重要数据的丢失可能会扰乱日常工作并影响您的工作效率。 幸运的是,技术进步带来了多种恢复解决方案&…...
Redis 核心知识总结
Redis 核心知识总结 认识 Redis 什么是 Redis? Redis 是一个由 C 语言开发并且基于内存的键值型数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。 有以下几个特…...
Android Jetpack之用Room+ViewModel+LiveData实现增删改查数据(createFromAsset())
文章目录 一、Room简介二、用RoomViewModelLiveData增删改查数据三、下载源码 一、Room简介 Room是Google推出的数据库框架,是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 Room包含三个主要组件: 数据库类&…...
MySQL ORDER BY(排序) 语句-读取的数据进行排序
MySQL ORDER BY(排序) 语句 我们知道从 MySQL 表中使用 SELECT 语句来读取数据。 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。 MySQL ORDER BY(排序) 语句可以…...
【ES】es介绍
倒排索引(Inverted Index)和正排索引(Forward Index) 正排索引是一种以文档为单位的索引结构,它将文档中的每个单词或词组与其所在的文档进行映射关系的建立。正排索引通常用于快速检索指定文档的内容,可以…...
07.kubernetes客户端部署
kubernetes 客户端部署 主要是配置 kubectl 完成以下两个操作: 首先是要实现通过命令行连接到Kubernetes的apiserver然后就是创建必要的 ClusterRoleBinding 实现 kubelet bootstrapping CSR 的自动验签kubelet bootstrapping主要涉及以下两个问题,官方文档已经给出详细的介…...
laravel5.8中实现验证码组件的安装和验证
本篇文章主要讲解使用laravel5.8自带的验证码库实现验证码验证的效果教程。通过本教程你可以快速接入到自己的项目中开发相应的验证功能。 作者:任聪聪 (rccblogs.com) 日期:2023年12月17日 实际效果 安装步骤 步骤一、输入命令 composer require mews…...
使用VScode通过内网穿透在公网环境下远程连接进行开发
文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…...
常用的 linux 命令
常用的 linux 命令 1.从其他机器拷贝文件夹2.查看哪个程序在用特定端口3.实时监控日志文件内容4.查看指定用户拥有的进程5.查看磁盘空间使用情况6.文件搜索which(whereis) 显示系统命令所在目录find 查找任何文件或目录1) 根据文件名称查找2)…...
[论文阅读笔记28] 对比学习在多目标跟踪中的应用
这次做一篇2D多目标跟踪中使用对比学习的一些方法. 对比学习通过以最大化正负样本特征距离, 最小化正样本特征距离的方式来实现半监督或无监督训练. 这可以给训练MOT的外观特征网络提供一些启示. 使用对比学习做MOT的鼻祖应该是QDTrack, 本篇博客对QDTrack及其后续工作做一个总…...
Ubuntu 下播放语音提示
目录 一、安装语音库 二、生成音频文件 三、语音播放代码 一、安装语音库 sudo apt update apt-get install libasound2-dev二、生成音频文件 # 文字生成 MP3网地:https://www.text-to-speech.cn/# MP3 转 WAV网址:https://www.aconvert.com/cn/aud…...
ubuntu 用户管理
ubuntu 用户管理 用户组管理用户管理VNC 远程桌面参考 用户组管理 # 查看所有组信息 cat /etc/group # 查看当前用户所在组 groups # 添加用户组 sudo groupadd uav# 添加ostest用户到 uav 用户组 需要注销并重新登录 sudo gpasswd -a ostest uav sudo usermod -aG uav ostes…...
轻舟已过万重山,鸿蒙4.0程序员危机
现在是2023年末。自从华为推出的鸿蒙系统到现在已经有4年多。之前的鸿蒙系统只是基于Android套壳,因为这也也被无数人瞧不起,自从华为秋季发布会后,宣布鸿蒙4.0问世。不再兼容Android,华为做独立的系统终于打了翻身仗。 鸿蒙系统…...
【Pytorch】学习记录分享6——PyTorch经典网络 ResNet与手写体识别
【Pytorch】学习记录分享5——PyTorch经典网络 ResNet 1. ResNet (残差网络)基础知识2. 感受野3. 手写体数字识别3. 0 数据集(训练与测试集)3. 1 数据加载3. 2 函数实现:3. 3 训练及其测试: 1. ResNet &…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
【Redis】Redis从入门到实战:全面指南
Redis从入门到实战:全面指南 一、Redis简介 Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,它可以用作数据库、缓存和消息代理。由Salvatore Sanfilippo于2009年开发,因其高性能、丰富的数据结构和广泛的语言支持而广受欢迎。 Redis核心特点:…...
