ZooKeeper知识点总结及分布式锁实现

news2024/11/25 13:54:42

    最初接触ZooKeeper是之前的一个公司的微服务项目中,涉及到Dubbo和ZooKeeper,ZooKeeper作为微服务的注册和配置中心。好了,开始介绍ZooKeeper了。

目录

1.ZooKeeper的基本概念

2.ZooKeeper的节点(ZNode)

3. ZooKeeper的Watcher机制

4. ZooKeeper的会话(Session)

5. ZooKeeper的领导者选举

6. ZooKeeper的持久性和临时性节点

7. ZooKeeper的ACL(访问控制列表)

 8.ZooKeeper的集群模式

9. ZooKeeper的典型应用场景

 10.ZooKeeper的会话超时和重连机制

11. ZooKeeper的故障恢复机制

 12.ZooKeeper的事务处理

13. ZooKeeper的Watcher事件和状态

14. ZooKeeper的四字节数字表示

 15.ZooKeeper的Chroot特性

16.ZooKeeper的JMX(Java Management Extensions)管理 

17. ZooKeeper的Quorum Peer通信

18. ZooKeeper的Follower和Observer角色

19. ZooKeeper Administrator(ZK Admin)命令行工具

20.ZooKeeper的ZooInspector可视化工具

​ 21.Spring Boot整合ZooKeeper实现分布式锁


1.ZooKeeper的基本概念
知识点描述示例
什么是ZooKeeper分布式协调服务ZooKeeper是一个开源的分布式协调服务,用于维护配置信息、命名、提供分布式同步和提供组服务等。
设计目标简单、健壮、易于编程ZooKeeper的设计目标是简单、健壮、易于编程,它能够保证在分布式环境中的一致性。
核心特性一致性、可靠性、有序性ZooKeeper的核心特性包括一致性、可靠性和有序性,确保分布式环境中的数据一致性。
数据模型树形结构ZooKeeper的数据模型是类似于文件系统的树形结构,称为ZNode。每个ZNode可以存储数据和子节点。
应用场景分布式锁、配置管理等ZooKeeper常用于实现分布式锁、配置管理、负载均衡、命名服务等。
2.ZooKeeper的节点(ZNode)
知识点描述示例
ZNode类型持久节点和临时节点持久节点会一直存在,直到被显式删除;临时节点在创建它的会话结束时自动删除。
ZNode数据存储数据每个ZNode可以存储一定量的数据,通常用于存储配置信息或状态信息。
顺序性顺序ZNode可以创建顺序ZNode,ZooKeeper会在创建时在ZNode名称后添加一个数字,表示创建顺序。
监听器监听节点变化可以为ZNode设置监听器,当ZNode的数据或子节点发生变化时,监听器会被触发。
权限控制ACL(Access Control Lists)ZooKeeper支持权限控制,可以为不同的ZNode设置不同的访问权限。
3. ZooKeeper的Watcher机制
知识点描述示例
Watcher定义事件监听器Watcher是ZooKeeper中的事件监听器,用于监听ZNode上的变化。
触发事件数据变更、状态变更Watcher可以监听数据节点的内容变化、子节点的添加或删除,以及客户端与服务器之间的状态变化。
一次性触发单次触发Watcher是一次性的,一旦触发,就会移除,如果需要持续监听,需要重新注册。
事件类型多种事件类型包括节点创建、删除、更改以及客户端连接状态变化等。
应用场景状态同步、触发动作常用于实现分布式协调、状态同步,以及在节点变化时触发某些动作。
4. ZooKeeper的会话(Session)
知识点描述示例
会话概念客户端与ZooKeeper的连接会话是客户端与ZooKeeper之间的一个TCP连接,用于客户端与ZooKeeper之间的通信。
会话ID唯一标识每个会话都有一个唯一的会话ID,用于识别特定的会话。
超时机制保持会话活跃如果会话在一定时间内没有收到心跳,ZooKeeper将认为会话超时,并释放该会话创建的所有临时节点。
心跳维持连接客户端周期性地向ZooKeeper发送心跳以保持会话活跃。
状态连接状态会话状态包括连接成功、连接超时、会话关闭等。
5. ZooKeeper的领导者选举
知识点描述示例
领导者选举集群中的主节点在ZooKeeper集群中,领导者(Leader)负责处理所有事务请求,并与跟随者(Follower)和观察者(Observer)进行通信。
选举过程自动进行当集群中的领导者崩溃或失去连接时,集群会自动进行领导者选举。
投票机制基于ZXID领导者选举过程中,节点通过投票来决定新的领导者,投票通常基于ZXID(事务ID)来确保一致性。
法定人数多数投票选举新的领导者需要集群中多数节点的投票。
容错能力高可用性领导者选举机制确保了ZooKeeper集群的高可用性,即使部分节点失效,集群也能继续工作。
6. ZooKeeper的持久性和临时性节点
知识点描述示例
持久性节点长期存储创建后,除非被客户端显式删除,否则持久性节点会一直存在于ZooKeeper中。
临时性节点会话关联临时性节点与创建它的会话生命周期绑定,会话结束时,临时节点被自动删除。
顺序节点自增序号可以创建带有顺序的持久性或临时性节点,ZooKeeper会在节点名后添加一个自增的序列号。
持久性顺序节点持久且有序结合了持久性和顺序性的特点,适用于需要持久化存储且需要顺序标识的场景。
应用场景任务调度、分布式锁持久性节点常用于存储长时间不变的信息,而临时性节点常用于实现轻量级的分布式锁或任务调度。
7. ZooKeeper的ACL(访问控制列表)
知识点描述示例
ACL定义访问控制机制ACL是ZooKeeper提供的访问控制机制,用于控制对ZNode的访问权限。
权限类型认证与授权包括对ZNode的读、写、创建、删除等操作的权限。
认证方案基于角色的访问控制可以为不同的角色或用户设置不同的权限,实现细粒度的访问控制。
权限设置与ZNode关联权限是与特定的ZNode关联的,可以为每个ZNode设置不同的ACL。
安全性增强系统安全性通过ACL可以增强ZooKeeper集群的安全性,防止未授权访问。
 8.ZooKeeper的集群模式
知识点描述示例
集群组成多个ZooKeeper服务器一个ZooKeeper集群由多个ZooKeeper服务器组成,提供高可用性和可扩展性。
领导者(Leader)事务处理Leader服务器负责处理所有事务请求,是集群中的主要工作节点。
跟随者(Follower)数据复制Follower服务器从Leader复制数据,处理非事务请求,参与领导者选举。
观察者(Observer)读请求处理Observer服务器不参与投票,只用于处理客户端的读请求,提高集群的读取性能。
容错机制自动故障转移当Leader服务器出现故障时,集群会自动进行领导者选举,实现故障转移。
9. ZooKeeper的典型应用场景
知识点描述示例
分布式锁协调分布式系统中的进程使用ZooKeeper的临时性节点和监听器实现分布式锁,确保资源在分布式环境中的互斥访问。
配置管理集中管理配置信息将系统配置存储在ZooKeeper的ZNode中,便于分布式系统中的各个节点获取和监听配置变化。
集群管理管理集群节点状态利用ZooKeeper来监控和管理集群中的节点状态,如节点的加入、退出和故障检测。
队列管理分布式队列使用ZooKeeper的顺序节点和监听器实现分布式队列,用于任务调度和负载均衡。
发布/订阅事件通知客户端可以订阅ZooKeeper上的主题,当主题发生变化时,ZooKeeper可以通知所有订阅的客户端。
 10.ZooKeeper的会话超时和重连机制
序号知识点描述示例
1会话超时客户端连接丢失当客户端与ZooKeeper服务器的连接中断,如果在超时时间内未能重新连接,则会话将被认为超时。
2超时时间可配置会话超时时间是可以配置的,通常根据应用需求和网络状况来设置。
3临时节点自动删除如果会话超时,客户端创建的所有临时节点将被ZooKeeper自动删除。
4重连机制客户端尝试重新连接客户端在检测到连接丢失后,会尝试重连到ZooKeeper集群中的其他服务器。
5监听器重新注册在重连成功后,客户端需要重新注册之前设置的监听器,以继续监控ZNode的变化。
11. ZooKeeper的故障恢复机制
知识点描述示例
故障检测心跳机制ZooKeeper使用心跳机制来检测服务器和客户端的连接状态,如果心跳超时则认为连接断开。
领导者选举自动进行当领导者出现故障时,集群会自动触发领导者选举过程以选出新的领导者。
数据同步确保一致性跟随者和观察者节点会与领导者节点进行数据同步,以保证数据的一致性。
持久化存储保证数据不丢失ZooKeeper的事务日志和快照用于数据的持久化存储,确保在故障恢复后数据不会丢失。
快速恢复减少停机时间通过优化故障恢复流程,ZooKeeper可以快速从故障中恢复,减少系统的停机时间。
 12.ZooKeeper的事务处理
知识点描述示例
事务定义操作序列事务是一组不可分割的ZooKeeper操作序列,要么全部成功,要么全部失败。
事务IDZXID每个事务都有一个唯一的事务ID(ZXID),用于标识事务操作。
写操作更新ZNode写操作包括创建节点、删除节点、设置节点数据等。
原子性事务操作的原子性事务保证了操作的原子性,要么所有操作都被执行,要么都不执行。
事务日志持久化事务信息事务信息会被记录在事务日志中,确保事务的持久性和可靠性。
13. ZooKeeper的Watcher事件和状态
知识点描述示例
事件类型多种事件Watcher可以监听包括节点变更、子节点列表变更、连接状态变更等多种事件。
事件触发异步通知当Watcher监听的事件被触发时,ZooKeeper会异步地通知客户端。
状态变化连接状态Watcher可以监听客户端与ZooKeeper服务器之间的连接状态,如连接丢失或重新连接。
一次性触发后移除Watcher在触发一次后会被自动移除,需要重新设置以继续监听。
应用实时响应通过Watcher机制,客户端可以实时响应ZooKeeper中的变化,如节点数据更新或子节点添加。
14. ZooKeeper的四字节数字表示
知识点描述示例
四字节数字计数方式ZooKeeper使用四字节数字来表示节点版本号、事务ID等,范围从1到2^31-1。
计数器递增每个事务后,相关的计数器(如ZXID的计数器)递增,确保每个事务ID唯一。
持久性持久化四字节数字的持久化确保了在ZooKeeper重启后,计数器不会丢失。
版本号节点版本控制每个ZNode都有版本号,包括节点版本和子节点版本,用于冲突解决和缓存一致性。
应用事务一致性四字节数字在ZooKeeper的内部事务处理中起到关键作用,确保事务的顺序和一致性。
 15.ZooKeeper的Chroot特性
知识点描述示例
Chroot特性命名空间隔离Chroot允许在ZooKeeper实例中创建一个命名空间,用于隔离不同用户或应用的数据。
使用场景多租户支持通过Chroot,可以在单个ZooKeeper实例上运行多个虚拟ZooKeeper服务。
语法路径指定使用Chroot时,通过在ZooKeeper的连接字符串后面添加一个斜杠和特定路径来指定命名空间。
限制性能影响Chroot特性可能会对ZooKeeper的性能产生一定影响,尤其是在大量的watcher和频繁的节点操作时。
应用数据隔离适用于需要严格数据隔离和安全性要求的场景,如不同团队或项目之间的数据隔离。
16.ZooKeeper的JMX(Java Management Extensions)管理 
知识点描述示例
JMX定义管理接口JMX是Java平台内建的一套管理接口,用于监控和管理Java应用程序。
MBeans管理豆MBeans是JMX的组件,代表可以被监控和管理的资源,如内存使用、线程状态等。
连接使用JMX连接ZooKeeper提供了JMX连接,允许管理员远程监控和操作ZooKeeper实例。
监控实时数据通过JMX可以实时监控ZooKeeper的运行状态,包括客户端连接数、请求数、数据节点状态等。
管理动态调整JMX允许管理员在运行时动态地调整ZooKeeper的配置,如更改日志级别、重启服务等。
17. ZooKeeper的Quorum Peer通信
知识点描述示例
Quorum Peer集群节点在ZooKeeper中,每个服务器节点被称为一个Quorum Peer,它们组成一个领导者和多个跟随者的集群。
通信机制TCP/IP协议Quorum Peers之间的通信基于TCP/IP协议,用于数据同步和领导者选举。
领导者选举集群协调当集群中的领导者崩溃时,Quorum Peers会进行领导者选举以选出新的领导者。
消息传递心跳和提案Quorum Peers通过发送心跳消息来维持连接,并使用提案消息来提交事务。
持久化事务日志每个Quorum Peer都会持久化事务日志,确保在故障恢复后数据的一致性。
18. ZooKeeper的Follower和Observer角色
知识点描述示例
Follower角色数据复制Follower节点接收来自Leader的更新,并将这些更新应用到本地数据库。
Observer角色读请求Observer节点不参与投票,主要处理客户端的读取请求,提高读取吞吐量。
角色转换动态变化在ZooKeeper集群中,Follower可以在需要时被配置为Observer,反之亦然。
数据同步保持一致Follower和Observer都会从Leader同步数据,以保证集群中数据的一致性。
应用场景高可用与扩展性Observer用于提高集群的读取性能,而不增加投票过程的开销,适用于读多写少的场景。
19. ZooKeeper Administrator(ZK Admin)命令行工具
知识点描述示例
ZK Admin命令行工具ZK Admin是ZooKeeper提供的命令行工具,用于管理ZooKeeper集群。
功能集群管理可以执行如查看集群状态、查看服务器统计信息、触发领导者选举等操作。
使用命令行界面通过命令行界面,输入特定的命令来执行管理任务。
参数命令选项提供多种参数和选项,允许管理员根据需要定制操作。
应用场景集群运维常用于ZooKeeper的日常运维,如配置更改、状态监控和故障排查。
20.ZooKeeper的ZooInspector可视化工具
知识点描述示例
ZooInspector可视化工具ZooInspector是一个用于可视化ZooKeeper数据树的Java应用程序。
功能数据浏览允许用户浏览和管理ZooKeeper服务中的ZNode数据。
用户界面图形界面提供图形用户界面,使得操作ZooKeeper的数据更加直观和方便。
特点实时更新可以实时显示ZooKeeper中的更改,包括节点的创建、删除和数据变更。
应用场景数据管理和调试适用于开发和测试阶段,帮助开发者更好地理解和管理ZooKeeper中的数据结构。

Windows系统可以使用zktool工具,需要jdk1.8以上。

 
21.Spring Boot整合ZooKeeper实现分布式锁

在Spring Boot中整合ZooKeeper实现分布式锁,通常需要以下步骤:

  1. 添加ZooKeeper依赖:在项目的pom.xml文件中添加ZooKeeper客户端库的依赖。

  2. 配置ZooKeeper连接:在application.propertiesapplication.yml中配置ZooKeeper的连接字符串。

  3. 创建分布式锁的接口:定义一个分布式锁的接口,包含加锁和释放锁的方法。

  4. 实现分布式锁:使用ZooKeeper的客户端库实现分布式锁的逻辑。

  5. 使用分布式锁:在需要同步的代码块中使用分布式锁。

下面是一个简单的代码示例:

pom.xml 添加ZooKeeper依赖:

<dependencies>
    <!-- ZooKeeper客户端 -->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.7.0</version>
    </dependency>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.7.0</version>
    </dependency>
</dependencies>

application.yml 配置ZooKeeper连接:

spring:
  zookeeper:
    host: localhost:2181 # ZooKeeper服务器地址

 分布式锁接口和实现

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.concurrent.CountDownLatch;

@Component
public class DistributedLock {
    
    @Value("${spring.zookeeper.host}")
    private String zkHost;

    private ZooKeeper zkClient;
    
    private static final String LOCK_PATH = "/distributed_lock";

    public void init() throws Exception {
        // 连接ZooKeeper
        CountDownLatch countDownLatch = new CountDownLatch(1);
        zkClient = new ZooKeeper(zkHost, 5000, (watchedEvent) -> {
            if (watchedEvent.getState() == Watcher.Event.KeeperState.SyncConnected) {
                countDownLatch.countDown();
            }
        });
        countDownLatch.await();
    }

    public boolean tryLock(String lockName) throws Exception {
        String lockNode = zkClient.create(
                LOCK_PATH + "/" + lockName,
                "".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL_SEQUENTIAL
        );

        // 检查是否是最小序号的节点,即获取锁
        Stat stat = zkClient.exists(lockNode, false);
        if (stat != null) {
            long currentSequence = Long.parseLong(lockNode.substring(lockNode.lastIndexOf('-') + 1));
            while (true) {
                List<String> children = zkClient.getChildren(LOCK_PATH, false);
                long minSequence = Long.MAX_VALUE;
                for (String node : children) {
                    long sequence = Long.parseLong(node.substring(node.lastIndexOf('-') + 1));
                    if (sequence < minSequence) {
                        minSequence = sequence;
                    }
                }
                if (currentSequence == minSequence) {
                    // 成功获得锁
                    return true;
                }
                Thread.sleep(100);
            }
        } else {
            // 创建节点失败
            return false;
        }
    }

    public void unlock(String lockNode) throws Exception {
        zkClient.delete(lockNode, -1);
    }
}

使用分布式锁

@Service
public class SomeService {

    private final DistributedLock distributedLock;

    public SomeService(DistributedLock distributedLock) {
        this.distributedLock = distributedLock;
    }

    public void someMethod() {
        try {
            if (distributedLock.tryLock("myLock")) {
                // 执行业务逻辑
                distributedLock.unlock("/path/to/lock/node");
            } else {
                // 没有获得锁,进行其他逻辑处理
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

请注意,这个示例只是一个比较简略的版本,实际的项目中使用,可能需要考虑更多的异常处理和资源清理。另外,分布式锁的实现可能需要根据具体的业务场景和需求进行调整。

      昨晚把大学时期总结的英语形近词从我的百度文库个人主页下载下来优化整理了一下,那时候大概总结整理了几千个英语形近词,当时是为了应付一下考研英语科目。现在准备学习英语口语,单词仍然是基础,还需要再次复习复习。过几天会把这些整理到CSDN中,哈哈哈,马上要做英语博主了!

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

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

相关文章

基于MSOGI的交叉对消谐波信号提取网络MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介&#xff1a; 此模型利用二阶广义积分器&#xff08;SOGI&#xff09;对基波电流和相应次的谐波电流进行取 &#xff0c;具体是通过多个基于二阶广义积分器的正交信号发生器 &#xff08; S&#xf…

基于Vue Router和element-ui的LayOut

一、展示 二、代码 app.vue <template><div id"app"><el-container style"border: 1px solid #eee; height: 100vh"><el-aside v-bind:width"asideWidth" style"background-color: rgb(48, 65, 86);"><…

【数据结构】这样学习串的朴素模式匹配算法,简直不要太容易……

串的朴素模式匹配算法 导读一、串的模式匹配1.1 模式匹配是什么&#xff1f;1.2 为什么要有模式匹配算法&#xff1f; 二、朴素模式匹配算法2.1 算法底层逻辑2.2 算法实现2.2.1 过程解析2.2.2 思路分析2.2.3 思路总结2.2.4 代码编写数据类型函数的三要素函数主体 2.2.5 代码测试…

【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解

一、线程概念 线程是进程的一个执行分支&#xff0c;是在进程内部运行的一个执行流。下面将从是什么、为什么、怎么办三个角度来解释线程。 1、什么是线程 上面是一张用户级页表&#xff0c;我们都知道可执行程序在磁盘中无非就是代码或数据&#xff0c;更准确点表述&#xff0…

python从0开始学习

目录 前言 1、print函数 2、input函数 3、保留字和标识符 总结 前言 本篇文章我们开辟一个新的学习模块&#xff1a;python。python是一个十分简洁实用的编程语言&#xff0c;我们将从0开始学习python 1、print函数 print(*args, sep , end\n, fileNone, flushFalse) pytho…

高手的黑箱:AI时代学习、思考与创作

课程目录 01 不要错过这个时代的巨大红利&#xff0c;AI时代竞争力养成指南.mp4 02 解密高手的黑箱——那些创作高手不告诉你的事.mp4 03 创作&#xff1a;人生发展中最重要的事.mp4 04 创作中最重要的事&#xff08;1&#xff09;&#xff1a;对过程的掌控力.mp4 05 创作…

FIFO Generate IP核使用——FIFO写操作详解及Status Flags页配置

本文介绍了FIFO的写操作及Status Flags页的配置信息。 1 FIFO 写入操作 当FIFO的写入使能&#xff08;write enable&#xff09;被置位&#xff0c;并且FIFO未满时&#xff0c;数据会从输入总线&#xff08;din&#xff09;被添加到FIFO中&#xff0c;并且写入确认&#xff0…

Spring - 8 ( 10000 字 Spring 入门级教程 )

一&#xff1a; MyBatis 1.1 引入 MyBatis 我们学习 MySQL 数据库时&#xff0c;已经学习了 JDBC 来操作数据库, 但是 JDBC 操作太复杂了. 我们先来回顾⼀下 JDBC 的操作流程: 创建数据库连接池 DataSource通过 DataSource 获取数据库连接 Connection编写要执行带 ? 占位符…

【LLM 论文】CREA-ICL:利用跨语言检索来增强小语种的 ICL 能力

论文&#xff1a;From Classification to Generation: Insights into Crosslingual Retrieval Augmented ICL ⭐⭐⭐⭐ NeurIPS 2023, arXiv:2311.06595 文章目录 论文速读总结 论文速读 有很多外国语言因为其语言复杂性、标记数据集的缺乏以及数据重复等问题&#xff0c;LLM …

【讲解下如何解决一些常见的 Composer 错误】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【二等奖水平论文】2024五一数学建模C题22页保奖论文+22页matlab和13页python完整建模代码、可视图表+分解结果等(后续会更新)

一定要点击文末的卡片&#xff0c;那是资料获取的入口&#xff01; 点击链接加入群聊【2024五一数学建模】&#xff1a;http://qm.qq.com/cgi-bin/qm/qr?_wv1027&khoTDlhAS5N_Ffp-vucfG5WjeeJFxsWbz&authKey7oCSHS25VqSLauZ2PpiewRQ9D9PklaCxVS5X6i%2BAkDrey992f0t15…

前端高频算法

分析算法排序&#xff1a; 时间复杂度: 一个算法执行所耗费的时间。 空间复杂度: 运行完一个程序所需内存的大小。 执行效率、内存消耗、稳定性 三方面入手。 1. 排序 1.1 冒泡排序 冒泡的过程只涉及相邻数据的交换操作&#xff0c;所以它的空间复杂度为 O(1)。 为了保证…

Deep learning Part Five RNN--24.4.29

接着上期&#xff0c;CBOW模型无法解决文章内容过长的单词预测的&#xff0c;那该如何解决呢&#xff1f; 除此之外&#xff0c;根据图中5-5的左图所示&#xff0c;在CBOW模型的中间层求单词向量的和&#xff0c;这时就会出现另一个问题的&#xff0c;那就是上下文的单词的顺序…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式&#xff0c;讲着讲着越讲越多。JVM这一块吧&#xff0c;知识比较散比较多&#xff0c;如果深研究下去如死扣《深入理解Java虚拟机》&#xff0c;这本书很深很细&#xff0c;全记住是不可能的&#xff0c;其实也没必要。趁这个机会直接把…

附录6-4 黑马优购项目-分类和购物车

目录 1 分类 1.1 接口 1.2 窗口限制 1.3 选中状态样式判断 1.4 点击左侧时右侧会到顶点 1.5 源码 2 购物车 2.1 store 2.2 tabBar徽标 2.3 滑动删除 2.4 结算 2.4.1 结算前登录 2.4.2 结算功能 2.5 触发组件事件 2.6 源码 1 分类 分类最上部是…

Flutter笔记:谈Material状态属性-为什么FlatButton等旧版按钮就废弃了

Flutter笔记 谈Material状态属性-为什么FlatButton等旧版按钮就废弃了 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this artic…

免安装SQL管理工具HeidiSQL建库如何选Collation字符校对

免安装SQL管理工具HeidiSQL 文章目录 免安装SQL管理工具HeidiSQL一、安装二、建库因此&#xff0c;通常我们选择&#xff1a; 一、安装 到官方网址&#xff1a;https://www.heidisql.com/ 下载后按不同版本安装或解压&#xff0c;运行目录中的heidisql应用程序。 该工具可以对…

「生存即赚」链接现实与游戏,打造3T平台生态

当前&#xff0c;在线角色扮演游戏&#xff08;RPG&#xff09;在区块链游戏市场中正迅速崛起&#xff0c;成为新宠。随着区块链技术的不断进步&#xff0c;众多游戏开发者纷纷将其游戏项目引入区块链领域&#xff0c;以利用这一新兴技术实现商业价值的最大化。在这一趋势中&am…

加州大学欧文分校英语中级语法专项课程02:Adjectives and Adjective Clauses 学习笔记

Adjectives and Adjective Clauses course certificate 本文是 https://www.coursera.org/learn/adjective-clauses 这门课的学习笔记。 文章目录 Adjectives and Adjective ClausesWeek 01: Adjectives and Adjective PhrasesLearning Objectives Adjectives Introduction Le…

基于Java的智慧社团综合管理系统的设计与实现(论文+源码)_kaic

摘 要 随着校园文化的不断丰富&#xff0c;大学里各种社团越来越多&#xff0c;社团活动也越来越频繁&#xff0c;社员也越来越多&#xff0c;而且大学生退社、入社比较频繁&#xff0c;社团管理就显得非常繁琐而又复杂,如果采用人工管理,对管理员来说将是一件很头疼的事情。设…