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

Kubernetes——part11 云原生中间件上云部署 Rocketmqkafkazookeeper

Rocketmq

rocketmq角色

RocketMQ由四部分构成:Producer、Consumer、Broker和NameServer

启动顺序:NameServer->Broker

为了消除单点故障,增加可靠性或增大吞吐量,可以在多台机器上部署多个nameserver和broker,并且为每个broker部署1个或多个slave

在这里插入图片描述

Topic & message queue:一个分布式消息队列中间件部署好以后,可以给很多个业务提供服务,同一个业务也有不同类型的消息要投递,这些不同类型的消息以不同的 Topic 名称来区分。所以发送和接收消息前,先创建topic,针对某个 Topic 发送和接收消息。有了 Topic 以后,还需要解决性能问题 。 如果一个Topic 要发送和接收的数据量非常大, 需要能支持增加并行处理的机器来提高处理速度,这时候一个 Topic 可以根据需求设置一个或多个 Message Queue, Message Queue 类似分区或 Partition 。Topic有了多个 Message Queue 后,消息可以并行地向各个Message Queue 发送,消费者也可以并行地从多个 Message Queue 读取消息并消费 。

rocketmq集群部署方式

  • 单Master模式

​ 只有一个 Master节点

​ 优点:配置简单,方便部署

​ 缺点:这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用,不建议线上环境使用

  • 多Master模式

​ 一个集群无 Slave,全是 Master,例如 2 个 Master 或者 3 个 Master

​ 优点:配置简单,单个Master 宕机或重启维护对应用无影响,在磁盘配置为RAID10 时,即使机器宕机不可恢复情况下,由与 RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢)。性能最高。

​ 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到受到影响

  • 多Master多Slave模式(异步复制)

​ 每个 Master 配置一个 Slave,有多对Master-Slave, HA,采用异步复制方式,主备有短暂消息延迟,毫秒级。

​ 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为Master 宕机后,消费者仍然可以从 Slave消费,此过程对应用透明。不需要人工干预。性能同多 Master 模式几乎一样。

​ 缺点: Master 宕机,磁盘损坏情况,会丢失少量消息。

  • 多Master多Slave模式(同步双写)

​ 每个 Master 配置一个 Slave,有多对Master-Slave, HA采用同步双写方式,主备都写成功,向应用返回成功。

​ 优点:数据与服务都无单点, Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高

​ 缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的 RT会略高。目前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能

rocketmq集群部署

rocketmq-operator都是不能很灵活的调整副本数,毕竟每个副本对应其唯一的配置的文件,不同的broker实例使用的配置文件都是不一样的,都存在差异,一旦副本变化了,就不能很好的和broker 的配置文件内容一 一对应起来。

接下来我们创建一个基于k8s部署单master以及多master部署rocketmq集群,并且只需要一个broker配置文件,多个broker实例会自动基于该broker配置文件模板,自动生成不同broker实例的broker配置文件,扩容或者伸缩rocketmq集群 nameserver或者broker副本数的时候不需要理会配置文件,仅仅是调整实例的副本即可。

备注:该方案不适合有slave节点的部署方式。

环境说明

  • 提供持久存储动态供给功能
[root@k8s-master01 ~]# kubectl get storageclass
NAME         PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client   fuseim.pri/ifs   Delete          Immediate           false                  8d
  • 提供metallb功能

按官网提供的方式修改即可,链接:https://metallb.universe.tf/

# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.5/config/manifests/metallb-native.yaml
# vim ippool.yaml
# cat ippool.yamlapiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: first-poolnamespace: metallb-system
spec:addresses:- 192.168.10.100-192.168.100.110
# kubectl create -f ippool.yaml
# vim l2.yaml
# cat l2.yamlapiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: examplenamespace: metallb-system
# kubectl create -f l2.yaml
  • 提供ingress nginx controller
# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.4.0/deploy/static/provider/cloud/deploy.yaml
部署前修改362行,把Local修改为Cluster# kubectl apply -f deploy.yaml
# kubectl get ns
NAME               STATUS   AGE
ingress-nginx      Active   8s
# kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-r9gqt        0/1     Completed   0          62s
ingress-nginx-admission-patch-r24d6         0/1     Completed   0          62s
ingress-nginx-controller-7844b9db77-mxrgn   1/1     Running     0          62s
# kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.96.21.124    192.168.10.100   80:31844/TCP,443:32294/TCP   49m
ingress-nginx-controller-admission   ClusterIP      10.109.18.235   <none>           443/TCP                      49m
  • 容器镜像仓库

没有本地容器镜像仓库,可以使用hub.dockcer.com。

构建rocketmq镜像

rocketmq-namesrv和 rocketmq-broker共用同一个镜像,仅仅是启动命令和启动参数不一样,后期可灵活的通过调整启动命令和启动参数来实现不同的效果(比如通过挂载configMap的方式自定义rocketmq的配置文件,而不需要重建rocketmq的镜像。

# vim Dockerfile
# cat DockerfileFROM   docker.io/library/openjdk:8u102-jdk AS JDKLABEL mail=admin@kubemsb.comRUN  rm -vf /etc/localtime \&& ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo "Asia/Shanghai" > /etc/timezone \&& export LANG=zh_CN.UTF-8RUN     curl -k https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip \-o /tmp/rocketmq-all-4.9.4-bin-release.zip    \&& unzip /tmp/rocketmq-all-4.9.4-bin-release.zip -d /tmp/ \&& mv /tmp/rocketmq-all-4.9.4-bin-release /opt/rocketmq \&& rm -rf /tmp/*RUN  sed -ir '/-Xmx/c JAVA_OPT=${JAVA_OPT}' /opt/rocketmq/bin/runserver.sh \&& sed -ir '/-Xmx/c JAVA_OPT=${JAVA_OPT}' /opt/rocketmq/bin/runbroker.sh##  运行 MQ 应用时候可以通过环境变量设置 jvm 数值,如:JAVA_OPT="-server -Xms2g -Xmx2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"ENV     ROCKETMQ_HOME=/opt/rocketmqWORKDIR $ROCKETMQ_HOME
# docker build -t docker.io/nextgomsb/rocketmq:v1 . --no-cache
# docker images
REPOSITORY                                TAG         IMAGE ID       CREATED          SIZE
nextgomsb/rocketmq                        v1          ed01df462eb3   31 seconds ago   677MB
# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: nextgomsb 替换为自己仓库的用户名
Password: 替换为自己仓库的用户名
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
# docker push docker.io/nextgomsb/rocketmq:v1

在这里插入图片描述

获取rocketmq-dashboard镜像

rocketmq-dashboard是一个可视化的rocketmq集群运维监控工具。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

rocketmq部署描述文件编写

rocketmq-namesrv部署描述文件
# vim rocketmq-namesrv.yaml
# cat rocketmq-namesrv.yaml---
apiVersion: v1
kind: Namespace
metadata:name: rocketmq---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: rocketmq-namesrvnamespace: rocketmq
spec:serviceName: rocketmq-namesrvreplicas: 2selector:matchLabels:app: rocketmq-namesrvtemplate:metadata:labels:app: rocketmq-namesrvspec:containers:- name: rocketmq-namesrv-containerimage: docker.io/nextgomsb/rocketmq:v1imagePullPolicy: IfNotPresentcommand:- bin/mqnamesrvenv:- name: JAVA_OPTvalue: -server -Xms2g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
---
apiVersion: v1
kind: Service
metadata:name: rocketmq-namesrvnamespace: rocketmqlabels:app: rocketmq-namesrv
spec:ports:- port: 9876protocol: TCPtargetPort: 9876selector:app: rocketmq-namesrvtype: ClusterIP
# dig -t a rocketmq-namesrv.rocketmq.svc.cluster.local. @10.96.0.10
rocketmq-broker部署描述文件
# vim rocketmq-broker.yaml
# cat rocketmq-broker.yaml---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: rocketmq-brokernamespace: rocketmq
spec:serviceName: rocketmq-brokerreplicas: 2selector:matchLabels:app: rocketmq-brokertemplate:metadata:labels:app: rocketmq-brokerspec:containers:- name: rocketmq-brokerimage: nextgomsb/rocketmq:v1imagePullPolicy: IfNotPresentcommand:- bin/mqbroker- --namesrvAddr=rocketmq-namesrv.rocketmq.svc.cluster.local.:9876env:- name: JAVA_OPTvalue: -server -Xms1g -Xmx1gdnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulerterminationGracePeriodSeconds: 30updateStrategy:rollingUpdate:partition: 0type: RollingUpdate
rocketmq-dashboard部署描述文件

部署一个能实现运维监控rocketmq的可视化web应用。

部署rocketmq-dashboard应用时候重点关注部署文件里面的env环境变量参数JAVA_OPTS,该env环境变量(JAVA_OPTS)决定了应用是否能成功连接到 rocketmq-namesrv 服务。

# vim rocketmq-dashboard.yaml
# cat rocketmq-dashboard.yaml---
apiVersion: apps/v1
kind: Deployment
metadata:name: rocketmq-dashboardnamespace: rocketmqlabels:app: rocketmq-dashboard
spec:replicas: 1selector:matchLabels:app: rocketmq-dashboardtemplate:metadata:labels:app: rocketmq-dashboardspec:containers:- name: rocketmq-dashboardimage: apacherocketmq/rocketmq-dashboard:latestimagePullPolicy: IfNotPresentenv:- name: JAVA_OPTSvalue: -Drocketmq.namesrv.addr=rocketmq-namesrv.rocketmq.svc.cluster.local.:9876dnsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30---
apiVersion: v1
kind: Service
metadata:name: rocketmq-dashboardnamespace: rocketmqlabels:app: rocketmq-dashboard
spec:ports:- port: 8080protocol: TCPtargetPort: 8080selector:app: rocketmq-dashboardtype: ClusterIP

执行部署描述文件

rocketmq-namesrv部署
# kubectl create -f rocketmq-namesrv.yaml
# kubectl get pods -n rocketmq
NAME                                 READY   STATUS    RESTARTS   AGE
...
rocketmq-namesrv-0                   1/1     Running   0          14m
rocketmq-namesrv-1                   1/1     Running   0          13m
rocketmq-broker部署
# kubectl create -f rocketmq-broker.yaml
# kubectl get pods -n rocketmq
NAME                                 READY   STATUS    RESTARTS   AGE
rocketmq-broker-0                    1/1     Running   0          4m16s
rocketmq-broker-1                    1/1     Running   0          4m15s
rocketmq-dashboard部署
# kubectl create -f rocketmq-dashboard.yaml
# kubectl get pods -n rocketmq
NAME                                 READY   STATUS    RESTARTS   AGE
rocketmq-dashboard-f4ccdf496-sv984   1/1     Running   0          73s

调整副本

调整rocket-namesrv副本数kubectl scale sts rocketmq-namesrv --replicas=3 -n rocketmq
# kubectl get pods -n rocketmq
NAME                                 READY   STATUS    RESTARTS   AGE
rocketmq-namesrv-0                   1/1     Running   0          15m
rocketmq-namesrv-1                   1/1     Running   0          14m
rocketmq-namesrv-2                   1/1     Running   0          4s
调整rocket-broker副本数,集群节点内存要大于副本数中内存。
kubectl scale sts rocketmq-broker --replicas=3 -n rocketmq

创建ingress资源对象实现域名访问dashboard

# vim rocketmq-dashboard-ingress.yaml
# cat rocketmq-dashboard-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-rocketmq-dashboard                    #自定义ingress名称namespace: rocketmqannotations:ingressclass.kubernetes.io/is-default-class: "true"kubernetes.io/ingress.class: nginx
spec:rules:- host: rocketmq-dashboard.kubemsb.com                   # 自定义域名http:paths:- pathType: Prefixpath: "/"backend:service:name: rocketmq-dashboard     # 对应上面创建的service名称port:number: 8080
# kubectl create -f rocketmq-dashboard-ingress.yaml
# kubectl get ingress -n rocketmq
NAME                         CLASS    HOSTS                            ADDRESS   PORTS   AGE
ingress-rocketmq-dashboard   <none>   rocketmq-dashboard.kubemsb.com             80      31s

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

相关文章:

Kubernetes——part11 云原生中间件上云部署 Rocketmqkafkazookeeper

Rocketmq rocketmq角色 RocketMQ由四部分构成&#xff1a;Producer、Consumer、Broker和NameServer 启动顺序&#xff1a;NameServer->Broker 为了消除单点故障&#xff0c;增加可靠性或增大吞吐量&#xff0c;可以在多台机器上部署多个nameserver和broker&#xff0c;并…...

ip租期到了

当IP租约到期后&#xff0c;会发生以下过程&#xff1a; 租约到期通知&#xff1a;在租约到期之前&#xff0c;DHCP客户端通常会尝试续租其IP地址。如果客户端仍然活跃并且希望继续使用相同的IP地址&#xff0c;它会向DHCP服务器发送一个DHCP请求&#xff08;DHCPREQUEST&#…...

鸿蒙系统(harmony)支持Android应用的双框架技术架构分析

鸿蒙系统(HarmonyOS)支持 Android 应用的双框架技术架构 是为了在鸿蒙操作系统上实现对 Android 应用的兼容与支持,特别是在多设备生态下,确保不同类型的 Android 应用能够无缝运行在鸿蒙设备上。这种双框架架构使鸿蒙能够兼顾自身的原生应用生态和 Android 的广泛应用生态…...

面积等效原理

面积等效原理 电力电子技术中的面积等效原理主要应用在PWM&#xff08;Pulse Width Modulation&#xff0c;脉冲宽度调制&#xff09;控制技术中。 定义 面积等效原理&#xff1a;当冲量&#xff08;即窄脉冲的面积&#xff09;相等而形状不同的窄脉冲加在具有惯性的环节上时…...

【测试工具JMeter篇】JMeter性能测试入门级教程(四):JMeter中BeanShell内置方法使用

一、什么是BeanShell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;BeanShell是一种松散类型的脚本语言(这点和JS类似);BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简…...

大小写转换

描述 将下面的字符串中的大小写进行转换。 输入描述 输入一行仅包含字母的字符串(字符串长度 ≤100)。 输出描述 将其中的大写转换为小写&#xff0c;小写转换为大写。 abcD ABCd #include<iostream> #include<string> using namespace std; int main() { …...

手机镜头组如此突出,考虑恢复以前设计

现在手头看重照相。结果导致的问题就是&#xff0c;在背部要突出很高&#xff0c;以容纳镜头组件。这种设计真的好吗&#xff1f;并不见得。真实照片&#xff1a; VIVO X200系列镜头组照片-CSDN博客 考虑到现在镜头的情形&#xff0c;我建议恢复以前的设计&#xff0c;就是把镜…...

浅谈人工智能之基于容器云进行图生视频大模型搭建

浅谈人工智能之基于容器云进行图生视频大模型搭建 根据之前我们所讲过的内容&#xff1a; 文生图 文生视频 我们继续讲解图生视频大模型搭建。 引言 随着深度学习技术的不断发展&#xff0c;图生视频&#xff08;image-to-video&#xff09;大模型成为了计算机视觉和自然语言…...

大型复杂项目管理怎么结合传统与敏捷

大型复杂项目管理需要综合运用传统的瀑布模型与敏捷方法&#xff0c;两者各具优势&#xff0c;可以在不同的项目阶段和需求下发挥最大效能。首先&#xff0c;在项目的初期阶段&#xff0c;传统方法的详细规划和需求分析能够帮助确保项目方向正确、资源充足&#xff1b;敏捷方法…...

家校通小程序实战教程04教师管理

目录 1 创建数据源2 搭建管理后台3 搭建查询条件4 功能测试总结 我们上一篇介绍了如何将学生加入班级&#xff0c;学生加入之后就需要教师加入了。教师分为任课老师和班主任&#xff0c;班主任相当于一个班级的管理员&#xff0c;日常可以发布各种任务&#xff0c;发布接龙&…...

UI控件使用说明

文章目录 一、控件的公共属性二、常用控件的私有属性三、控件的显示与隐藏 一、控件的公共属性 struct element {u32 highlight: 1; //高亮标志u32 state: 3; //内核记录控件的状态u32 ref: 5; //内核计数值u32 prj: 3; //工程序号u32 hide_action: 1; //HIDE_WI…...

树莓派2安装jupyterlab以便更好的编程体验

树莓派2 是一款很老的开发板了&#xff0c;但是它还能继续战斗。为了更好的编程体验&#xff0c;准备安装jupyterlab 安装jupyterlab 使用命令&#xff1a; pip install jupyterlab 该过程非常漫长&#xff0c;因为树莓派2是很老的板子&#xff0c;它需要安装一些arm7版本的…...

计算机网络常见面试题总结(上)

计算机网络基础 网络分层模型 OSI 七层模型是什么&#xff1f;每一层的作用是什么&#xff1f; OSI 七层模型 是国际标准化组织提出的一个网络分层模型&#xff0c;其大体结构以及每一层提供的功能如下图所示&#xff1a; 每一层都专注做一件事情&#xff0c;并且每一层都需…...

k8s 亲和性之Affinity

文章目录 1. Node Affinity&#xff08;节点亲和性&#xff09;节点亲和性类型配置示例常见场景&#xff1a; 2. Pod Affinity 和 Pod Anti-AffinityPod Affinity 配置示例Pod Anti-Affinity 配置示例常见场景&#xff1a; 3. 亲和性规则概述4. 亲和性和反亲和性的细节5. 亲和性…...

SpringBoot 插件化开发模式

一、前言 1.1 使用插件的好处 1.1.1 模块解耦 实现服务模块之间解耦的方式有很多&#xff0c;但是插件来说&#xff0c;其解耦的程度似乎更高&#xff0c;而且更灵活&#xff0c;可定制化、个性化更好。 举例来说&#xff0c;代码中可以使用设计模式来选择使用哪种方式发送…...

基于树莓派的安保巡逻机器人--项目介绍

目录 一、项目简介 二、项目背景 三、作品研发技术方案 作品主要内容&#xff1a; 方案的科学性 设计的合理性 四、作品创新性及特点 五、作品自我评价 本篇为项目“基于树莓派的安保巡逻机器人”介绍博客 演示视频链接&#xff1a; 基于树莓派的安保巡逻机器人_音游…...

Python学习笔记8-函数1

自定义函数 def 函数名(形参):函数体return 空/变量/对象/表达式 形参&#xff1a;函数定义时声明的参数实参&#xff1a;函数调用时传入的参数。函数只需要定义一次&#xff0c;就可以被多次使用当函数被调用时&#xff0c;才执行函数体&#xff0c;定义时不执行 文档注释 …...

如何使用ST7789展现图片?[ESP--4]

本节我们继续ESP和ST 7789的话题&#xff0c;这节课我们来学学如何展示图片,话不多说&#xff0c;先上效果 好&#xff0c;教程开始~前情提要&#xff0c;要看懂这篇&#xff0c;建议搭配楼主的前两期文章 使用ESP32驱动LCD-ST7789屏幕[ESP–2] 加速你的LCD-ST7789屏幕&#xf…...

【QNX+Android虚拟化方案】129 - USB眼图参数配置

【QNX+Android虚拟化方案】129 - USB眼图参数配置 1. 软件侧dts如何配置眼图参数 及 其对应关系2. 硬件 QNX 侧调试眼图命令2.1 High Speed USB2.0 Host2.2 Super Speed USB3.0 Host3. 硬件 Android 侧调试眼图命令基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不…...

【机器学习】探索机器学习决策树算法的奥秘

决策树 前言基本概念常见的决策树算法ID3算法C4.5算法CART算法 决策树的优缺点应用场景决策树的可视化总结 前言 在当今这个数据驱动的时代&#xff0c;机器学习作为数据分析与预测的利器&#xff0c;正以前所未有的速度改变着我们的生活和工作方式。在众多机器学习算法中&…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...