给网站做蜘蛛抓取/百度关键词排名联系方式
简介
Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。
Curator的maven依赖
Apache Curator 是 Apache 基金会提供的一款 ZooKeeper 客户端,它提供了一套易用性和可读性非常强的 Fluent 风格的客户端 API ,可以帮助我们快速搭建稳定可靠的 ZooKeeper 客户端程序。
为便于你更全面了解 Curator 的功能,我整理出了如下表格,展示了 Curator 提供的 jar 包:
添加依赖
<!-- 对zookeeper的底层api的一些封装 --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.0.0</version></dependency><!-- 封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式Barrier --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.0.0</version></dependency>
创建连接
public static void main(String[] args) throws Exception {//fluent风格
// CuratorFramework curatorFramework1=CuratorFrameworkFactory.builder().connectString(ZKSERVERS).sessionTimeoutMs(5000).
// retryPolicy(new ExponentialBackoffRetry(1000,3)).
// namespace("/curator").build();
// curatorFramework1.start();RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);CuratorFramework client = CuratorFrameworkFactory.newClient(ZKSERVERS, retryPolicy);client.start();String result=client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/curator/curator1/curator11","123".getBytes());System.out.println(result);}
curator连接的重试策略
ExponentialBackoffRetry() 衰减重试
RetryNTimes 指定最大重试次数
RetryOneTime 仅重试一次
RetryUnitilElapsed 一直重试直到规定的时间
基本操作
public static void main(String[] args) throws Exception {// Zookeeper集群地址,多个节点地址可以用逗号分隔String zkAddress = "127.0.0.1:2181";// 重试策略,如果连接不上ZooKeeper集群,会重试三次,重试间隔会递增RetryPolicy retryPolicy =new ExponentialBackoffRetry(1000, 3);// 创建Curator Client并启动,启动成功之后,就可以与Zookeeper进行交互了CuratorFramework client =CuratorFrameworkFactory.newClient(zkAddress, retryPolicy);client.start();// 下面简单说明Curator中常用的API// create()方法创建ZNode,可以调用额外方法来设置节点类型、添加Watcher// 下面是创建一个名为"user"的持久节点,其中会存储一个test字符串String path = client.create().withMode(CreateMode.PERSISTENT).forPath("/user", "test".getBytes());System.out.println(path);// 输出:/user// checkExists()方法可以检查一个节点是否存在Stat stat = client.checkExists().forPath("/user");System.out.println(stat!=null);// 输出:true,返回的Stat不为null,即表示节点存在// getData()方法可以获取一个节点中的数据byte[] data = client.getData().forPath("/user");System.out.println(new String(data));// 输出:test// setData()方法可以设置一个节点中的数据stat = client.setData().forPath("/user","data".getBytes());data = client.getData().forPath("/user");System.out.println(new String(data));// 输出:data// 在/user节点下,创建多个临时顺序节点for (int i = 0; i < 3; i++) {client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/user/child-");}// 获取所有子节点List<String> children = client.getChildren().forPath("/user");System.out.println(children);// 输出:[child-0000000002, child-0000000001, child-0000000000]// delete()方法可以删除指定节点,deletingChildrenIfNeeded()方法// 会级联删除子节点client.delete().deletingChildrenIfNeeded().forPath("/user");}
Curator 异步接口,引入了BackgroundCallback
上面介绍的创建、删除、更新、读取等方法都是同步的,Curator 提供异步接口,引入了BackgroundCallback 这个回调接口以及 CuratorListener 这个监听器,用于处理 Background 调用之后服务端返回的结果信息。BackgroundCallback 接口和 CuratorListener 监听器中接收一个 CuratorEvent 的参数,里面包含事件类型、响应码、节点路径等详细信息。
下面我们通过一个示例说明 BackgroundCallback 接口以及 CuratorListener 监听器的基本使用:
public class CuratorAsynApi {public static void main(String[] args) throws Exception {// Zookeeper集群地址,多个节点地址可以用逗号分隔String zkAddress = "127.0.0.1:2181";// 重试策略,如果连接不上ZooKeeper集群,会重试三次,重试间隔会递增RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);// 创建Curator Client并启动,启动成功之后,就可以与Zookeeper进行交互了CuratorFramework client = CuratorFrameworkFactory.newClient(zkAddress, retryPolicy);client.start();// 添加CuratorListener监听器,针对不同的事件进行处理client.getCuratorListenable().addListener(new CuratorListener() {public void eventReceived(CuratorFramework client,CuratorEvent event) throws Exception {switch (event.getType()) {case CREATE:System.out.println("CREATE:" +event.getPath());break;case DELETE:System.out.println("DELETE:" +event.getPath());break;case EXISTS:System.out.println("EXISTS:" +event.getPath());break;case GET_DATA:System.out.println("GET_DATA:" +event.getPath() + ","+ new String(event.getData()));break;case SET_DATA:System.out.println("SET_DATA:" +new String(event.getData()));break;case CHILDREN:System.out.println("CHILDREN:" +event.getPath());break;default:}}});// 注意:下面所有的操作都添加了inBackground()方法,转换为后台操作client.create().withMode(CreateMode.PERSISTENT).inBackground().forPath("/user", "test".getBytes());client.checkExists().inBackground().forPath("/user");client.setData().inBackground().forPath("/user","setData-Test".getBytes());client.getData().inBackground().forPath("/user");for (int i = 0; i < 3; i++) {client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).inBackground().forPath("/user/child-");}client.getChildren().inBackground().forPath("/user");// 添加BackgroundCallbackclient.getChildren().inBackground(new BackgroundCallback() {public void processResult(CuratorFramework client,CuratorEvent event) throws Exception {System.out.println("in background:"+ event.getType() + "," + event.getPath());}}).forPath("/user");client.delete().deletingChildrenIfNeeded().inBackground().forPath("/user");System.in.read();}}
连接状态监听
除了基础的数据操作,Curator 还提供了监听连接状态的监听器——ConnectionStateListener,它主要是处理 Curator 客户端和 ZooKeeper 服务器间连接的异常情况,例如, 短暂或者长时间断开连接。
短暂断开连接时,ZooKeeper 客户端会检测到与服务端的连接已经断开,但是服务端维护的客户端 Session 尚未过期,之后客户端和服务端重新建立了连接;当客户端重新连接后,由于 Session 没有过期,ZooKeeper 能够保证连接恢复后保持正常服务。
而长时间断开连接时,Session 已过期,与先前 Session 相关的 Watcher 和临时节点都会丢失。当 Curator 重新创建了与 ZooKeeper 的连接时,会获取到 Session 过期的相关异常,Curator 会销毁老 Session,并且创建一个新的 Session。由于老 Session 关联的数据不存在了,在 ConnectionStateListener 监听到 LOST 事件时,就可以依靠本地存储的数据恢复 Session 了。
这里 Session 指的是 ZooKeeper 服务器与客户端的会话。客户端启动的时候会与服务器建立一个 TCP 连接,从第一次连接建立开始,客户端会话的生命周期也开始了。客户端能够通过心跳检测与服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能够通过该连接接收来自服务器的 Watch 事件通知。
我们可以设置客户端会话的超时时间(sessionTimeout),当服务器压力太大、网络故障或是客户端主动断开连接等原因导致连接断开时,只要客户端在 sessionTimeout 规定的时间内能够重新连接到 ZooKeeper 集群中任意一个实例,那么之前创建的会话仍然有效。ZooKeeper 通过 sessionID 唯一标识 Session,所以在 ZooKeeper 集群中,sessionID 需要保证全局唯一。 由于 ZooKeeper 会将 Session 信息存放到硬盘中,即使节点重启,之前未过期的 Session 仍然会存在。
public class CuratorSessionApi {public static void main(String[] args) throws Exception {// Zookeeper集群地址,多个节点地址可以用逗号分隔String zkAddress = "127.0.0.1:2181";// 重试策略,如果连接不上ZooKeeper集群,会重试三次,重试间隔会递增RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);// 创建Curator Client并启动,启动成功之后,就可以与Zookeeper进行交互了CuratorFramework client = CuratorFrameworkFactory.newClient(zkAddress, retryPolicy);client.start();// 添加ConnectionStateListener监听器client.getConnectionStateListenable().addListener(new ConnectionStateListener() {public void stateChanged(CuratorFramework client,ConnectionState newState) {// 这里我们可以针对不同的连接状态进行特殊的处理switch (newState) {case CONNECTED:// 第一次成功连接到ZooKeeper之后会进入该状态。// 对于每个CuratorFramework对象,此状态仅出现一次System.out.println("第一次成功连接到ZooKeeper之后会进入该状态");break;case SUSPENDED: // ZooKeeper的连接丢失System.out.println("ZooKeeper的连接丢失");break;case RECONNECTED: // 丢失的连接被重新建立System.out.println("丢失的连接被重新建立");break;case LOST:System.out.println("当Curator认为会话已经过期时,则进入此状态");// 当Curator认为会话已经过期时,则进入此状态break;case READ_ONLY: // 连接进入只读模式System.out.println("连接进入只读模式");break;}}});client.close();System.in.read();}
}
Watcher
Watcher 监听机制是 ZooKeeper 中非常重要的特性,可以监听某个节点上发生的特定事件,例如,监听节点数据变更、节点删除、子节点状态变更等事件。当相应事件发生时,ZooKeeper 会产生一个 Watcher 事件,并且发送到客户端。通过 Watcher 机制,就可以使用 ZooKeeper 实现分布式锁、集群管理等功能。
在 Curator 客户端中,我们可以使用 usingWatcher() 方法添加 Watcher,前面示例中,能够添加 Watcher 的有 checkExists()、getData()以及 getChildren() 三个方法,下面我们来看一个具体的示例:
public class CuratorWatcherApi {public static void main(String[] args) throws Exception {// Zookeeper集群地址,多个节点地址可以用逗号分隔String zkAddress = "127.0.0.1:2181";// 重试策略,如果连接不上ZooKeeper集群,会重试三次,重试间隔会递增RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);// 创建Curator Client并启动,启动成功之后,就可以与Zookeeper进行交互了CuratorFramework client = CuratorFrameworkFactory.newClient(zkAddress, retryPolicy);client.start();try {client.create().withMode(CreateMode.PERSISTENT).forPath("/user", "test".getBytes());} catch (Exception e) {}// 这里通过usingWatcher()方法添加一个WatcherList<String> children = client.getChildren().usingWatcher(new CuratorWatcher() {public void process(WatchedEvent event) throws Exception {System.out.println(event.getType() + "," +event.getPath());}}).forPath("/user");System.out.println(children);System.in.read();}
}
接下来,我们打开 ZooKeeper 的命令行客户端,在 /user 节点下先后添加两个子节点,此时我们只得到一行输出:
NodeChildrenChanged,/user
之所以这样,是因为通过 usingWatcher() 方法添加的 CuratorWatcher 只会触发一次,触发完毕后就会销毁。checkExists() 方法、getData() 方法通过 usingWatcher() 方法添加的 Watcher 也是一样的原理,只不过监听的事件不同,你若感兴趣的话,可以自行尝试一下。
相信你已经感受到,直接通过注册 Watcher 进行事件监听不是特别方便,需要我们自己反复注册 Watcher。Apache Curator 引入了 Cache 来实现对 ZooKeeper 服务端事件的监听。Cache 是 Curator 中对事件监听的包装,其对事件的监听其实可以近似看作是一个本地缓存视图和远程ZooKeeper 视图的对比过程。同时,Curator 能够自动为开发人员处理反复注册监听,从而大大简化了代码的复杂程度。
实践中常用的 Cache 有三大类:
- NodeCache。 对一个节点进行监听,监听事件包括指定节点的增删改操作。注意哦,NodeCache 不仅可以监听数据节点的内容变更,也能监听指定节点是否存在,如果原本节点不存在,那么 Cache 就会在节点被创建后触发 NodeCacheListener,删除操作亦然。
- PathChildrenCache。 对指定节点的一级子节点进行监听,监听事件包括子节点的增删改操作,但是不对该节点的操作监听。
- TreeCache。 综合 NodeCache 和 PathChildrenCache 的功能,是对指定节点以及其子节点进行监听,同时还可以设置监听的深度。
下面通过示例介绍上述三种 Cache 的基本使用:
public class CuratorWatcherCacheApi {public static void main(String[] args) throws Exception {// Zookeeper集群地址,多个节点地址可以用逗号分隔String zkAddress = "127.0.0.1:2181";// 重试策略,如果连接不上ZooKeeper集群,会重试三次,重试间隔会递增RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);// 创建Curator Client并启动,启动成功之后,就可以与Zookeeper进行交互了CuratorFramework client = CuratorFrameworkFactory.newClient(zkAddress, retryPolicy);client.start();// 创建NodeCache,监听的是"/user"这个节点NodeCache nodeCache = new NodeCache(client, "/user");// start()方法有个boolean类型的参数,默认是false。如果设置为true,// 那么NodeCache在第一次启动的时候就会立刻从ZooKeeper上读取对应节点的// 数据内容,并保存在Cache中。nodeCache.start(true);if (nodeCache.getCurrentData() != null) {System.out.println("NodeCache节点初始化数据为:"+ new String(nodeCache.getCurrentData().getData()));} else {System.out.println("NodeCache节点数据为空");}// 添加监听器nodeCache.getListenable().addListener(() -> {String data = new String(nodeCache.getCurrentData().getData());System.out.println("NodeCache节点路径:" + nodeCache.getCurrentData().getPath()+ ",节点数据为:" + data);});// 创建PathChildrenCache实例,监听的是"user"这个节点PathChildrenCache childrenCache = new PathChildrenCache(client, "/user", true);// StartMode指定的初始化的模式// NORMAL:普通异步初始化// BUILD_INITIAL_CACHE:同步初始化// POST_INITIALIZED_EVENT:异步初始化,初始化之后会触发事件childrenCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);// childrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);// childrenCache.start(PathChildrenCache.StartMode.NORMAL);List<ChildData> children = childrenCache.getCurrentData();System.out.println("获取子节点列表:");// 如果是BUILD_INITIAL_CACHE可以获取这个数据,如果不是就不行children.forEach(childData -> {System.out.println(new String(childData.getData()));});childrenCache.getListenable().addListener(((client1, event) -> {System.out.println(LocalDateTime.now() + " " + event.getType());if (event.getType().equals(PathChildrenCacheEvent.Type.INITIALIZED)) {System.out.println("PathChildrenCache:子节点初始化成功...");} else if (event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)) {String path = event.getData().getPath();System.out.println("PathChildrenCache添加子节点:" + event.getData().getPath());System.out.println("PathChildrenCache子节点数据:" + new String(event.getData().getData()));} else if (event.getType().equals(PathChildrenCacheEvent.Type.CHILD_REMOVED)) {System.out.println("PathChildrenCache删除子节点:" + event.getData().getPath());} else if (event.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)) {System.out.println("PathChildrenCache修改子节点路径:" + event.getData().getPath());System.out.println("PathChildrenCache修改子节点数据:" + new String(event.getData().getData()));}}));// 创建TreeCache实例监听"user"节点TreeCache cache = TreeCache.newBuilder(client, "/user").setCacheData(false).build();cache.getListenable().addListener((c, event) -> {if (event.getData() != null) {System.out.println("TreeCache,type=" + event.getType() + " path=" + event.getData().getPath());} else {System.out.println("TreeCache,type=" + event.getType());}});cache.start();System.in.read();}
}
启动程序后自己在客户端进行增加节点,修改数据等操作,观察输出这里不进行截图了
相关文章:

zookeeper基础学习之六: zookeeper java客户端curator
简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java…...

MySQL数据库操作学习(2)表查询
文章目录 一、表查询1.表字段的操作①查看表结构②字段的增加③字段长度/数据类型的修改④字段名的修改⑤删除字符段⑥清空表数据⑦修改表名⑧删除表 2、表数据查询3、where 字段4、聚合函数 一、表查询 1.表字段的操作 ①查看表结构 desc 表名; # 查看表中的字段类型&#…...

Java学习
目录 treeSet StringBuilder treeSet TreeSet 是 Java 中实现了 Set 接口的一种集合类,它使用红黑树数据结构来存储元素,放到TreeSet集合中的元素: 无序不可重复,但是可以按照元素的大小顺序自动排序。 TreeSet一般会和Iterator迭代器一起使…...

C#八皇后算法:回溯法 vs 列优先法 vs 行优先法 vs 对角线优先法
目录 1.八皇后算法(Eight Queens Puzzle) 2.常见的八皇后算法解决方案 (1)列优先法(Column-First Method): (2)行优先法(Row-First Method)&a…...

springboot整合swagger,postman,接口规范
一、postman介绍 1.1概述 工具下载 Postman(发送 http 请求的工具) 官网(下载速度比较慢):Download Postman | Get Started for Free 网盘下载:百度网盘 请输入提取码 1.2Http 请求格式 请求地址请求方法状…...

029—pandas 遍历行非向量化修改数据
前言 在 pandas 中,向量化计算是指利用 pandas 对象的内置方法和函数,将操作应用到整个数据结构的每个元素,从而在单个操作中完成大量的计算。 但在一些需求中,我们无法使用向量化计算,就需要迭代操作,本例…...

相机安装位置固定后开始调试设备供电公司推荐使用方法
摄像头安装位置固定后开始调试 设备供电:无电源设备需要连接12V/2A电源并连接到摄像机的DC端口,而有电源的摄像机可以直接连接到220V电源。 连接设备:如果是有线连接,请使用网线将设备连接到电脑(建议直接连接&#…...

AI视频批量混剪系统|罐头鱼AI视频矩阵获客
AI视频批量混剪系统助您轻松管理和编辑视频素材 如今,视频营销已成为企业推广的重要方式。为了满足用户对视频管理、发布和编辑的需求,《罐头鱼AI视频批量混剪系统》应运而生。这款智能化系统集成了多种功能,助您轻松管理和发布精彩视频内容…...

线程池学习-了解,自定义线程池
什么是线程池,这个池字是什么 线程池,主要利用池化思想,线程池,字符串常量池等 为什么要有一个线程池? 正常线程的创建:1,手动创建一个线程 2.给该线程分配任务,线程执行任务 3…...

CentOS7.9 安装SIPp3.6
epel里面的SIPp版本比较旧,先不要epel yum remove -y epel-release okay有很多CentOS软件,可以这样安装: 编辑 /etc/yum.repos.d/okay.repo,内容为: [okay] nameExtra OKay Packages for Enterprise Linux - $basearc…...

Java零基础入门-LinkedHashMap集合
一、本期教学目标 学习LinkedHashMap集合的概念及特点。学习LinkedHashMap存储结构。学习LinkedHashMap集合常用方法及示例代码演示。 二、正文 1、概述 我们学习了map接口之HashMap集合,今天我们要来学习map接口的另一个实现类-LinkedHashMap,不知道…...

LRC转SRT
最近看到一首很好的英文MTV原版,没又字幕,自己找字幕,只找到LRC,ffmpeg不支持LRC,网上在线转了SRT。 Subtitle Converter | Free tool | GoTranscript 然后用 ffmpeg 加字幕 ffmpeg -i LoveMeLikeYouDo.mp4 -vf sub…...

mybatis源码阅读系列(二)
前言 上一篇文章mybatis源码阅读系列(一)介绍了mybatis和原生jdbc的区别,并通过代码展示了两者的运行过程和结果,下面让我们继续详细了解下mybatis的执行过程; package com.wyl.mybatis.service;import com.wyl.mybat…...

【Web开发】CSS教学(超详细,满满的干货)
💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:【Web开发】CSS教学(超详细,满满的干货) 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 CSS一. 什么是CSS?1.1 基本语法规范1.2 引入方式1.3 规范 二. CSS选…...

系列学习前端之第 5 章:学习 ES6 ~ ES11
1、什么是 ECMAScript ECMAScript 是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。 从第 6 版开始,发生了里程碑的改动,并保持着每年迭代一个版本的习惯。 ES62015年,ES72016年,ES82017年,ES92018年&#…...

Linux学习(4)——使用编辑器
1.gedit编辑器 简单易懂,依赖图形界面。可以使用ctrlc ctrlv等快捷键,ctrls进行保存,与windows系统中相类似。 2.vi/vim编辑器 vi/vim可以直接通过控制台的终端完成文本的编辑,不依赖图形界面,使用范围更广。它的编辑…...

简单函数_短信计费
任务描述 用手机发短信,一条短信资费为0.1元,但限定一条短信的内容在70个字以内(包括70个字)。如果你一次所发送的短信超过了70个字,则会按照每70个字一条短信的限制把它分割成多条短信发送。假设已经知道你当月所发送…...

centos命令history设置记录10000行
今天在操作服务器的时候,用history查看操作记录的时候,发现只能查看10条,这样不行啊,我想查看所有人对服务器操作的命令。 [rootbogon ~]# history解决办法: #1、找到/etc/profile文件中的histsize 把10改成10000 […...

SpringBoot打造企业级进销存储系统 第七讲
Transientprivate String roles; // 所拥有的角色package com.java1234.entity;import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import javax.p…...

1.实用Qt:解决绘制圆角边框时,圆角锯齿问题
目录 问题描述 解决方案 方案1: 方案2: 结果示意图 问题描述 做UI的时候,我们很多时候需要给绘制一个圆角边框,初识Qt绘制的童鞋,可能绘制出来的圆角边框很是锯齿,而且粗细不均匀,如下图&…...

JavaWeb08-Filter和Listener
目录 一、Filter 1.概述 2.作用 3.快速入门 4.执行流程 5.拦截路径配置 6.拦截器链(多个过滤器) 7.登录验证 二、Listener(了解即可) 1.概述 2.主要作用 3.分类 4.快速入门 一、Filter 1.概述 Filter 表示过滤器&am…...

关于ClickHouse的一些小技巧
关于ClickHouse的一些小技巧 设置变量 set param_nameAlex; select {name:String};projection的使用 基于projection(投影)的优化需要打开开关optimize_use_projections。ClickHouse里的projection是物化的,也就是说数据会复制存一份。 Pr…...

有来团队后台项目-解析7
sass 安装 因为在使用vite 创建项目的时候,已经安装了sass,所以不需要安装。 如果要安装,那么就执行 npm i -D sass 创建文件 src 目录下创建文件 目录结构如图所示: reset.scss *, ::before, ::after {box-sizing: border-…...

用户数据的FLASH存储与应用(FPGA架构)
该系列为神经网络硬件加速器应用中涉及的模块接口部分,随手记录,以免时间久了遗忘。 一 背景 我们知道,在FPGA做神经网络应用加速时,涉及到权重参数的存储和加载。通常在推理过程中,会将权重参数存储在外部DDR或片上S…...

Chrome的V8引擎 和操作系统交互介绍
Chrome的V8引擎是一个用C编写的开源JavaScript和WebAssembly引擎,它被用于Chrome浏览器中,以解释和执行JavaScript代码。V8引擎将JavaScript代码转换为机器代码,这使得JavaScript能够以接近本地代码的速度运行。 V8引擎与操作系统的交互主要体…...

Redis:持久化、线程模型、大 key
Redis持久化方式有什么方式? Redis 的读写操作都是在内存中,所以 Redis 性能才会高,但是当 Redis 重启后,内存中的数据就会丢失,那为了保证内存中的数据不会丢失,Redis 实现了数据持久化的机制,…...

Linux 16个常用脚本(初级)练习
(1)编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户 #!/bin/bash # 编写脚本:提示用户输入用户名和密码,脚本自动创建相应的账户及配置密码。如果用户 # 不输入账户名,则提示必须输入账户名并退出脚本;如果用…...

接口测试及接口测试工具【Postman】相关的面试题
Postman是一种接口调试与http接口测试的工具,可以非常方便的模拟get、post或其他请求来调试和测试接口 文章目录 Postman优点Postman使用流程Postman参数化有哪几种方式Postman如何设置关联接口测试能发现什么问题如何分析bug是前端还是后端当一个接口出现异常时&am…...

android 怎么自定义view
首先了解view的绘制流程: 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout,确定子view 而onDraw----是继承view时候需要操作的。 所以:自定义ViewGroup一般是利用现有的组件根据特定的布局…...

JavaScript的事件
JavaScript的事件 先写一个test测试函数以查看事件是否触发 function test(){var ddocument.getElementById("tid");console.log("测试成功"d) //控制台输出 }onclick 鼠标单击事件: <input type"button" id"tid" va…...