前言

众所周知,Java开发人员的生存环境可谓是与以前大相径庭,以IT行业发展来说,在十几年前的时候,IT行业的技术人才是稀缺的,程序员最初的招聘行情,只要你会敲“holle world”、会点技术,能做出点东西,就能入职月薪过万的大厂岗位。

而到了今年2021年,初级人才已经不稀缺了。“IT初级人才招聘市场上”除了每年新入行的人,还有几年内、大几年内入行后技术没有进步的人,这些人被辞退、或跳槽找工作,找的也是“IT初级程序员”岗位……

以互联网巨头阿里的招聘信息来看,首先对于工作经验有一定的要求,在我看来工作年限主要取决于你的技术。如果你的技术牛X的话,那么你可以包装自己;其次对于Java程序员来说技术才是最实用的,即使你的工作经验与招聘要求不相匹配,但如果技术掌握情况与之相匹配,阿里是不会“放过”你的,下面是小编在阿里招聘官网看到的招聘信息,可供大家参考。

从图中红色部分可以看到,作为一名三年以上开发经验的Java程序员来说,除了扎实的基础,你还需要掌握中间件、分布式技术、高并发、微服务等技术,而市面上很少有一套系统详细的学习笔记,小编也是花了很多精力才整理出这套《互联网 Java 工程师进阶知识》笔记,不多说,直接上干货!

什么是Redis的持久化

我们知道Redis的数据都存储在内存中,如果服务器突然宕机,那么内存数据将会全部消失,为了防止这种情况出现,利用一套机制来保证数据不会因为故障而丢失,我们将这种机制称之为Redis的持久化机制,该机制主要目的是将内存数据存入到硬盘

Redis 提供两种持久化机制RDB(Redis DataBase)和AOF(Append-Only File)机制。

RDB-快照

快照是最简单的Redis持久化模式,也就是生成某个时间点的数据集,生成RDB文件,可以看到RDB文件中的数据是非常紧凑的,所以在恢复数据的时候读取也是非常快的

触发RDB快照的方式有两种

手动触发

通过手动执行bgsave/save,显示触发生成快照

  • save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用

  • bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短

配置参数自动触发

自动触发有以下几种情况:

  • 使用save相关配置,命令save m n。表示m秒内数据集存在n次修改时,自动触发bgsave
  • 从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件发送给从节点
  • 执行debug reload命令重新加载Redis时,自动触发save命令
  • 执行shutdown命令时,如果没有开启AOF持久化功能自动执行bgsave

注意:在RDB持久化的过程中有两个问题需要考虑

  1. RDB快照过程中Redis是否会停止对外提供服务
  2. 如果没有停止服务,如何处理新的请求

针对上述问题我们先看一下RDB的持久化执行流程

根据上图我们可以看到主线程主要是fork一个子线程来进行持久化操作,同时父子线程会共享一个数据区域,而且该区域设置为read-only方式,该方式下读的时候没有问题,但是写的时候会触发copyonwrite机制来进行,接下来我们看看什么是 COW(Copy On Write) 机制 。

COW(Copy On Write) 机制

COW(Copy On Write) 机制属于操作系统处理多进程下的一种机制,Redis在持久化的时候会调用glibc函数fork一个子进程。父子进程会共享内存里面的代码段和数据段。

所以持久化的时候是完全交给子进程,而父进程继续处理客户端请求,所以在持久化的时候操作系统采用COW机制进程数据段页面的分离。数据段是由很多操作系统的页面组合而成,当父进程对其中一个页面进行数据修改的时候,先将被父子线程共享的这一个页面复制并分离出来,然后直接对复制的页面进程修改,而此时子进程对应的页面是没有修改的。

Redis采用该机制的简单流程如下。Lunix在fork之后,操作系统会将父进程的所有内存也权限设置为read-only,然后子进程的地址空间指向父进程。当父进程只读时没有问题,当有写内存时,CPU硬件检测到内存也是read-only,于是会触发页异常中断(page-fault),陷入到操作系统的一个中断例程。中断例程中,操作系统采用cow机制会触发异常的也复制一份,于是父子进程各自持有独立的一份,如果这个时候又大量写入操作,会产生大量的分页错误(页异常中断page-fault),从而触发cow机制。

之所以称之为快照也就是说在子进程创建的那一时刻开始。内存的数据就固定下来了,不会发生变化。

RDB的优缺点

优点:
  1. 性能最大化,fork子进程来完成写操作,让主进程继续处理命令,保证了redis的高性能
  2. 重启恢复数据的时候。数据量比较大时候,Redis直接解析RDB二进制文件,生成对应的数据存储在内存中,比AOF的启动效率更高
缺点
  1. 数据安全性低,因为是间隔一段时间进行持久化,如果在持久化之间发生了故障,会丢失数据,这也就决定了该方式更适合在数据要求不严谨的时候采用
  2. 系统性能耗费,根据上文提到的Redis执行cow机制时,可以看到大量的分页错误会耗费不少性能在复制上

AOF(Append Only File - 仅追加文件)

根据上文,快照在某些情况下不是可行的选择,所以AOF很好的支持了。

AOF 原理

该方式非常简单:也就是修改内存的操作命令都会记录下来,加入AOF日志记录都是Redis实例创建以来的所有修改性指令序列,所以恢复也就是顺序执行所有执行。

Redis使用单线程相应命令,如果每次写AOF文件命令都追加到硬盘,会极大地影响处理性能,所以Redis会先写入到aof缓冲区,根据用户配置的同步硬盘策略写入到aof文件中,这个策略可以通过appendfsync参数配置

  • always:每一次写操作都会调用一次fsync,这时数据是最安全的,当然,由于每次都会执行fsync,所以其性能也会受到影响
  • no:Redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了。对大多数Linux操作系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上。
  • everysec:Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。但是当这一次的fsync调用时长超过1秒时。Redis会采取延迟fsync的策略,再等一秒钟。也就是在两秒后再进行fsync,这一次的fsync就不管会执行多长时间都会进行。这时候由于在fsync时文件描述符会被阻塞,所以当前的写操作就会阻塞。

注意,这也是影响Redis性能的参数之一,建议采用 appendfsync everysec(缺省方式)

AOF重写

所谓重写,Redis在长期运行过程中日志会越来越大,在恢复的时候会非常好使,所以我们的目的就是对日志做瘦身

会从以下几点做瘦身:

  1. 无效命令可以删除,比如del key1、hdel key2、srem keys、set a111、set a222等,直接用最终的数据生成命令保存下来就行
  2. 多条命令可以删除,如:lpush list a、lpush list b、lpush list c可以转化为:lpush list a b c
  3. 等等,就不列举了

Redis使用bgrewriteaof指令做瘦身,主要也是开辟一个子进程对内存遍历转化为一系列指令,并序列化到新的文件中,接下来再将操作期间的增量AOF日志追加到新的日志文件中,最终替换了旧的。

AOF重写机制两种方式触发

  1. 手动触发:bgrewriteaof指令
  2. 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机
  • auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64MB。

  • auto-aof-rewrite-percentage:代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。

auto-aof-rewrite-min-size    100auto-aof-rewrite-percentage  64mb复制代码

如上代表AOF文件的大小小于64mb(默认值),且当前AOF文件大小比基准大小增长了100%时会触发。

AOF优缺点

优点

数据安全,aof持久化配置appendfsync属性,有always,每执行一次命令操作就记录到aof文件一次

缺点

数据集大的时候,比如RDB启动效率低

混合持久化(Redis 4.0版本)

我们根据上文知道,RDB恢复会存在大量数据,AOF恢复性能又较慢,所以在Redis4.0中,采用混合持久化,将RDB文件内存和增量的AOF日志文件放在一起,这里的AOF日志不再是全量日志。而是自持久化开始到持久化结束的这段时间的增量日志,通常较小,重启效率因此大幅得到提升

加载的时候,首先会识别AOF文件是否以REDIS字符串开头,如果是就按照RDB格式加载,加载完成后继续按AOF加载剩余的部分

结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱,所以福利也为你准备,这份1000题免费送你!点击这里免费领取

  • Java互联网工程师面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

(已经整理)

[外链图片转存中…(img-r7aeUO1g-1624079472103)]

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中…(img-t6dsOOJx-1624079472104)]

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

java实现excel导入数据库相关推荐

  1. Java实现Excel导入数据库,数据库中的数据导入到Excel

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 实现的功能: Java实现Excel导入数据库,如果存在就更新 数据库中的数据导入到Excel 1. ...

  2. java web excel导入数据库

    原作者:sincoolvip 出处:http://www.cnblogs.com/sincoolvip/p/6531403.html 分析:首先采用一个工具类Excel2List.java,把exce ...

  3. java poi excel 导入数据库_java POI 处理excel表格数据并导入数据库示例

    java操作Excel最常用的开源组件有poi与jxl.jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007. poi是apache下的一个子项目,poi应该是处理ms的 ...

  4. java中excel文件导入数据库中_〖JAVE经验〗java中Excel导入数据库里

    1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表.读取Excel数据表的第一步是创建Workbook(术语: ...

  5. Java开发环境!java实现excel导入数据库

    京东一面凉经 object的方法,7大方法 synchronized方法讲解 synchronized方法实现原理 volatile关键字的原理 锁的分类 偏向锁讲解 NoClassDefFoundE ...

  6. java实现excel导入数据库,附架构师必备技术详解

    京东一面凉经 object的方法,7大方法 synchronized方法讲解 synchronized方法实现原理 volatile关键字的原理 锁的分类 偏向锁讲解 NoClassDefFoundE ...

  7. java通过jxl处理execl空行_jxl操作Excel导入数据库之空行的处理

    jxl因其快速小巧受到大家的欢迎,但是jxl还是有许多不尽如人意的地方. 本文旨在解决jxl读取excel数据时无法自动取掉空行的问题,其实就是添加一个方法. ? //返回去掉空行的记录数 priva ...

  8. php读取excel中数据库,ThinkPHP 框架实现的读取excel导入数据库操作示例

    本文实例讲述了ThinkPHP 框架实现的读取excel导入数据库操作.分享给大家供大家参考,具体如下: 入口文件中: require_once VENDOR_PATH.'PHPExcel/PHPEx ...

  9. 当excel 导入数据库的字段大于255时,把第一行的字段加长超过255.

    当excel 导入数据库的字段大于255时,把第一行的字段加长超过255. 因为Excel驱动程序在进行导入操作时会预先采样部分数据判断字段的数据类型,所以对采样数据结果作的判断同全部数据的数据类型有 ...

  10. excel导入数据库的简单方法

    一个简单的方法将excel导入数据库 private void Plan_Import_Execl()         {             OpenFileDialog fileDialog ...

最新文章

  1. gevent.joinall()开启协程
  2. 非常值得收藏的 IBM SPSS Modeler 算法简介
  3. 怎么查看docker是否启动_怎么查看自己的手机是否支持北斗导航系统
  4. ANDROID自定义视图——onMeasure流程,MeasureSpec详解
  5. 二次注入 php,dedecms20140606 二次注入+存储型xss
  6. globalmapper如何选取图像上的点_OpenCV 进阶应用,用编程手段搞定图像处理
  7. vlc集成c#_C#WinForm程序调用VLC异常
  8. 容器编排技术 -- Kubernetes kubectl 与 Docker 命令关系
  9. Android从无知到有知——NO.6
  10. MFC输出EXCEL文档的过程总结
  11. java生命之树_《Spring揭秘》.王福强.文字版.pdf
  12. 在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Patcher)
  13. 有声小说php源码,PHP魅雅有声小说联盟程序源码 v7.7.2
  14. 一篇适合小白的Shiro教程
  15. SNF快速开发平台项目实践介绍
  16. 新股高中签率的技巧|提高新股中签率技巧
  17. 知识共享许可协议 Creative Commons Licenses
  18. 常见的树以及树的应用场景
  19. Vue.js 写一个echarts的水滴图
  20. jquery mobile_jQuery Mobile课程1

热门文章

  1. Python个人快速入门学习(九)jieba库的使用
  2. 数论之指标介绍及其应用(基于阶与原根的应用)
  3. 胡玉平 计算机科学,基于代价敏感混合分裂策略的多决策树算法
  4. python bunch制作可导入数据_python – ImportError:无法导入名称Bunch scikit-learn 0.19
  5. 数据预处理Part5——样本分布不均衡
  6. 鼠标跟随flash代码_Flash动画设计之 MTV实例创作《不说再见》
  7. 【829】【06 信息检索策略和方法】
  8. 文本自动生成研究进展与趋势之文本到文本的生成
  9. Linux_home的迁移
  10. watch蜂窝开通服务器中断,原因找到了!Apple Watch Series 3为何无法连接蜂窝网络...