Redis Cluster (Redis 集群),使用Redis自带的集群功能搭建无主模式集群

文章目录

    • 一、概述
    • 二、模拟配置说明
    • 三、脚本方式创建 Redis Cluster
      • 3.1 配置创建脚本
      • 3.2 启动集群实例
      • 3.3 创建集群
      • 3.4 测试集群
      • 3.5 停止集群实例
      • 3.6 删除(清空)集群
    • 四、手动创建集群 Redis Cluster
      • 4.1 启动集群实例
      • 4.2 手动创建集群
      • 4.4 测试集群
    • 五、集群管理
      • 5.1 移动槽位
      • 5.2 查看集群基本信息
      • 5.3 查看集群详细信息

如果您对Redis的了解不够深入请关注本栏目,本栏目包括Redis安装,Redis配置文件说明,Redis命令和数据类型说明,Redis持久化配置,Redis主从复制和哨兵机制。

一、概述

  • Redis 是一个开源的内存数据库,支持分布式部署。Redis Cluster (Redis 集群)是 Redis 的分布式解决方案,用于提供高可用性和可扩展性。Redis Cluster 通过分片(Sharding)和数据复制(Replication)来实现数据的分布和冗余,以提供高性能和容错能力。
  • 集群的原理是数据分治,即将数据分散到多个节点以实现分布式存储和处理。然而,这种数据分散的方式可能在某些情况下导致聚合操作(例如事务)变得更加复杂。
  • 在Redis应用中,要增强可用性可以使用主备模式和主从模式(请看Redis主从模式配置)。 这是一种全量的主从复制机制,从是主的一个镜像。但是这种方式并不能解决随着业务增加,导数据量增加的问题(因为他们是镜像,不能扩展容量),要解决容量问题那就么需要集群
  • Redis Cluster 是把业务数据通过逻辑规则分散到不同的主从节点,解决了单个主从节点的单点故障问题(相当于对主节点做了高可用配置)。他一方面提高了扩展性,别一方面也提高了可用性(因为数据不在同一个主从节点,那么一般就不会出现所有数据同时失效的问题)。
  • 如果没有Redis集群,我们手动实现数据分治的逻辑一般如下:
    1. 根据业务场景进行分割。如按功能分割:用户、订单、产品等分配到不同Redis主从节点。
    2. 如果按业务拆分后还不能满足要求,还可以按优先级、逻辑再拆分(如每10000个ID一个Redis主从节点)。
  • 而默认的 Redis Cluster 使用了Hash Ring(哈希环)的概念来分片和管理数据。哈希环是一种数据结构,将数据节点(Redis 实例)映射到一个环形空间上。在 Redis Cluster 中,每个节点被分配一个槽位(slot),共有 16384 个槽位。数据根据键的哈希值被映射到对应的槽位上。假设有三个主从Redis 做了集群,槽位分布如下:
    在这里插入图片描述
  • Redis Cluster 使用一种称为 Hash Slot Sharding 的分片策略。每个节点负责管理一部分槽位和对应槽位上的数据。当客户端发送命令到 Redis Cluster 时,首先根据命令中的键计算哈希值,并根据哈希值确定对应的槽位。然后,客户端将命令发送到负责该槽位的节点上,完成数据操作(所以他是一种无主模式集群,即没有那个主从节点是主节点,而是根据槽位计算)。这样,数据被均匀地分布在整个集群中的各个节点上。
  • 哈希环的使用使得 Redis Cluster 具备了分布式的能力,同时保证了高可用性和可扩展性。当节点加入或离开集群时,Redis Cluster 会自动进行槽位的重新分配,以保持数据的平衡和一致性。这种分片方式使得 Redis Cluster 能够水平扩展,支持处理大规模的数据和负载。

二、模拟配置说明

  • 下面我们使用三个主从Redis构成一个Redis Cluster(官方说一个Redis Cluster至少需要三个主从Redis,Redis主从模式配置请看这里)。默认创建的Redis Cluster的端口是30001、30002、30003、30004、30005、30006,如下示意图(集群实际端口与你们不一定能对上,但是思路是这样的):
    在这里插入图片描述

三、脚本方式创建 Redis Cluster

  • 首先我们使用Redis官方自带的脚本创建 Redis Cluster 看看效果。使用Redis官方脚本有个好处是方便,因为他会自动做我们创建三个主从R edis,然后根据三个主从Redis再创建集群。

3.1 配置创建脚本

  • 在Redis源码的 utils/create-cluster/ 目录下有一个 create-cluster 脚本,打开这个脚本修改一下配置(不修改的话,有些是创建9个Redis实例,且主机地址是127.0.0.1。不如果你嫌麻烦也可以不修改,创建后按默认的配置访问即可,我这里了演示方便修改一下)。有关Redis源码编译安装请看这里。
cd utils/create-cluster/
vi create-cluster
  • 修改 create-cluster 脚本的主要内容如下:
# 测试节点总数
NODES=6
# 从机数,这里相当于三主三从(master=total/slave+1)
REPLICAS=1# 如果不是本机测试,则如下配置十分重要(具体可参考本栏目Redis配置文件说明)
# 配置集群主机信息,192.168.8.60 根据需要改您主机的IP。
CLUSTER_HOST=192.168.8.60
# 是否开启保护模式
PROTECTED_MODE=no

3.2 启动集群实例

  • 在 utils/create-cluster/ 目录下使用 create-cluster 脚本加 start 参数启动集群实例。
./create-cluster start

[root@yiqifu-redis create-cluster]# ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

  • 因为要搭建一个Redis集群至少需要3个主节点。一般3主3从,所以最少需要6个节点。这里脚本直接帮我们创建了6个实例。

3.3 创建集群

  • 在 utils/create-cluster/ 目录下使用 create-cluster 脚本加 create 参数将Redis实例创建为集群。
./create-cluster create

[root@yiqifu-redis create-cluster]# ./create-cluster create
>>> Performing hash slots allocation on 6 nodes…
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:30005 to 127.0.0.1:30001
Adding replica 127.0.0.1:30006 to 127.0.0.1:30002
Adding replica 127.0.0.1:30004 to 127.0.0.1:30003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: cf12868ca9b7049ba7b73757aed83cf56e3e6b09 127.0.0.1:30001
slots:[0-5460] (5461 slots) master
M: f8521587351d126ee6618fee70bdc994c598fab0 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
M: 764d51f5a7a986f424cb218794a3fcbe493913b1 127.0.0.1:30003
slots:[10923-16383] (5461 slots) master
S: 46233ddb3462efcbf37b2d1e7229f9a54e36d9e8 127.0.0.1:30004
replicates f8521587351d126ee6618fee70bdc994c598fab0
S: 31d9d8aa6927509ec33b7534a3ddeb3e921ce171 127.0.0.1:30005
replicates 764d51f5a7a986f424cb218794a3fcbe493913b1
S: 89415c9c43b4515441f49ac285d2e0e1a80b4525 127.0.0.1:30006
replicates cf12868ca9b7049ba7b73757aed83cf56e3e6b09

Can I set the above configuration? (type ‘yes’ to accept): yes

>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

Performing Cluster Check (using node 127.0.0.1:30001)
M: cf12868ca9b7049ba7b73757aed83cf56e3e6b09 127.0.0.1:30001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 31d9d8aa6927509ec33b7534a3ddeb3e921ce171 127.0.0.1:30005
slots: (0 slots) slave
replicates 764d51f5a7a986f424cb218794a3fcbe493913b1
M: 764d51f5a7a986f424cb218794a3fcbe493913b1 127.0.0.1:30003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: f8521587351d126ee6618fee70bdc994c598fab0 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 46233ddb3462efcbf37b2d1e7229f9a54e36d9e8 127.0.0.1:30004
slots: (0 slots) slave
replicates f8521587351d126ee6618fee70bdc994c598fab0
S: 89415c9c43b4515441f49ac285d2e0e1a80b4525 127.0.0.1:30006
slots: (0 slots) slave
replicates cf12868ca9b7049ba7b73757aed83cf56e3e6b09
[OK] All nodes agree about slots configuration.
>>> Check for open slots…
>>> Check slots coverage…
[OK] All 16384 slots covered.

3.4 测试集群

  • 使用 redis-cli 连接集群测试。由于Redis Cluster 是无主模式集群,我们创建的集群是三个主从。所以在连接时随便使用任何一个主的端口都可以(如:redis-cli -c -p 30001 、 redis-cli -c -p 30002 、 redis-cli -c -p 30003)。在使用时集群会根据键(key)的哈希(hash)计算槽位,然后定位到相应的主从上存取数据。如下测试示例
# -c 表示以集群的方式连接
# -p 指定端口
redis-cli -c -p 30001

[root@yiqifu-redis create-cluster]# redis-cli -c -p 30001
127.0.0.1:30001> set aaa 111
-> Redirected to slot [10439] located at 127.0.0.1:30002
OK
127.0.0.1:30002> set bbb 222
-> Redirected to slot [5287] located at 127.0.0.1:30001
OK
127.0.0.1:30001> set ccc 333
OK
127.0.0.1:30001> set {g1}aaa 111
-> Redirected to slot [13519] located at 127.0.0.1:30003
OK
127.0.0.1:30003> set {g1}bbb 222
OK
127.0.0.1:30003> set {g1}ccc 333
OK
127.0.0.1:30003> set {g1}ddd 444
OK
127.0.0.1:30003> set {g1}eee 555
OK

127.0.0.1:30003> multi
OK
127.0.0.1:30003> set {g1}bbb 222222
QUEUED
127.0.0.1:30003> set {g1}ccc 333333
QUEUED
127.0.0.1:30003> exec

1) OK
2) OK

127.0.0.1:30003>

  • 在使用时还可以使用“{组名}键”将不同的键(Key)分成一组放在同一个Redis主从中。在同一个Redis主从中就可以使用事务、监控等功能。如:这里使用"{g1}"作命名空间隔离,也就将带“{g1}”的key分到同一个redis中,这样才能方便在同一Redis中开启事务等操作。
  • 通过上面测试可以发现,Redis Cluster 无主模式集群,他会根据您输入的key的值计算存储在那个主从Redis中,并会自动跳转到相应的主从Redis节点上。

3.5 停止集群实例

  • 在 utils/create-cluster/ 目录下使用 create-cluster 脚本加 stop 参数将Redis Cluster 停止。
./create-cluster stop

[root@yiqifu-redis create-cluster]# ./create-cluster stop
Stopping 30001
Stopping 30002
Stopping 30003
Stopping 30004
Stopping 30005
Stopping 30006

3.6 删除(清空)集群

  • 在 utils/create-cluster/ 目录下使用 create-cluster 脚本加 clean 参数将Redis Cluster 所有配置清除(回到原来状态)。
./create-cluster clean

四、手动创建集群 Redis Cluster

  • 在实际生产环境中,Redis 主从实服务都是手动配置,Redis Cluster 也需要手动创建。下面演示手动创建Redis Cluster。

4.1 启动集群实例

  • 这里测试时我还是使用了脚本先启动了6个实例(启动实例只是启动Redis服务,并未创建集群),在生产环境中这些Redis实例是您自己在不同的服务器上配置的。
  • 我这里6台Redis实例的IP和端口分别如下:127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006。留意这个信息,后面有创建集群有用。
./create-cluster start

[root@yiqifu-redis create-cluster]# ./create-cluster start
Starting 30001
Starting 30002
Starting 30003
Starting 30004
Starting 30005
Starting 30006

  • 如果是自己配置 redis.conf 文件,我后通过 redis-server redis.conf 来启动实例,那么以下配置要正确修改才能创建集群。

    # port 6391cluster-enabled yes# 配置集群配置文件为 nodes.conf
    # nodes.conf 无需手动创建,集群启动时会自动创建。
    cluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
    

4.2 手动创建集群

  • 根据现有Redis服务实例(这些实例是您分布在不同主机的Redis服务),使用命令手动创建集群。

    redis-cli --cluster  create  127.0.0.1:30001  127.0.0.1:30002  127.0.0.1:30003  127.0.0.1:30004  127.0.0.1:30005  127.0.0.1:30006 --cluster-replicas 1
    
  • 参数说明

    • –cluster create 参数表示创建集群
    • –cluster-replicas 1 指定了每个主从Redis下,从节点的个数。由此可以推算出Redis集群中主从个数=节点总数 / (每个主从模式下从节点个数 + 1) = 6 / (1+1) = 3 个主从Redis。

4.4 测试集群

  • 同脚本创建方式,请自己测试
# -c 表示以集群的方式连接
redis-cli -c -p 30001

五、集群管理

5.1 移动槽位

  • 为什么要移动槽位?我想到以下几中情况:

    • 假设您添加了一个新的Redis主从,则您需要把原集群的某些槽位均分到这个新的Redis主从上。
    • 假设您集群中某个Redis主从坏了,则您需要把这个坏掉的槽位均分到集群中其他Redis主从上。
    • 假设您某个Redis主从的硬件配置较低,别一个Redis主从的硬件配置较高,则您可以把硬件配置较低槽位分配一些到这个硬件配置较高的Redis主从上。
  • 在 Redis 中,槽(Slots)是用于分片数据的概念。Redis Cluster使用槽位来将数据分布到多个节点,以实现水平扩展和提高系统的可伸缩性和可用性。每个 Redis Cluster 包含16384个槽,这些槽可以用于分配数据。

  • 在创建集群的时候有这样一些信息,他说明了每个主从节点所分配的槽位信息。这里如Master[0]的槽位信息是 0 ~ 5460。和每个主从节点的ID和所属关系。如下,留意这些信息,后面会用到。

Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383

M: fc253a3c9f2c301f7c5f6e72b47a338237b3447d 127.0.0.1:30001
slots:[0-5460] (5461 slots) master
M: ab3db8a2ed5fc4066c3257344618d02059e88648 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
M: 5d4d3f51cf968ca13718e378b5ffd68452d70479 127.0.0.1:30003
slots:[10923-16383] (5461 slots) master
S: a82a0b7c77addee864259f02a6c38f47745c5da0 127.0.0.1:30004
replicates 5d4d3f51cf968ca13718e378b5ffd68452d70479
S: b2944e78407304948150003bc395de9165354010 127.0.0.1:30005
replicates fc253a3c9f2c301f7c5f6e72b47a338237b3447d
S: 934fc2185bd12ff361fd40ae1b26bd0355bdf6e3 127.0.0.1:30006
replicates ab3db8a2ed5fc4066c3257344618d02059e88648

  • 移动槽位命令语法:redis-cli --cluster reshard 集群任何一个主节点

    • –cluster reshard 参数表示移动槽位
  • 如下,我们将主机( 127.0.0.1:30001) 的2000个槽位移动到主机( 127.0.0.1:30002) 的过程。

    过程要查看集群中主从的ID,如果前没有记录,可以先看5.3节看命令。

# 进入集群移动槽位命令(在我的配置环境下,以下任何一条命令都可以)
redis-cli --cluster reshard 127.0.0.1:30001
# redis-cli --cluster reshard 127.0.0.1:30002
# redis-cli --cluster reshard 127.0.0.1:30003
  • 执行上面命令后会提示“How many slots do you want to move (from 1 to 16384)?”
    • 意思是“你想移动多少个槽位(取值范围是1~16384)?”,但通过日志可以看到实际是(0 - 5460),比如我填:2000。
  • 然后会提示“What is the receiving node ID?”
    • 意思是“集群中那个主从节点接受这个2000个槽位信息?”,通过日志可以看到主机( 127.0.0.1:30002)的ID,比如我移动到第二个节点填:ab3db8a2ed5fc4066c3257344618d02059e88648
  • 然后提示“ Source node #1:”
    • 意思是“从那个节点移出这2000个槽位”,通过日志可以看到主机( 127.0.0.1:30001)的ID,比如我选择第一个节点,填:fc253a3c9f2c301f7c5f6e72b47a338237b3447d
  • 然后提示“ Source node #2:” 时输入“done”。然后一路都填 yes 完成

5.2 查看集群基本信息

  • 基本语法:redis-cli --cluster info 集群任何一个主节点
redis-cli --cluster info 127.0.0.1:30001

[root@yiqifu-redis create-cluster]# redis-cli --cluster info 127.0.0.1:30001
127.0.0.1:30001 (fc253a3c…) -> 0 keys | 3461 slots | 1 slaves.
127.0.0.1:30003 (5d4d3f51…) -> 0 keys | 7461 slots | 1 slaves.
127.0.0.1:30002 (ab3db8a2…) -> 0 keys | 5462 slots | 1 slaves.

  • 这里可以看到集群基本信息和槽位总数。

5.3 查看集群详细信息

  • 基本语法:redis-cli --cluster check 集群任何一个主节点
redis-cli --cluster check 127.0.0.1:30001

[root@yiqifu-redis create-cluster]# redis-cli --cluster check 127.0.0.1:30001
127.0.0.1:30001 (fc253a3c…) -> 0 keys | 3461 slots | 1 slaves.
127.0.0.1:30003 (5d4d3f51…) -> 0 keys | 7461 slots | 1 slaves.
127.0.0.1:30002 (ab3db8a2…) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: fc253a3c9f2c301f7c5f6e72b47a338237b3447d 127.0.0.1:30001
slots:[2000-5460] (3461 slots) master
1 additional replica(s)
M: 5d4d3f51cf968ca13718e378b5ffd68452d70479 127.0.0.1:30003
slots:[0-1999],[10923-16383] (7461 slots) master
1 additional replica(s)
S: 934fc2185bd12ff361fd40ae1b26bd0355bdf6e3 127.0.0.1:30006
slots: (0 slots) slave
replicates ab3db8a2ed5fc4066c3257344618d02059e88648
M: ab3db8a2ed5fc4066c3257344618d02059e88648 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: a82a0b7c77addee864259f02a6c38f47745c5da0 127.0.0.1:30004
slots: (0 slots) slave
replicates 5d4d3f51cf968ca13718e378b5ffd68452d70479
S: b2944e78407304948150003bc395de9165354010 127.0.0.1:30005
slots: (0 slots) slave
replicates fc253a3c9f2c301f7c5f6e72b47a338237b3447d
[OK] All nodes agree about slots configuration.
>>> Check for open slots…
>>> Check slots coverage…
[OK] All 16384 slots covered.

  • 这里可以看到集群详细信息。每个主从槽位的具体范围,如:slots:[0-1999],[10923-16383] (7461 slots) master

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

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

相关文章

C/C++药房管理 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C药房管理 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C药房管理 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 随着信息技术的蓬勃发展,医疗信息化已经成为…

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…

【C++】详解map和set基本接口及使用

文章目录 一、关联式容器与键值对1.1关联式容器(之前学的都是序列容器)1.2键值对pairmake_pair函数(map在插入的时候会很方便) 1.3树形结构的关联式容器 二、set2.1set的基本介绍2.1默认构造、迭代器区间构造、拷贝构造&#xff0…

ROS常用命令及多机(TX2 与虚拟机)通信步骤

目录 ROS常用命令 创建工作空间 编译工作空间 创建功能包 编译功能包 检查环境变量 查看ROS节点关系图 rviz使用 Ubuntu常用命令 ROS多机通信步骤 配置网络 设置网络名称 修改bash 互ping虚拟机与tx2 tx2中启动master 虚拟机中添加镜像源 TX2中添加镜像源 ROS常…

mybatisplus多数据源

适用于多种场景:纯粹多库、 读写分离、 一主多从、 混合模式等 场景说明: 我们创建两个库,分别为:mybatis_plus(以前的库不动)与mybatis_plus_1(新建),将mybatis_plus库…

前端移动web详细解析四

移动 Web 第四天 01-vw适配方案 vw和vh基本使用 vw和vh是相对单位,相对视口尺寸计算结果 vw:viewport width(1vw 1/100视口宽度 ) vh:lviewport height ( 1vh 1/100视口高度 ) vw布局 vw单位的尺寸 px 单位数…

Ubuntu 搭建 DHCP ivp6 server 步骤

Ubuntu 搭建 DHCP ivp6 server 步骤 安装 DHCP server安装 radvd(实现局域网路由功能)测试运行 安装 DHCP server apt 安装 isc-dhcp-server sudo apt-get install isc-dhcp-server修改配置文件 /etc/dhcp/dhcpd6.conf 内容如下: lease-time 7200; lo…

excel求差公式怎么使用?

利用excel求差,可能有许多的小伙伴已经会了,不过还是存在一些不太熟悉的朋友们,所以这里有必要讲解一下。其实求差的实现主要就是一个公式,就是用一个单元格中的数字“减去”另一个单元格中的数字“等于”第三个单元格。此公式掌握…

玻色量子成功研制光量子计算专用光纤恒温控制设备——“量晷”

​近日,北京玻色量子科技有限公司(以下简称“玻色量子”)成功研制出一款高精度量子计算专用光纤恒温控制设备——“量晷”,该设备能将光纤的温度变化稳定在千分之一摄氏度量级,即能够做到0.001C的温度稳定维持&#xf…

[SpringCloud] Feign 与 Gateway 简介

目录 一、Feign 简介 1、RestTemplate 远程调用中存在的问题 2、定义和使用 Feign 客户端 3、Feign 自定义配置 4、Feign 性能优化 5、Feign 最佳实践 6、Feign 使用问题汇总 二、Gateway 网关简介 1、搭建网关服务 2、路由断言工厂 3、路由的过滤器配置 4、全局过…

【PID专题】控制算法PID之比例控制(P)的原理和示例代码

PID是“比例-积分-微分”的缩写,是一种广泛用于控制系统的反馈控制算法。PID控制器根据测量值与期望值之间的误差来调整控制器的输出,以使系统稳定并尽可能接近期望值。下面是PID中P(比例控制)的基本介绍: 比例&#x…

springweb flux拦截请求获取参数和方法做接口签名防重放校验

在给spring webflux做接口签名、防重放的时候,往往需要获取请求参数,请求方法等,而spring webflux无法像spring mvc那样好获取,这里根据之前的实践特地说明一下: 总体思路: 1、利用过滤器,从原…

关于CSS的几种字体悬浮的设置方法

关于CSS的几种字体悬浮的设置方法 1. 鼠标放上动态的2. 静态的&#xff08;位置看上悬浮&#xff09;2.1 参考QQ邮箱2.2 参考知乎 1. 鼠标放上动态的 效果如下&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><met…

<多线程章节八> 单例模式中的饿汉模式与懒汉模式的讲解,以及懒汉模式中容易引起的Bug

&#x1f490;专栏导读 本篇文章收录于多线程&#xff0c;也欢迎翻阅博主的其他文章&#xff0c;可能也会让你有不一样的收获&#x1f604; &#x1f337;JavaSE &#x1f342;多线程 &#x1f33e;数据结构 文章目录 &#x1f490;专栏导读&#x1f4a1;饿汉模式&#x1f4a1;…

从 Seq2Seq 到 Attention:彻底改变序列建模

探究Attention机制和意力的起源。 简介 在这篇博文[1]中&#xff0c;将讨论注意力机制的起源&#xff0c;然后介绍第一篇将注意力用于神经机器翻译的论文。由于上下文压缩、短期记忆限制和偏差&#xff0c;具有 2 个 RNN 的 Seq2Seq 模型失败了。该模型的 BLEU 分数随着序列长度…

【VPX630】青翼 基于KU115 FPGA+C6678 DSP的6U VPX通用超宽带实时信号处理平台

板卡概述 VPX630是一款基于6U VPX总线架构的高速信号处理平台&#xff0c;该平台采用一片Xilinx的Kintex UltraScale系列FPGA&#xff08;XCKU115&#xff09;作为主处理器&#xff0c;完成复杂的数据采集、回放以及实时信号处理算法。采用一片带有ARM内核的高性能嵌入式处理器…

【深度学习】pytorch——快速入门

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ pytorch快速入门 简介张量&#xff08;Tensor&#xff09;操作创建张量向量拷贝张量维度张量加法函数名后面带下划线 _ 的函数索引和切片Tensor和Numpy的数组之间的转换张量&#xff08;tensor&#xff09;与标量…

三十九、CANdelaStudio实践-19服务(ReadDTCInformation)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的19服务(ReadDTCInformation)编辑,欢迎…

基于STM32C8T6的智能蓝牙小车控制设计

**单片机设计介绍&#xff0c;1655基于STM32C8T6的智能蓝牙小车控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计五、 程序文档 六、 结论七、 文章目录 一 概要 基于STM32C8T6的智能蓝牙小车控制设计是基于STM32微控制器和蓝牙模块开发的一种小型智能车辆控制系统…

力扣刷题-队列-滑动窗口最大值

239. 滑动窗口最大值 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶&#xff1a; 在线性时间复杂度内解决此题&#xff1f; …