Redis 如何使用 RedisCluster 构建高可用集群架构?

news2025/6/17 12:18:45

文章目录

  • Redis 如何使用 RedisCluster 构建高可用集群架构?
    • 什么是 Redis Cluster?
      • 哈希槽(hash slot)
      • 一致性保证(consistency guarantees)
    • 如何构建 Redis Cluster?
      • 配置环境
      • 构建 A,A1 节点
        • 安装 Redis
        • 配置 A,A1 节点
      • 构建 B,B1 节点
      • 构建 C,C1 节点
      • 构建 Cluster
      • 查看集群节点状态
      • 测试 Redis Cluster
      • 添加从节点
      • 查看集群节点状态
    • Redis Node 的重新分片(Reshard)
    • 哈希槽的自动均衡操作
    • 常用的集群的操作命令
      • 检查节点的健康状态
      • 添加一个节点
      • 删除一个节点
    • Redis Cluster 的优点

Redis 如何使用 RedisCluster 构建高可用集群架构?

在 Redis 如何使用 Twemproxy 和 Sentinel 构建高可用集群架构? 篇中介绍了构建 Redis 集群的一种平替方案,但是 Twemproxy + Sentinel 方案有着其自身的缺点,其中最主要的是在节点的伸缩时,数据集的自动平衡是个比较棘手的问题。这篇文章介绍 Redis 官方提供的构建集群方案。通过本篇可以知道 Redis Cluster 如何构建、Redis 节点伸缩的操作方式。

什么是 Redis Cluster?

Redis Cluster 提供 Redis 的水平扩展的能力,采用去中心化的架构,集群中的每个节点保存独立的数据以及整个集群的相关状态。由于每个节点都和集群中的其他节点进行交互,客户端只要链接其中一个节点,就能感知整个集群节点。

哈希槽(hash slot)

Redis Cluster 对于节点数据的分片并没有采用传统的一致性哈希算法,而是采用了一种不同的分片方式,叫做哈希槽。具体就是在 Redis Cluster 中有 16384 个哈希槽,对一个给定的 key 进行操作时,会对该 key 应用 CRC16 算法然后与 16384 进行取模运算,进而判断该 key 位于哪个哈希槽上。

使用哈希槽设计有诸多好处:

  • 每个节点负责哈希槽的一部分子集。
  • 容易增加或者删除集群中的节点。
  • 在节点之间移动哈希槽不需要停止任何操作。
  • 通过 hash tag,Redis Cluster 能够支持所谓的 multiple key 的操作(多个操作在同一个命令或事务或Lua 脚本中)

一致性保证(consistency guarantees)

Redis Cluster 不保证强一致性的事务,由于 Cluster 的基础是异步复制,所以会有一个时间的窗口导致数据丢失。

如何构建 Redis Cluster?

以下图的拓扑结构为例,构建 Redis Cluster 集群。

在这里插入图片描述

配置环境

以下配置,仅仅表示我的配置环境,读者可以根据自己的环境进行配置。

注意:需要把主机的防火墙关闭或者把 6379,6380,16379,16380 端口对外放开。

  • 三台 Linux 主机(CentOS 7 版本),ip 分别为:10.211.55.6, 10.211.55.7, 10.211.55.8。
  • 在每台主机上安装 Redis(5.0.9 版本),需要通过源码进行安装。
  • 选择 10.211.55.6 主机作为节点 A,A1(A 为主节点,A1 为 A 的从节点)。
  • 选择 10.211.55.7 主机作为节点 B,B1(B 为主节点,B1 为 B 的从节点)。
  • 选择 10.211.55.8 主机作为节点 C,C1(C 为主节点,C1 为 C 的从节点)。

构建 A,A1 节点

安装 Redis

这里使用源码进行构建。

# 登陆 10.211.55.6 主机,安装 Redis
cd /opt
wget http://download.redis.io/releases/redis-5.0.9.tar.gz
tar -xvf redis-5.0.9.tar.gz
cd redis-5.0.9
make && make install

配置 A,A1 节点

使用如下命令进行构建。

# 配置 A 节点
# 在 /usr/local/etc 目录下创建 redis-cluster/redis-6379 目录,用来存放集群所需的配置文件
mkdir -p /usr/local/etc/redis-cluster/redis-6379

# 创建 redis.conf 文件,写入如下内容,保存退出
vim /usr/local/etc/redis-cluster/redis-6379/redis.conf

port 6379
bind 0.0.0.0
protected-mode no

cluster-enabled yes
dir /usr/local/etc/redis-cluster/redis-6379
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

# 启动 A 节点
nohup redis-server /usr/local/etc/redis-cluster/redis-6379/redis.conf > /dev/null 2>&1 &


# 配置 A1 节点
# 在 /usr/local/etc 目录下创建 redis-cluster/redis-6380 目录,用来存放集群所需的配置文件
mkdir -p /usr/local/etc/redis-cluster/redis-6380

# 创建 redis.conf 文件,写入如下内容,保存退出
vim /usr/local/etc/redis-cluster/redis-6380/redis.conf

port 6380
bind 0.0.0.0
protected-mode no

cluster-enabled yes
dir /usr/local/etc/redis-cluster/redis-6380
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

# 启动 A1 节点
nohup redis-server /usr/local/etc/redis-cluster/redis-6380/redis.conf > /dev/null 2>&1 &

构建 B,B1 节点

构建的方式同 A,A1,只是主机为 10.211.55.7,具体步骤不再赘述。

构建 C,C1 节点

构建的方式同 A,A1,只是主机为 10.211.55.8,具体步骤不再赘述。

构建 Cluster

redis-cli --cluster create 10.211.55.6:6379 10.211.55.7:6379 10.211.55.8:6379 --cluster-replicas 0


# 执行上面的命令,会输出类似如下内容
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 10.211.55.6:6379
   slots:[0-5460] (5461 slots) master
M: a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 10.211.55.7:6379
   slots:[5461-10922] (5462 slots) master
M: 35c17301dac6d01cdd06b01c449c895e1d5f6028 10.211.55.8:6379
   slots:[10923-16383] (5461 slots) master
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 10.211.55.6:6379)
M: 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 10.211.55.6:6379
   slots:[0-5460] (5461 slots) master
M: 35c17301dac6d01cdd06b01c449c895e1d5f6028 10.211.55.8:6379
   slots:[10923-16383] (5461 slots) master
M: a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 10.211.55.7:6379
   slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

通过上面的输出,可以看到每个节点的哈希槽分配情况,分别是:

  • 10.211.55.6:6379 [0-5460]
  • 10.211.55.7:6379 [5461-10922]
  • 10.211.55.8:6379 [10923-16383]

查看集群节点状态

可以看到每个主节点的状态,包括 Node Id,地址以及端口,主/从节点标志,时间戳以及分配的哈希槽范围。

注意此处的 Node Id,这是自动生成的,在不同的服务器上面会有不同的值。

# 查看集群节点状态信息
redis-cli -p 6379 cluster nodes

# 输出
35c17301dac6d01cdd06b01c449c895e1d5f6028 10.211.55.8:6379@16379 master - 0 1681214336434 3 connected 10923-16383
a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 10.211.55.7:6379@16379 master - 0 1681214335403 2 connected 5461-10922
5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 10.211.55.6:6379@16379 myself,master - 0 1681214336000 1 connected 0-5460

测试 Redis Cluster

可以看到在进行操作时,会重定向到实际的哈希槽上面。

# 客户端登陆
redis-cli -c -p 6379

# 进行 set 操作,观看哈希槽的重新定向
127.0.0.1:6379> set foo bar
-> Redirected to slot [12182] located at 10.211.55.8:6379
OK
10.211.55.8:6379> set hello world
-> Redirected to slot [866] located at 10.211.55.6:6379
OK

添加从节点

在上面创建集群时,没有把从节点加进去,可以采用如下命令,给每个主节点添加一个从节点。

# 将 10.211.55.6:6380 添加为 10.211.55.6:6379 的从节点,注意后面 cluster-master-id 是集群节点 10.211.55.6:6379 的 Node Id
redis-cli --cluster add-node 10.211.55.6:6380 10.211.55.6:6379 --cluster-slave --cluster-master-id 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad

# 将 10.211.55.7:6380 添加为 10.211.55.7:6379 的从节点,注意后面 cluster-master-id 是集群节点 10.211.55.7:6379 的 Node Id
redis-cli --cluster add-node 10.211.55.7:6380 10.211.55.7:6379 --cluster-slave --cluster-master-id a1a7be53d2ebc9d54fb18c59f31171cf6d371f29

# 将 10.211.55.8:6380 添加为 10.211.55.8:6379 的从节点,注意后面 cluster-master-id 是集群节点 10.211.55.8:6379 的 Node Id
redis-cli --cluster add-node 10.211.55.8:6380 10.211.55.8:6379 --cluster-slave --cluster-master-id 35c17301dac6d01cdd06b01c449c895e1d5f6028

查看集群节点状态

通过如下的输出可以看到,每个主机上 6380 端口的 Redis 实例成为对应的 6379 端口的 Redis 实例的从节点。

redis-cli -p 6379 cluster nodes

# 输出
e667c40572bb7a34fae03ee407e0849728537497 10.211.55.8:6380@16380 slave 35c17301dac6d01cdd06b01c449c895e1d5f6028 0 1681215954316 3 connected
a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 10.211.55.7:6379@16379 master - 0 1681215953285 2 connected 5461-10922
35c17301dac6d01cdd06b01c449c895e1d5f6028 10.211.55.8:6379@16379 master - 0 1681215955346 3 connected 10923-16383
d070ed606c2067bca37f7a079971eed5d67b8841 10.211.55.6:6380@16380 slave 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 0 1681215954517 1 connected
32f44e3aab49194db8e5e819a1dc851a86a1b584 10.211.55.7:6380@16380 slave a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 0 1681215954000 2 connected
5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 10.211.55.6:6379@16379 myself,master - 0 1681215954000 1 connected 0-5460

Redis Node 的重新分片(Reshard)

Redis 可以通过重新分片(Reshard)来动态伸缩节点。需要注意的是,在给集群增加节点时,需要进行哈希槽的重新分配,以便能够达到新的平衡;在给集群移除节点时,需要对移除的节点执行哈希槽的移动,使其成为一个空的主节点,再调用相关命令将该节点移除。

可以通过如下指令进行哈希槽的重新分片。

redis-cli --cluster reshard [new node ip]:[new node port] --cluster-from [from node id] --cluster-to [to node id] --cluster-slots [number of slots] --cluster-yes

例如,将 10.211.55.6:6379 的哈希槽全部转移到 10.211.55.7:6379 节点上,可以执行如下命令:

redis-cli --cluster reshard 10.211.55.6:6379 --cluster-from 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad --cluster-to a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 --cluster-slots 5461 --cluster-yes


# 输出
...
Moving slot 5454 from 10.211.55.6:6379 to 10.211.55.7:6379:
Moving slot 5455 from 10.211.55.6:6379 to 10.211.55.7:6379:
Moving slot 5456 from 10.211.55.6:6379 to 10.211.55.7:6379:
Moving slot 5457 from 10.211.55.6:6379 to 10.211.55.7:6379:
Moving slot 5458 from 10.211.55.6:6379 to 10.211.55.7:6379:
Moving slot 5459 from 10.211.55.6:6379 to 10.211.55.7:6379:
Moving slot 5460 from 10.211.55.6:6379 to 10.211.55.7:6379:

# 观察现在 master 节点的哈希槽的分配情况
redis-cli -p 6379 cluster nodes

# 可以看到 10.211.55.6:6379 已经没有了哈希槽,而 10.211.55.7:6379 的哈希槽范围变成了 [0-10922]
e667c40572bb7a34fae03ee407e0849728537497 10.211.55.8:6380@16380 master - 0 1681222117588 11 connected 10923-16383
a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 10.211.55.7:6379@16379 master - 0 1681222117000 13 connected 0-10922
35c17301dac6d01cdd06b01c449c895e1d5f6028 10.211.55.8:6379@16379 slave e667c40572bb7a34fae03ee407e0849728537497 0 1681222117892 11 connected
d070ed606c2067bca37f7a079971eed5d67b8841 10.211.55.6:6380@16380 slave a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 0 1681222117000 13 connected
32f44e3aab49194db8e5e819a1dc851a86a1b584 10.211.55.7:6380@16380 slave a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 0 1681222116557 13 connected
5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 10.211.55.6:6379@16379 myself,master - 0 1681222116000 8 connected

哈希槽的自动均衡操作

# 执行 rebalance 命令
redis-cli --cluster rebalance --cluster-use-empty-masters 10.211.55.6:6379

# 输出
>>> Performing Cluster Check (using node 10.211.55.6:6379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Rebalancing across 3 nodes. Total weight = 3.00
Moving 5462 slots from 10.211.55.7:6379 to 10.211.55.6:6379
###########################################################
...
###########################################################

# 查看哈希槽节点分布情况
redis-cli -p 6379 cluster nodes

# 输出,可以看到 10.211.55.6:6379 的哈希槽范围现在是 [0-5461]
e667c40572bb7a34fae03ee407e0849728537497 10.211.55.8:6380@16380 master - 0 1681222393532 11 connected 10923-16383
a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 10.211.55.7:6379@16379 master - 0 1681222394571 13 connected 5462-10922
35c17301dac6d01cdd06b01c449c895e1d5f6028 10.211.55.8:6379@16379 slave e667c40572bb7a34fae03ee407e0849728537497 0 1681222394055 11 connected
d070ed606c2067bca37f7a079971eed5d67b8841 10.211.55.6:6380@16380 slave a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 0 1681222394256 13 connected
32f44e3aab49194db8e5e819a1dc851a86a1b584 10.211.55.7:6380@16380 slave 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 0 1681222393018 14 connected
5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 10.211.55.6:6379@16379 myself,master - 0 1681222393000 14 connected 0-5461

常用的集群的操作命令

检查节点的健康状态

# 执行 check 命令,可以观察集群节点的健康状态
redis-cli --cluster check 10.211.55.6:6379

# 输出
10.211.55.6:6379 (5a54e2bb...) -> 1 keys | 5462 slots | 1 slaves.
10.211.55.8:6380 (e667c405...) -> 1 keys | 5461 slots | 1 slaves.
10.211.55.7:6379 (a1a7be53...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 2 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.211.55.6:6379)
M: 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad 10.211.55.6:6379
   slots:[0-5461] (5462 slots) master
   1 additional replica(s)
M: e667c40572bb7a34fae03ee407e0849728537497 10.211.55.8:6380
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: a1a7be53d2ebc9d54fb18c59f31171cf6d371f29 10.211.55.7:6379
   slots:[5462-10922] (5461 slots) master
   1 additional replica(s)
S: 35c17301dac6d01cdd06b01c449c895e1d5f6028 10.211.55.8:6379
   slots: (0 slots) slave
   replicates e667c40572bb7a34fae03ee407e0849728537497
S: d070ed606c2067bca37f7a079971eed5d67b8841 10.211.55.6:6380
   slots: (0 slots) slave
   replicates a1a7be53d2ebc9d54fb18c59f31171cf6d371f29
S: 32f44e3aab49194db8e5e819a1dc851a86a1b584 10.211.55.7:6380
   slots: (0 slots) slave
   replicates 5a54e2bb5a897956d2d1a08893be62c5fb0ed5ad
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

添加一个节点

这里只提供相关命令,读者可以自行进行操作。

# 添加主节点
redis-cli --cluster add-node [new node ip]:[new node port] [one of master node ip]:[master node port]

# 添加从节点
redis-cli --cluster add-node [new node ip]:[new node port] [one of master node ip]:[master node port] --cluster-slave --cluster-master-id [masster-node-id]

# 重新分配哈希槽
# 可以执行自动分配
redis-cli --cluster rebalance --cluster-use-empty-masters [one of master node ip]:[master node port]

# 可以从指定的节点移动部分的哈希槽到新添加的节点
redis-cli --cluster reshard [one of master node ip]:[master node port] --cluster-from [from node id] --cluster-to [to node id] --cluster-slots [number of slots] --cluster-yes

删除一个节点

删除一个节点,首先需要把改节点的哈希槽移除。

# 移除改节点的哈希槽
redis-cli --cluster reshard [one of master node ip]:[master node port] --cluster-from [from node id] --cluster-to [to node id] --cluster-slots [the number of slots] --cluster-yes

# 删除该节点
redis-cli --cluster del-node [one of master node ip]:[master node port] [node-id]

Redis Cluster 的优点

  • 配置简单,官方提供完整的操作手册。
  • 系统的伸缩变得容易,解决大量数据的问题,数据的再平衡容易实现。
  • 每个主节点可配置从节点,可以做到每个主节点的失效救援。

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

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

相关文章

int(1) 和 int(10)区别

有个表的要加个user_id字段,user_id字段可能很大, alter table xxx ADD user_id int(1)。 int(1)怕是不够用吧,接下来是一通解释。 我们知道在mysql中 int占4个字节,那么对于无符号的int,最大值是2^32-1 4294967295&a…

一文弄懂Python中的sort和sorted函数

1. 引言 Python中的 sort()和sorted()函数主要用于按升序或降序对数据进行排序。在本文中比较用于列表时,两个函数在编程和语法上的差异。 闲话少说,我们直接开始吧! 2. Sort()函数基本用法 用于列表排序的sort函数的语法如下&#xff1a…

java equals和==的区别

目录一、equals1.前言2.重写equals方法二、三、equals和的区别一、equals 1.前言 **当用equals来比较两个引用数据类型时默认比较的是它们的地址值,比如创建两个成员变量完全相同对象A和对象B两个进行比较,比较的是两个对象的地址值是否相等&#xff0c…

从spring boot泄露到接管云服务器平台

0x1前言 在打野的时候意外发现了一个站点存在spring boot信息泄露,之前就有看到一些文章可以直接rce啥的,今天刚好试试。通过敏感信息发现存在accesskey泄露,就想直接通过解密,获取敏感信息,接管云平台。 首先说下这个…

Linux服务器如何清除dns缓存

Linux服务器如何清除dns缓存 DNS缓存是一个临时数据库,用于存储已解释的DNS查询信息。换句话说,每当你访问网站时,你的操作系统和网络浏览器都会保留域名和相应IP地址的记录。 这消除对远程DNS服务器重复查询,并允许你的操作系统…

【实验报告】实验三、图像复原

1. 实验目的 (1) 理解退化模型。 (2) 掌握常用的图像复原方法。 2. 实验内容 (1) 模拟噪声的行为和影响的能力是图像复原的核心。 (2) 空域滤波 实验一 1. 1 产生至少 2 种不同类型的噪声,并绘制原图像、加噪后图像及对应直方图于 一个图形窗口中[subplot(m…

用GPT-4写代码不用翻墙了?Cursor告诉你:可以~~

目录 一、介绍 二、使用方法 三、其他实例 1.正则表达式 2.自动化测试脚本 3.聊聊技术 一、介绍 Cursor主要功能是根据用户的描述写代码或者进行对话,对话的范围仅限技术方面。优点是不用翻墙、不需要账号。Cursor基于GPT模型,具体什么版本不祥&#…

ChatGPT文本框再次升级,打造出新型操作系统

在ChatGPT到来之前,没有谁能够预见。但是,它最终还是来了,并引起了不小的轰动,甚至有可能颠覆整个行业。 从某种程度上说,ChatGPT可能是历史上增长最快的应用程序,仅在两个多月就拥有了1亿多活跃用户&…

2023年4月企业内部定制课程简章

2023年4月企业内部定制课程简章 》》数据治理内训 数据管理基础 数据处理伦理 数据治理 数据架构 数据建模和设计 数据安全 数据集成和互操作 文件和内容管理 参考数据和主数据 数据仓库和商务智能 元数据管理 数据质量 大数据和数据科学 数据管理成熟度评估 数据管理组织与…

js基础之Promise(全面+手写实现)

1. 是什么 Promise是一种异步编程的解决方案,用于处理异步操作并返回结果。 主要作用是解决回调函数嵌套(回调地狱)的问题,使异步操作更加清晰、易于理解和维护。 2. 怎么用 Promise有三种状态:pending(…

(大数据开发随笔8)Hadoop 3.3.x分布式环境部署——补充知识

索引克隆虚拟机SSH免密登录ssh简介免密登录scp命令时间同步克隆虚拟机 克隆:注意要分开放置三个虚拟机的位置 修改克隆机的ip地址 vi /etc/sysconfig/network-scripts/ifcfg-ens33——IPADDR重启网络 systemctl restart networkip addr 查看ip地址 修改克隆机的主…

【STM32学习】直接存储器访问——DMA

【STM32学习】直接存储器访问——DMA零、参考一、对DMA的理解二、DMA通道优先级三、DMA通道x传输数量寄存器(DMA_CNDTRx)四、DMA缓冲区设计零、参考 一个严谨的STM32串口DMA发送&接收(1.5Mbps波特率)机制 【组件】通用环形缓冲区模块 上述是我的参考…

ServletContext 对象

1.共享数据 ServletContext 对象 先调用对象,获取对象,往里面存数据 package com.kuang.servlet;import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.…

Pandas.read_excel详解

文章目录基础知识语法参数详解-index_col参数详解-header参数详解-usecols参数详解-dtype其他参数多表读取顺带提一句如何用pandas写数据到excel基础知识 pandas 可以读取多种的数据格式,针对excel来说,可以使用read_excel()读取数据,如下&a…

实现在SpringBoot项目中使用腾讯云发送短信

在一些项目中总会不可避免的要用到短信服务,比如发送验证码等,那么如何进行短信的发送呢,我们这就来捋一捋,我这里采用的是腾讯云的短信服务。其他的云服务也大致一样。 第一步、申请腾讯云的短信服务并配置基本信息 首先进入腾讯…

2023年Q1京东大家电销售数据分析(京东行业大盘销量查询)

2023年第一季度,大家电线上市场的涨势有点放缓,相较于去年的涨幅,今年有收敛不少。下面,我们以京东平台的数据作为线上市场表现的参考。 根据鲸参谋数据显示,今年Q1季度大家电在京东的累计销量超过1600万件&#xff0c…

FE_CSS 页面布局之盒子模型 边框 内外边距

1 盒子模型(Box Model)组成 所谓 盒子模型:就是把 HTML 页面中的布局元素看作是一个矩形的盒子,也就是一个盛装内容的容器。 CSS 盒子模型本质上是一个盒子,封装周围的 HTML 元素,它包括:边框、…

用户体验设计之记忆(Memory)

🔥人类记忆的基础 记忆是能够记住过去的经历,以及回忆和唤起它们去影响当下的能力 记忆是由encoding(把外界刺激进入大脑转换成可以记忆的格式)、storage(在大脑中开辟存储记忆的空间)、retrieval&#x…

C语言文件操作复习回顾(1)

关于流,内存数据读写铺垫的复习 打开一个文件 -> 内存里面就会创建一个对应关联的文件信息区 -> 文件信息区其实就是一个FILE类型的结构体 -> 各个结构体成员记录了该文件的种种信息 -> 结构体(文件信息区)由FILE* 结构体指针来维护 -> 有了指针&am…

Linux -- 基础IO

文章目录1. 基础认识2. 回顾C文件接口2.1 现象一2.2 现象二2.3 fprintf()函数回顾2.4 fnprintf()函数使用2.5 "a"模式3. 系统接口3.1 open()和close()3.2 write()3.3 read()3.4 C文件接口和系统接口关系3.5 文件描述符3.6 深度理解Linux下一切皆文件3.7 FILE是什么3.…