面试

10分钟彻底理解Redis的持久化机制:RDB和AOF

会有一股神秘感。 提交于 2020-12-20 04:15:24
点击上方“ 码农进阶之路 ”,选择 “ 设为星标 ” 回复 “ 面经 ” 获取面试资料 来源: juejin.im/post/5d09a9f f51882577eb133aa9 什么是Redis持久化? Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示: 这样做有什么问题呢? 其实,只要稍微有点计算机基础知识的人都知道,存储在内存当中的数据,只要服务器关机(各种原因引起的),内存中的数据就会消失了,不仅服务器关机会造成数据消失,Redis服务器守护进程退出,内存中的数据也一样会消失。 对于只把Redis当缓存来用的项目来说,数据消失或许问题不大,重新从数据源把数据加载进来就可以了,但如果直接把用户提交的业务数据存储在Redis当中,把Redis作为数据库来使用,在其存储重要业务数据,那么Redis的内存数据丢失所造成的影响也许是毁灭性。 为了避免内存中数据丢失,Redis提供了对持久化的支持,我们可以选择不同的方式将数据从内存中保存到硬盘当中,使数据可以持久化保存。 Redis提供了RDB和AOF两种不同的数据持久化方式,下面我们就来详细介绍一下这种不同的持久化方式吧。 RDB RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb

控制反转( IoC)和依赖注入(DI)

蹲街弑〆低调 提交于 2020-12-20 04:09:48
控制反转( IoC)和依赖注入(DI) tags: 容器 依赖注入 IOC DI 控制反转 引言:如果你看过一些框架的源码或者手册,像是laravel或者tp5之类的,应该会提到容器,依赖注入,控制反转等词汇。或者是某些面试官会问到这类问题。希望这篇文章能让你有所收获。 ###1.1、IoC(控制反转 Inversion of Control) 简述:控制反转并不是一种技术,而是一种 设计思想 。通过控制反转容器(以后称容器),改变了原本某些对象运行时依赖其他对象资源时需要自己进行获取(比如通过new ClassName),所造成的对象之间的强耦合(耦合的概念如果不理解,可以先去了解一下。)。   所谓IoC,对于程序来说,就是构造了一个容器,比如在tp5中,这个容器叫Container,此容器来负责控制对象和对象间的关系。在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个),这样的话一个对象A和另一个对象B之间就有了很强的联系(也就是强耦合)。这种耦合体现在如果被依赖的资源类初始化的时候(也可能是其他时候)传入的参数变化了,你要修改两个类的代码,举例说明:    你本来用的是php本身的session机制,现在想改成也支持redis,并在初始化的时候增加一个参数来控制。这个时候你不止需要去修改类Session类的代码,还要去修改类A的代码。部分代码如下 //原代码

千万不要错过这几道Python面试题,Python面试题No16

非 Y 不嫁゛ 提交于 2020-12-19 18:23:39
第1题: python下 多线程 的限制以及 多进程 中传递参数的方式? python多线程有个全局解释器锁(global interpreter lock),简称GIL,这个GIL并不是python的特性,他是只在Cpython解释器里引入的一个概念,而在其他的语言编写的解释器里就没有这个GIL例如:Jython。 这个锁的意思是任一时间只能有一个线程运用解释器,跟单cpu跑多个程序一个意思,我们都是轮着用的,这叫“并发”,不是“并行”。 为什么会有GIL? 多核CPU的出现,充分利用多核,采用多线程编程慢慢普及,难点就是线程之间数据的一致性和状态同步 说到GIL解释器锁,我们容易想到在多线程中共享全局变量的时候会有线程对全局变量进行的资源竞争,会对全局变量的修改产生不是我们想要的结果,而那个时候我们用到的是python中线程模块里面的互斥锁,哪样的话每次对全局变量进行操作的时候,只有一个线程能够拿到这个全局变量;看下面的代码: import threading global_num = 0 def test1(): global global_num for i in range(1000000): global_num += 1 print("test1", global_num) def test2(): global global_num for i in range

离职10天,面挂4家公司!

落花浮王杯 提交于 2020-12-19 18:05:53
作者:莫那鲁道 来源: http://1t.click/U4g 楼主离职已有 10 天,这段时间里除了看源码,就是投简历面试了。一共面试了 4 家,说说感受。 # XX 汇 XX 汇是一家小型的电商网站,由于楼主的技术栈集中在 Java 语言这里,所以,即使楼主对并发,JVM,Netty,Spring 等都稍有了解,但依然没有任何优势—— 因为他们完全用不到。 整个面试过程中,问了大概以下问题: 1.说说你的项目,用了 SpringCloud 哪些功能? 2.熟悉 Mysql 吗?说说索引(不懂 Mysql 啊大佬) 3.如何实现一个单例模式(这个俺擅长) 4.平时使用了哪些线程池(这个俺也擅长) 5.Map 接口有哪些类(这个俺也擅长) 6.写一段 SQL 呗(不会 SQL) 7.如何实现免登陆功能(cookie session?) 当然,被刷了,估计是 SQL 不够好吧,而我擅长的他们也不需要。 关注微信公众号:Java技术栈,在后台回复:面试题,可以获取我整理的 N 篇面试题精选,真是太全了。 # XX 旅游 这个就比较奇葩了,是最奇葩的一个,面试官是个小伙子,根本不懂并发,然后强行问我并发,自己基本一言不发。 还对我的回答貌似不满意? 1.自我介绍一下。 2.说说 Mysql 的索引。 3.说说 redis 主从同步。 4.说说 redis 缓存穿透,缓存雪崩,恶意访问

我后悔在简历上写了“精通”…

一个人想着一个人 提交于 2020-12-19 18:04:40
前言:众所周知,简历上“了解=听过名字;熟悉=知道是啥;熟练=用过;精通=做过东西 ”,我现在十分后悔在简历上写了“精通”二字… 对于程序员来说,去任何一家公司面试,数据库是避不开的。开发人员对MySQL的掌握,越深入,你能做的事情就越多。 完成业务功能,懂基本的Sql语句。 做性能优化,懂索引,懂引擎。 做分库分表,懂主从,懂读写分离。 做安全,懂权限,懂备份,懂日志。 做云数据库,懂源码,懂瓶颈。 相信大家对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。索引作为MySQL中比较重点的知识,在面试中出现的频率特别高。楼主自认为对MySQL优化的索引相关知识有很多了解,同事们也都热情的称呼我为大佬。楼主一直想进阿里,特地花了1个月左右时间复习相关知识,自信MySQL掌握的很好了,所以斗胆在简历上写了“ 精通MySQL ”,想不到被阿里面试官狠狠虐了一把… (关于这次面试题目和整理的答案我附在了文末,有需要的同学自行领取哈) 前半段和面试官相谈甚欢,聊着聊着我提到我们业务量比较大,每天大概有几百万的新数据生成。 面试官来了兴趣:你们每天这么大的数据量,都是保存在关系型数据库中吗? 我:是的,我们线上使用的是MySQL数据库。 面试官:那你们有没有对于查询做一些优化呢? 我:我们在数据库中创建了一些索引 (我现在非常后悔我当时说了这句话 )。

灵魂一击!详解Java中的IO输入输出流

╄→гoц情女王★ 提交于 2020-12-19 18:00:14
什么是流?流表示任何有能力 产生数据的数据源对象或者是有能力接收数据的接收端对象 ,它屏蔽了实际的I/O设备中处理数据的细节。 IO流是实现输入输出的基础,它可以很方便地实现数据的输入输出操作,即读写操作。 本片要点 介绍流的定义和基本分类。 介绍文件字符流、字节流、转换流、合并流、打印流等使用。 介绍序列化的意义。 介绍两种自定义序列化方式。 基本分类 根据方向输入流 :数据从外部流向程序,例如 从文件中读取数据 。 输出流 :数据从程序流向外部,例如 向文件中写数据 。 根据形式字符流 :字符类文件,【如 txt、 java、 html】,操作16位的字符。 字节流 :【图片、视频、音频】 ,操作8位的字节。 根据功能节点流 :直接从/向数据源【如磁盘、网络】进行数据读写 处理流 :封装其他的流,来提供增强流的功能。 上面四大基本流都是 抽象类 ,都不能直接创建实例对象。 数据的来源/目的地:磁盘、网络、内存、外部设备。 发展史 java1.0版本中,I/O库中与输入有关的所有类都将继承 InputStream ,与输出有关的所有类继承 OutputStream ,用以操作二进制数据。 java1.1版本对I/O库进行了修改:在原先的库中新增了新类,如 ObjectInputStream 和 ObjectOutputStream 。增加了Reader和Writer

三十天学不会TCP,UDP/IP网络编程

本小妞迷上赌 提交于 2020-12-19 16:55:02
经过了过年的忙碌和年初的懈怠一切的日子,我又开始重新更新了~这是最新的一篇~完整版可以去gitbook(https://rogerzhu.gitbooks.io/-tcp-udp-ip/content/)看到。 如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,虽然说现在这种“看不见”的东西真正能在实用中遇到的机会不多,但是我始终觉得无论计算机的语言,热点方向怎么变化,作为一个程序员,很多基本的知识都应该有所了解。而当时在网上搜索资料的时候,这方面的资料真的是少的可怜,所以,我有幸前两年接触了这方面的知识,我觉得我应该把我知道的记录下来,虽然写的不一定很好,但是希望能给需要帮助的人多个参考。我的计划是用半年时间来写完这一系列文章,这个标题也是我对太多速成文章的一种态度,好了,废话不再多扯了,下面是其中的一节内容,更多内容可以去gitbook上找到。 T CP与UDP 前面对于UDP已经阐述了有一些内容了,UDP可以完成一些数据的传输,那么为什么还要再研究出另外一种传输层协议呢?因为在很多时候,不可靠的传输会造成上面的应用层协议变得毫无意义,而且面对越来越复杂的网络,没有管理控制的传输层协议更是会导致网络拥堵不断加剧直至瘫痪。可以设想一下,UDP就像是寄信,当你把信寄出去的时候,你是无法知道这封信可不可以到达收信人的的,如果说唯一你能做的就是相信邮递机构

千万别踩坑,一面就凉透!Java+数据库+Linux+缓存+算法+Redis+网络等等没一个能讲清楚的!

我怕爱的太早我们不能终老 提交于 2020-12-19 16:54:03
面试大概九十分钟,问的东西很全面,需要做充足准备,就是除了概念以外问的有点懵逼了(呜呜呜~)。回来之后把这些题目做了一个分类并整理出答案(强迫症的我~狂补知识~)分为Java+数据库+Linux+缓存+算法+网络等六类,接下来分享一下我的这次美团一面面经++一些我的学习笔记。 注意:篇幅有限,大部分整理的Java+数据库+Linux+缓存+算法网络等六类面试答案、进阶学习笔记、思维脑图(xmind)皆以截图形式展现,但可提供分享所有的原件给每位学习的朋友 快速下载传送通道—— “点点点点点点......我” 第一个 Java相关 1.1 美团面试Java问题 JVM内存模型 GC垃圾回收算法 讲解新生代 老年代 java的基本类型有哪几个?String是不是java的基本类型?String为什么要是final类型的? 说一下JVM的线程模型?这些区域都分别是干啥用的?java线程模型和jvm线程模型注意区分 1.2 我的JAVA学习笔记 (1)JAVA面试宝典 Java基础部分 算法与编程 html&JavaScript&ajax部分 Java web部分 数据库部分 xml部分 流行框架与新技术 设计模式 j2ee部分 EJB部分 webservice部分 (2)JAVA并发体系学习思维脑图(xmind) (3)多线程并发编程学习思维脑图(xmind) 第二个 数据库相关 2.1

面试必问系列,源码解析多线程绝对不容忽视得问题:线程活性故障

余生长醉 提交于 2020-12-19 16:01:39
看多了各种多线程得内容,我们是不是忘记了某一个很重要得知识点—— 线程活性故障 线程活性故障 是由于资源稀缺性或者程序自身的问题导致线程一直处于非 Runnable 状态,或者线程虽然处于 Runnable 状态但是其要执行的任务一直无法取得进展的一种故障现象 关注公众号:Java架构师联盟,每日更新技术好文 下面就来介绍几种常见类型的线程活性故障: 死锁 锁死 线程饥饿 活锁 死锁 对于死锁得问题,我们有一个非常非常好玩的问题---哲学家吃饭,干饭人干饭魂,我们就通过这个讲解引入一下 啊 假设有 5 个哲学家,他们的生活只是思考和吃饭。这些哲学家共用一个圆桌,每位都有一把椅子。在桌子中央有一碗米饭,在桌子上放着 5 根筷子(图 1 )。 当一位哲学家思考时,他与其他同事不交流。时而,他会感到饥饿,并试图拿起与他相近的两根筷子(筷子在他和他的左或右邻居之间)。一个哲学家一次只能拿起一根筷子。显然,他不能从其他哲学家手里拿走筷子。当一个饥饿的哲学家同时拥有两根筷子时,他就能吃。在吃完后,他会放下两根筷子,并开始思考。 哲学家就餐问题是一个经典的同步问题,这不是因为其本身的实际重要性,也不是因为计算机科学家不喜欢哲学家,而是因为它是大量并发控制问题的一个例子。这个代表性的例子满足:在多个进程之间分配多个资源,而且不会出现死锁和饥饿。 我们可以用一段程序来模拟并验证上述的情况 先对筷子

restful规范和restframework框架

时间秒杀一切 提交于 2020-12-19 15:35:37
什么是接口? 接口可以理解为url就是接口. 那么在其他语言里面接口也可以是约束类 restful规范是什么? RESTful是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。 URL: 1.url体现版本 2.url体现是API 3.用HTTPS 4.条件 5.面向资源编程 6.根据method的不用进行不同的操作 7.响应时添加状态码 常见的状态码 200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。 201 CREATED - [POST/PUT/ PATCH]:用户新建或修改数据成功。 202 Accepted - [* ]:表示一个请求已经进入后台排队(异步任务) 204 NO CONTENT - [DELETE]:用户删除数据成功。 400 INVALID REQUEST - [POST/PUT/ PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。 401 Unauthorized - [* ]:表示用户没有权限(令牌、用户名、密码错误)。 403 Forbidden - [* ] 表示用户得到授权(与401错误相对),但是访问是被禁止的。 404 NOT FOUND - [* ]:用户发出的请求针对的是不存在的记录