拷贝

面试连环炮系列(二十一):你们的项目怎么使用kafka

我们两清 提交于 2019-12-01 18:57:26
你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka。通过Spring AOP的方式收集日志,通过kafaka发送出去。 kafa存在丢消息的情况吗,怎么解决? producer把消息发送给broker,因为网络抖动,消息没有到达broker,且开发人员无感知。 解决方案:producer设置acks参数,消息同步到master之后返回ack信号,否则抛异常使应用程序感知到并在业务中进行重试发送。这种方式一定程度保证了消息的可靠性,producer等待broker确认信号的时延也不高。 producer把消息发送给broker-master,master接收到消息,在未将消息同步给follower之前,挂掉了,且开发人员无感知。 解决方案:producer设置acks参数,消息同步到master且同步到所有follower之后返回ack信号,否则抛异常使应用程序感知到并在业务中进行重试发送。这样设置,在更大程度上保证了消息的可靠性,缺点是producer等待broker确认信号的时延比较高。 producer把消息发送给broker-master,master接收到消息,master未成功将消息同步给每个follower,有消息丢失风险。 解决方案:同上。

JavaScript-对象

夙愿已清 提交于 2019-12-01 16:41:52
对象 创建对象 使用 new 关键字 let obj = new Object(); 使用字面量创建 let obj = {}; 对象常用方法 属性遍历 for (let key in obj){ // ... } 属性删除 delete obj.name; delete obj.say; 判断属性有无 // in 会在原型链上查找 console.log(attrName in obj); // hasOwnPrototype 只会在构造函数中寻找 console.log(obj.hasOwnPrototype(attrName)); 解构赋值 // 解构赋值定义的变量名必须与对象内部属性名相同,否则无法赋值成功 // 解构赋值可以为变量赋默认值 let obj = {name: 'zs', age: 18}; let {name, age = 20, gender = 'man'} = obj; console.log(name, age, gender); // 'zs' 18 man 对象深拷贝 深拷贝:通过一个参数给另一个参数赋值后,改变新的参数,不会修改原有参数。基本数据类型都是深拷贝。 浅拷贝:通过一个参数给另一个参数赋值后,改变新的参数,原有参数也会被修改。引用数据类型都是浅拷贝。 // 对象深拷贝 // 通过assign函数 let newObj = Object

理解Object.assign

孤人 提交于 2019-12-01 15:39:41
Object.assign()方法用于从一个或多个源对象(sources)中拷贝所有可枚举的自有属性到目标对象(target),并返回目标对象。拷贝过程中将调用源对象的getter方法,并在target对象上使用setter方法实现目标对象的拷贝。 1 Object.assign(target, ...sources) 不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。 原文:Both String and Symbol properties are copied. String和Symbol类型都可被直接分配。 1234 function (origin) { let originProto = Object.getPrototypeOf(origin); return Object.assign(Object.create(originProto), origin);} 注意:如果属性是只读的,那将会抛出异常,目标对象将会停止改变(而之前的改变会保留)。但是对于null或者undefind会直接忽略。 简单克隆对象 1234 var obj = ;var copy = Object.assign({}, obj);console.log(copy); //Object {a: 1} 合并对象 123456 var a

深浅拷贝

▼魔方 西西 提交于 2019-12-01 15:29:37
一.内存存储机制 a = 1 b=a b=2 print('a') a=1: 内存会为1划分一块空间,将a指向1, b=a :将b指向a指向的空间1 b=2 : 内存会开辟一块新空间2,将b指向新空间,而a未改变。 不可变类型都不是在原来的空间更改,是重新开辟了空间 二.浅拷贝 来源: https://www.cnblogs.com/gjx1212/p/11690762.html

引用传递与值传递______深拷贝与浅拷贝______构造函数与析构函数

霸气de小男生 提交于 2019-12-01 13:53:39
引用传递、值传递、指针传递: https://www.cnblogs.com/ducongcong/p/6912164.html 深拷贝与浅拷贝: https://blog.csdn.net/caoshangpa/article/details/79226270 总结:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。 文末有两个链接,关于智能指针和实现string类,非常不错 构造函数与析构函数: https://blog.csdn.net/nyist_zxp/article/details/80802749 来源: https://www.cnblogs.com/WHUT-Simon/p/11689400.html

深拷贝&浅拷贝

泄露秘密 提交于 2019-12-01 12:42:42
js对象深拷贝的方法: js对象深拷贝的方法1js对象深拷贝的方法2js对象深拷贝的方法3js对象深拷贝的方法4js对象深拷贝的方法5js对象深拷贝的方法6js对象深拷贝的方法7 分步阅读 js中,数组和对象的拷贝(复制)如果使用=号来进行复制,那只是浅拷贝。 第一步:js深拷贝和浅拷贝的概念和区别。 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象。此时子对象拷贝的是父对象的地址,子父对象相互影响。 2.深拷贝 就是把父对象的属性中的值拷贝给子对象此时不论父对象如何改变都不会再影响到子对象。 第二步:测试浅拷贝。我们借助于谷歌浏览器控制台实现浅拷贝的测试, 首先声明对象:var father={familyName:"张"}; var son={}; 拷贝son=father此时打印,son和father的familyName都是张 将father的familyName改为“李”,则son的familyName也变为了“李”。 这就是浅拷贝,拷贝的是存储变量的地址会互相影响。 js对象深拷贝的方法 js对象深拷贝的方法 第三步:浅拷贝的实现 第一种:借助于js的JSON对象的两个函数 JSON.stringify(father)将一个json对象转为json字符串 JSON.parse(str)将一个json字符串转为json对象 它的实现原理是现将对象转为一个基本数据类型

JS数据拷贝

醉酒当歌 提交于 2019-12-01 11:36:40
JS的拷贝可分为浅拷贝和深拷贝: 浅拷贝:如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化。 深拷贝:就是指完全的拷贝一个对象,即使嵌套了对象,两者也相互分离,修改一个对象的属性,也不会影响另一个。 通常我们用的slice(截取)、concat(拼接)函数,都是浅拷贝。 // 可用concat、slice返回一个新数组的特性来实现拷贝 var arr = ['old', 1, true, null, undefined]; var new_arr = arr.concat(); // 或者var new_arr = arr.slice()也是一样的效果; new_arr[0] = 'new'; console.log(arr); // ["old", 1, true, null, undefined] console.log(new_arr); // ["new", 1, true, null, undefined] // 数组嵌套了对象或者数组的话用concat、slice拷贝只要有修改会引起新旧数组都一起改变 var arr = [{old: 'old'}, ['old']]; var new_arr = arr.concat(); // 或者var new_arr = arr

STL容器----vector与list

走远了吗. 提交于 2019-12-01 10:15:03
一、Vector向量容器    连续存储 的容器, 动态 数组,在 堆 上分配空间   底层实现: 数组   两倍容量增长:     vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。     如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。   性能:   访问:O(1) 常量时间复杂度   插入:在最后插入(空间够):很快     在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。     在中间插入(空间够):内存拷贝     在中间插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。   删除: 在最后删除:很快     在中间删除:内存拷贝   适用场景:经常随机访问,且不经常对非尾节点进行插入删除。 二、Lists   动态链表,在 堆 上分配空间, 每插入一个元数都会分配空间,每删除一个元素都会释放空间 。   底层: 双向链表   性能:   访问: 随机访问性能很差,只能快速访问头尾节点。   插入:很快,一般是常数开销   删除:很快,一般是常数开销   适用场景:经常插入删除大量数据 vector与list 的区别:   1

js实现浅拷贝和深拷贝

五迷三道 提交于 2019-12-01 09:59:32
实现浅拷贝和深拷贝 1. 浅拷贝和深拷贝的区别 简单点说,浅拷贝拷贝完后,修改拷贝的内容可能会对源内容产生影响。而深拷贝就是拷贝前后的内容相互不影响。 那为什么拷贝前后的内容会相互影响呢? 那就得知道基本类型和引用类型的区别了。 基本类型 :自然不用说了,它的值就是一个数字,一个字符或一个布尔值。 引用类型 :是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。 而在js中,有三大引用类型即Object、Array、Function。 因此在拷贝他们的时候,应该使用深拷贝来避免于源内容产生影响。 2.实现浅拷贝 3.实现深拷贝 3.1使用JSON var arr = [1, [7, [9]], {a:'1'} , function(){}, null, undefined, NaN]; var result = JSON.parse(JSON.stringify(arr)); 拷贝结果 [1, [7,[9]], {a:'1'}, null, null, null, null] 所以可以看出,使用JSON不能实现对function、undefined、NaN的拷贝。 来源: https://www.cnblogs.com/xuxuya/p/11677533.html

Python多任务之进程

限于喜欢 提交于 2019-12-01 09:57:42
Process多进程 进程的概念 程序是没有运行的代码,静态的; 进程是运行起来的程序,进程是一个程序运行起来之后和资源的总称; 程序只有一个,但同一份程序可以有多个进程;例如,电脑上多开QQ; 程序和进程的区别在于有没有资源,进程有资源而程序没有资源,进程是一个资源分配的基本单元; 程序在没运行的时候没有资源,没有显卡,没有网卡,等等;双击运行后有摄像头,有网速等等,就叫做进程; 进程的状态 进程状态图 就绪态:运行的条件都已经慢去,正在等在cpu执行 执行态:cpu正在执行其功能 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态 使用Process完成多任务 进程的使用步骤和线程的使用步骤基本一致; 进程的使用步骤: 导入multiprocessing; 编写多任务所所需要的函数; 创建multiprocessing.Process类的实例对象并传入函数引用; 调用实例对象的start方法,创建子线程。 进程使用步骤图示: 进程使用步骤代码 import time import multiprocessing def sing(): while True: print("-----sing-----") time.sleep(1) def dance(): while True: print("-----dance-----") time.sleep(1)