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

N32G45XVL-STB之移植LVGL(8.4.0)

目录

概述

1 系统软硬件

1.1 软件版本信息

1.2 ST7796-LCD

1.3 MCU IO与LCD PIN对应关系

2 认识LVGL

2.1 LVGL官网

2.2 下载V8.4.0

3 移植LVGL

3.1 硬件驱动实现

3.2 添加LVGL库文件

3.3 移植和硬件相关的代码

3.3.1 驱动接口相关文件介绍

3.3.2 重新接口函数

3.4 配置.h文件

3.5 Keil中配置源代码路径

4 文件架构编译配置

4.1 项目文件架构

4.2 编译配置

5 测试

5.1 测试代码实现

5.2 测试案例


测试视频:

N32G45XVL-STB之移植LVGL(8.4.0)

概述

本文主要介绍在N32G45XVL-STB移植lvgl-8.4.0的详细步骤,包括加载文件的方法,Keil中加载文件目录和路径,修改和LCD驱动层相关的接口,keil中配置编译参数,笔者使用LVGL提供的vgl-8.4.0\demos\stress案例,验证移植的代码是否可以正常运行。

1 系统软硬件

1.1 软件版本信息

软硬件信息版本信息
MCU类型N32G457VEL7
KeilMDK ARM 5.38
调试工具:DAPCMSIS-DAP

1.2 ST7796-LCD

LCD的PIN引脚功能介绍

序号模块引脚引脚说明
1VCC屏电源正
2GND屏电源地
3LCD_CS液晶屏片选控制信号,低电平有效
4LCD_RST液晶屏复位控制信号,低电平复位
5LCD_RS液晶屏命令/数据选择控制信号

高电平:数据,低电平:命令

6SDI(MOSI)SPI总线写数据信号(SD卡和液晶屏共用)
7SCKSPI总线时钟信号(SD卡和液晶屏共用)
8LED液晶屏背光控制信号(如需要控制,请接引脚,如不需要控制,可以不接)
9SDO(MISO)SPI总线读数据信号(SD卡和液晶屏共用)
10CTP_SCL电容触摸屏IIC总线时钟信号(无触摸屏的模块不需连接)
11CTP_RST电容触摸屏复位控制信号,低电平复位(无触摸屏的模块不需连接)
12CTP_SDA电容触摸屏IIC总线数据信号(无触摸屏的模块不需连接)
13CTP_INT电容触摸屏IIC总线触摸中断信号,产生触摸时,输入低电平到主控(无触摸屏的模块不需连接)
14SD_CSSD卡片选控制信号,低电平有效(不使用SD卡功能,可不接)

实体LCD Port对应关系如下图所示

1.3 MCU IO与LCD PIN对应关系

N32G457VEL7 PIN引脚LCD PIN引脚
PA.07MOSI
PA.06MISO
PA.05SCK
PD.04CS
PD.05RST
PD.06RS

2 认识LVGL

2.1 LVGL官网

LVGL是最流行的免费和开源嵌入式图形库,可为任何MCU, MPU和显示类型创建漂亮的UI。基于这个特点,其可以在一般的MCU上都能运行的,本文选取芯片N32G457VEL7作为主控MCU,实现该UI库的移植。

官方网址:LVGL — Light and Versatile Embedded Graphics Library

https://lvgl.io/

登录网址后,可以看见如下页面,目前最新版本已经升级到 LVGL v8.4 and v9.1 are released!:

2.2 下载V8.4.0

软件下载链接如下:

https://github.com/lvgl/lvgl/releases/tag/v8.4.0

 下载完成代码后,解压代码,其文件结构如下:

文件夹examples:  应用实例代码,目录

文件夹src:    lvgl的源代码目录

头文件 lvgl.h: lvgl源代码引用文件

头文件lv_conf_template.h:  lvgl编译项目配置文件

3 移植LVGL

3.1 硬件驱动实现

在移植LVGL库之前,必须保证LCD驱动已经触摸屏的相关驱动程序已经实现,其实现案例,参考笔者文章:

N32G45XVL-STB之SPI接口驱动LCD-CSDN博客

N32G45XVL-STB之移植FT6336触摸屏芯片驱动-CSDN博客

3.2 添加LVGL库文件

1)lvgl-8.4.0\src\core

添加该目录下的所有.c文件到工程目录中,该目录下的文件包括:

2) lvgl-8.4.0\src\draw

该目录下的文件包括两部分,文件夹中的和绘图相关,文件一级目录的通用.c文件

2.1) 添加一级目录下的文件

添加如下文件到项目中

2.2)二级目录下的文件

这两个文件夹下的.c文件必须加载到项目中

 3)lvgl-8.4.0\src\extra

添加如下一级目录和二级目录下所有的.c文件至项目

4) lvgl-8.4.0\src\font

添加如下所有.c文件至项目

 5)lvgl-8.4.0\src\hal

添加如下所有.c文件至项目

6)lvgl-8.4.0\src\misc 

添加如下所有.c文件至项目

7)lvgl-8.4.0\src\widgets 

添加如下所有.c文件至项目

3.3 移植和硬件相关的代码

3.3.1 驱动接口相关文件介绍

\lvgl-8.4.0\examples\porting目录有3个.c文件

1)LCD显示相关接口函数库: lv_port_disp_template.c    

2)   触摸屏/按键相关函数库:   lv_port_indev_template.c

3)文件操作行管函数库:        lv_port_fs_template.c

 3.3.2 重新接口函数

1)重写lv_port_disp_template.c  

将 lv_port_disp_template.c  添加到项目,重写干文件中的代码,具体如下:

/*** @file lv_port_disp_templ.c**//* Includes ------------------------------------------------------------------*/
#include "lv_port_disp_template.h"
#include "lvgl.h"
#include "lcd_drv.h"/* Private includes ----------------------------------------------------------*/
#define MY_DISP_HOR_RES             LCD_H
#define MY_DISP_VER_RES             LCD_W /* Private function prototypes -----------------------------------------------*/
static void disp_init(void);
static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);/* Private user code ---------------------------------------------------------*/
static void lcd_draw_fast_rgb_color(int16_t sx, int16_t sy,int16_t ex, int16_t ey, uint16_t *color)
{LCD_drawfast_RGB_color(sx, sy, ex, ey, color);
}static void disp_init(void)
{/*You code here*/LCD_Init();//LCD_direction(2);LCD_direction(1);LCD_Clear(WHITE);
}void lv_port_disp_init(void)
{static lv_disp_drv_t disp_drv; static lv_disp_draw_buf_t draw_buf_dsc_1;static lv_color_t buf_1[MY_DISP_VER_RES * 8]; disp_init();lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_VER_RES * 8);lv_disp_drv_init(&disp_drv);disp_drv.hor_res = lcddev.width;disp_drv.ver_res = lcddev.height;disp_drv.flush_cb = disp_flush;disp_drv.draw_buf = &draw_buf_dsc_1;lv_disp_drv_register(&disp_drv);
}static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{lcd_draw_fast_rgb_color(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p);lv_disp_flush_ready(disp_drv);
}/* END of this file */

2)重写lv_port_indev_template.c  

将 lv_port_indev_template.c  添加到项目,重写干文件中的代码,具体如下:

/*** @file lv_port_indev_templ.c**//*Copy this file as "lv_port_indev.c" and set this value to "1" to enable content*//**********************      INCLUDES*********************/
#include "lv_port_indev_template.h"
#include "lvgl.h"
#include "usr_touch.h"/* 触摸屏 */
static void touchpad_init(void);
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
static bool touchpad_is_pressed(void);
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y);lv_indev_t * indev_touchpad;      // 触摸屏
stru_pos st_Pos;/*** @brief       初始化并注册输入设备* @param       无* @retval      无*/
void lv_port_indev_init(void)
{static lv_indev_drv_t indev_drv;/*------------------* 触摸屏* -----------------*//* 初始化触摸屏(如果有) */touchpad_init();/* 注册触摸屏输入设备 */lv_indev_drv_init(&indev_drv);indev_drv.type = LV_INDEV_TYPE_POINTER;indev_drv.read_cb = touchpad_read;indev_touchpad = lv_indev_drv_register(&indev_drv);
}/***********************   STATIC FUNCTIONS**********************//*------------------* 触摸屏* -----------------*//*** @brief       初始化触摸屏* @param       无* @retval      无*/
static void touchpad_init(void)
{usr_touchInit();
}/*** @brief       图形库的触摸屏读取回调函数* @param       indev_drv   : 触摸屏设备*   @arg       data        : 输入设备数据结构体* @retval      无*/
static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
{static lv_coord_t last_x = 0;static lv_coord_t last_y = 0;/* 保存按下的坐标和状态 */if(touchpad_is_pressed()){touchpad_get_xy(&last_x, &last_y);data->state = LV_INDEV_STATE_PR;} else{data->state = LV_INDEV_STATE_REL;}/* 设置最后按下的坐标 */data->point.x = last_x;data->point.y = last_y;
}/*** @brief       获取触摸屏设备的状态* @param       无* @retval      返回触摸屏设备是否被按下*/
static bool touchpad_is_pressed(void)
{usr_ScanTouchProcess( &st_Pos );if( st_Pos.status_bit.tpDown ){st_Pos.status_bit.tpDown = 0;return true;}return false;
}/*** @brief       在触摸屏被按下的时候读取 x、y 坐标* @param       x   : x坐标的指针*   @arg       y   : y坐标的指针* @retval      无*/
static void touchpad_get_xy(lv_coord_t * x, lv_coord_t * y)
{/*Your code comes here*/(*x) = st_Pos.xpox[0];(*y) = st_Pos.ypox[0];
}/* End of this file */

3.4 配置.h文件

在lvgl-8.4.0根目录下有两个.h文件,其分别为:

头文件 lvgl.h: lvgl源代码引用文件

头文件lv_conf_template.h:  lvgl编译项目配置文件

 修改lv_conf_template.h    -----> lv_conf.h

 实际项目中的文件名称如下:

 3.5 Keil中配置源代码路径

在keil中将lvgl源代码的路径配置到项目中,方便编译。其具体配置如下:

4 文件架构编译配置

4.1 项目文件架构

项目中和lvgl库相关的文件架构如下:

4.2 编译配置

完成文件加载和路径配置后,需要使能lvgl的源代码,需要再lv_conf.h文件中作相关的修改,修改方法如下:

5 测试

5.1 测试代码实现

1)初始化LVGL

在使用UI接口实现绘图功能之前,必须初始化lvgl,初始化接口函数如下:

2)  刷新UI功能

完成代码加载到项目之后,还需要在main.c函数调用两个函数lv_tick_inc()和lv_task_handler(),用于刷新UI和响应按键。具体方法如下:

 5.2 测试案例

使用lvgl-8.4.0\demos\stress下的测试案例,进行LVGL功能测试

添加该文件到项目中:

运行结果如下:

 

相关文章:

N32G45XVL-STB之移植LVGL(8.4.0)

目录 概述 1 系统软硬件 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 认识LVGL 2.1 LVGL官网 2.2 下载V8.4.0 3 移植LVGL 3.1 硬件驱动实现 3.2 添加LVGL库文件 3.3 移植和硬件相关的代码 3.3.1 驱动接口相关文件介绍 3.3.2 重新接口函数 3…...

SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具

关于SwaggerSpy SwaggerSpy是一款针对SwaggerHub的自动化公开资源情报(OSINT)安全工具,该工具专为网络安全研究人员设计,旨在简化广大红队研究人员从SwaggerHub上收集已归档API信息的过程,而这些OSINT信息可以为安全人…...

Python酷库之旅-比翼双飞情侣库(05)

目录 一、xlrd库的由来 二、xlrd库优缺点 1、优点 1-1、支持多种Excel文件格式 1-2、高效性 1-3、开源性 1-4、简单易用 1-5、良好的兼容性 2、缺点 2-1、对.xlsx格式支持有限 2-2、功能相对单一 2-3、更新和维护频率低 2-4、依赖外部资源 三、xlrd库的版本说明 …...

numpy数组transpose方法的基本原理

背景:记录一下numpy数组维度顺序操作 一、具体示例 transpose方法用于交换数组的轴,改变数组的维度顺序。方法的参数是一个代表新轴顺序的元组。 假设你有一个三维数组,其形状是 (a, b, c),即有 a 个块,每个块中有 b…...

Docker Swarm集群部署管理

Docker Swarm集群管理 文章目录 Docker Swarm集群管理资源列表基础环境一、安装Docker二、部署Docker Swarm集群2.1、创建Docker Swarm集群2.2、添加Worker节点到Swarm集群2.3、查看Swarm集群中Node节点的详细状态信息 三、Docker Swarm管理3.1、案例概述3.2、Docker Swarm中的…...

碎片化知识如何被系统性地吸收?

一、方法论 碎片化知识指的是通过各种渠道快速获取的零散信息和知识点,这些信息由于其不完整性和孤立性,不易于记忆和应用。为了系统性地吸收碎片化知识,可以采用以下策略: 1. **构建知识框架**: - 在开始吸收之前&am…...

安鸾学院靶场——安全基础

文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包,可以拿到包含flag的txt文件。…...

ChatGPT:自然语言处理的新纪元与OpenAI的深度融合

随着人工智能技术的蓬勃发展,自然语言处理(NLP)领域取得了显著的进步。OpenAI作为这一领域的领军者,以其卓越的技术实力和创新能力,不断推动着NLP领域向前发展。其中ChatGPT作为OpenAI的重要成果更是在全球范围内引起了…...

AI引领项目管理新时代:效率与智能并驾齐驱

在数字化浪潮的推动下,项目管理领域正迎来一场由AI技术引领的革新。从自动化任务执行到智能决策支持,AI技术的应用正让项目管理变得更加高效、精准和智能化。本文将探讨项目管理人员及其实施团队如何运用AI技术,以及这些技术如何助力项目管理…...

AUTOSAR汽车电子嵌入式编程精讲300篇-电池管理系统中 CAN 通信模块的设计与应用(中)

目录 2.3 BMS 中 CAN 通信模块软硬件设计 2.3.1 CAN 通信模块硬件电路设计 2.3.2 CAN 通信模块软件设计 2.3.2.1 CAN 底层程序设计 2.3.2.2 CAN 底层初始化 2.3.2.3 CAN 底层接收 3.3.1.3 CAN 底层发送 2.4 通信协议的实现 2.4.1 整车通信协议的实现 2.4.2 充电机通信协议的实现…...

k8s概述

文章目录 一、什么是Kubernetes1、官网链接2、概述3、特点4、功能 二、Kubernetes架构1、架构图2、核心组件2.1、控制平面组件(Control Plane Components)2.1.1、kube-apiserver2.1.2、etcd2.1.3、kube-scheduler2.1.4、kube-controller-manager 2.2、No…...

多线程的运用

在现代软件开发中,多线程编程是一个非常重要的技能。多线程编程不仅可以提高应用程序的性能,还可以提升用户体验,特别是在需要处理大量数据或执行复杂计算的情况下。本文将详细介绍Java中的多线程编程,包括其基本概念、实现方法、…...

TF-IDF(Term Frequency-Inverse Document Frequency)算法

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于文本挖掘和信息检索的统计方法,主要用于评估一个单词在一个文档或一组文档中的重要性。它结合了词频(TF)和逆文档频率(IDF)两个指…...

富格林:细心发现虚假确保安全

富格林指出,现货黄金市场内蕴藏着丰富的盈利机会,然而并非所有人都能够抓住这些机会。要想从市场中获取丰厚的利润并且保障交易的安全,必须要求我们掌握一些交易技巧利用此去发现虚假陷阱。当我们不断汲取技巧过后,才可利用此来发…...

6.2 文件的缓存位置

1. 文件的缓冲 1.1 缓冲说明 将文件内容写入到硬件设备时, 则需要进行系统调用, 这类I/O操作的耗时很长, 为了减少I/O操作的次数, 文件通常使用缓冲区. 当需要写入的字节数不足一个块时, 将数据放入缓冲区, 当数据凑够一个块的大小后才进行系统调用(即I/O操作).系统调用: 向…...

在Elasticsearch中,过滤器(Filter)是用于数据筛选的一种机制

在Elasticsearch中,过滤器(Filter)是用于数据筛选的一种机制,它通常用于结构化数据的精确匹配,如数字范围、日期范围、布尔值、前缀匹配等。过滤器不计算相关性评分,因此比查询(Query&#xff0…...

MySQL----主键、唯一、普通索引的创建与删除

创建索引 CREATE INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);CREATE INDEX: 用于创建普通索引的关键字。index_name: 指定要创建的索引的名称。索引名称在表中必须是唯一的。table_name: 指定要在哪个表上创建索引。(column1, column2, ……...

css预处理是什么?作用是什么?

CSS预处理器是一种增强和扩展标准CSS的工具。它们允许开发者使用变量、嵌套规则、Mixin(混合)以及函数等高级功能,以更模块化和可维护的方式编写CSS代码。预处理器如Sass(SCSS)、Less和Stylus等,通过引入这…...

镜像拉取失败:[ERROR] Failed to pull docker image

问题描述 执行 bash docker/scripts/dev_start.sh 命令提示错误: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/images/create?fromImageregistry.b…...

FM全网自动采集聚合影视搜索源码

源码介绍 FM 全网聚合影视搜索(响应式布局),基于 TP5.1 开发的聚合影视搜索程序,本程序无数据库,本程序内置P2P 版播放器,承诺无广告无捆绑。片源内部滚动广告与本站无关,谨防上当受骗,资源搜索全部来自于网络。 环境…...

【DevOps】什么是 pfSense?免费构建SDWAN

目录 一、详细介绍pfSense 1、 什么是 pfSense? 2、原理 3、 特点 4、 优点 5、 缺点 6、应用场景 7、 典型部署 二、pfSense实战:免费构建企业SD-WAN 1、拓扑图 2、准备工作 3、安装和基本配置pfSense 4、配置VPN 配置IPsec VPN 配置OpenV…...

elementui table超出两行显示...鼠标已入tip显示

elementui el-table超出两行显示…鼠标已入tip显示 方式一 <el-table-column label"描述"prop"note"class-name"myNoteBox"><template slot-scope"scope"><!-- tips悬浮提示 --><el-tooltip placement"to…...

空白服务器安装系统

一、准备工作 确定服务器的硬件配置&#xff0c;包括处理器、内存、硬盘等信息。选择合适的操作系统镜像文件&#xff0c;可以从官方网站或者第三方网站下载。 二、制作启动盘或镜像 如果服务器支持从光盘启动&#xff0c;可以使用光盘制作软件&#xff08;如UltraISO&#…...

【车载音视频电脑】嵌入式AI分析车载DVR,支持8路1080P

产品特点 采用H.265 & H.264编解码&#xff0c;节约存储空间、传输流量&#xff1b; 高分辨率&#xff1a;支持8路1080P*15FPS/4路1080P*30FPS、720P、D1等编解码&#xff1b; 支持1张SATA硬盘&#xff0c;取用方便&#xff0c;满足大容量存储要求&#xff1b; 支持1个…...

Java实现Mysql批量插入与更新

第一、批量插入语句 Insert({"<script>","INSERT INTO TABLE_NAME (" "ID," "IS_DELETE," "GMT_CREATE," "GMT_MODIFIED" ")VALUES","<foreach collection list item item separator …...

李沐团队发布Higgs-Llama-3-70B,角色扮演专用模型

前言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在各个领域都展现出强大的能力&#xff0c;尤其是其在对话、写作、代码生成等方面的应用越来越广泛。然而&#xff0c;想要让 LLM 真正地融入人类社会&#xff0c;扮演各种角色&#xff0c;还需要具备更强大的角…...

2024年护网行动全国各地面试题汇总(4)作者:————LJS

面试过程及回答 自我介绍这里就如实回答的工作经历&#xff0c;参与的项目&#xff0c;尽量简短的把你参与的项目和成果说出来就行 使用过哪些设备&#xff0c;出现误报怎么办 天眼、EDR、全流量告警、态势感知、APT、蜜罐设备先去查看设备的完整流量日志等信息确认是否为误报&…...

秋招突击——6/11——复习{(树形DP)树的最长路径、电话号码的字母组合}——新作{重复序列中前最小的数字}

文章目录 引言复习树形DP——树的最长路径电话号码的字母组合 新作重复序列中前最小的数字个人实现参考实现 总结 引言 这两天可能有点波动&#xff0c;但是算法题还是尽量保证复习和新作一块弄&#xff0c;数量上可能有所差别。 复习 树形DP——树的最长路径 这道题是没有…...

Lua与C交互API接口总结

Lua与C交互 1. 常见Lua相关的C API压入元素查询元素获取元素检查元素栈的相关数据操作 2. C调用Lua核心调用函数示例 3. Lua调用C1. C函数注册到Lua&#xff08;lua_register&#xff09;示例2. 批量注册&#xff08;luaL_Reg&#xff09;示例 1. 常见Lua相关的C API 压入元素…...

DT浏览器很好用

简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;操作起来非常流畅&#x1f60e;&#xff0c;几乎不会有卡顿的情况。 搜索功能也十分强大&#x1f44d;&#xff0c;能够快速精准地找到想要的信息。 而且还有出色的兼容性&#xff0c;各种网页都…...

格泰网站建设/南宁seo

官网地址 首页&#xff1a;https://about.gitlab.com/ 安装说明&#xff1a;https://about.gitlab.com/installation/ 安装命令摘录 sudo yum install -y curl policycoreutils-python openssh-server cronie sudo lokkit -s http -s ssh sudo yum install postfix sudo s…...

郑州百度推广公司电话/seo优化搜索结果

vscode实现远程开发 参考网址: https://mp.weixin.qq.com/s/xH72wuN17eVLqi2jmxRa8g https://mp.weixin.qq.com/s/d5hmyyr7WIakWc8i6-TJYg 安装插件 Remote - SSH 设置ssh免密登录 使用 ssh 免密登录远程服务器 , 具体设置可以自定百度 把本地 .ssh** 文件夹中的 id_rsa.pub…...

怎么在网站上做推广/建网站一般多少钱

基于Java SE&#xff08;标准版&#xff09;12的Java开发套件12的生产版本现已发布。 Oracle可以为Linux&#xff0c;Windows和MacOS提供JDK 12构建。 [ Java JDK 11中所有重要的新功能 。 • 15个Java框架&#xff0c;可极大地促进开发人员 。 | 通过InfoWorld的App Dev Repo…...

那个视频网站可以做桌面背景/腾讯域名注册官网

google 单元测试相关 http://code.google.com/p/googlemock/wiki/CookBook http://code.google.com/p/googletest/wiki/AdvancedGuide#Teaching_Google_Test_How_to_Print_Your_Values 进展&#xff1a; Delegating Calls to a Parent Class...

南宁建筑网站/移动网站优化排名

简单介绍mac安装kafka&#xff0c;非源码安装&#xff0c;而是使用homebrew进行安装 查看信息 brew info kafka安装 brew install kafka启动 kafka-server-start /usr/local/etc/kafka/server.properties & zookeeper-server-start /usr/local/etc/kafka/zookeeper.pro…...

自己怎么做网站卖东西/有免费做网站的吗

文章目录前言1.主从模式2.哨兵模式2.1 哨兵模式的作用2.2 哨兵实现原理2.3 主观下线和客观下线2.4 哨兵模式优缺点3.常见的Redis集群方案3.1 客户端分片客户端分片的优缺点&#xff1a;一致性哈希算法:实现方式&#xff1a;3.2 代理分片3.3 Codis3.4 Redis Cluster前言 在服务…...