通达信显示某个操作数没有相应的操作符匹配错误起始位置:66;长度:8是什么意思?

  自我介绍首先描述自己的基本情况,其次是描述自己的技术亮点,做过的亮点项目或产品。如果没有做过有技术亮点的事,每天都在做增删改查功能或重复性的工作,需要好好反思下,这样下去技术上没有多少增长。如果工作中就是做这个怎么办?可以考虑利用业余时间参与开源项目或自己做一些工具或框架。

45、生产环境如何定位内存溢出?CPU使用率过高?Linux命令?

    Netty 是一个基于NIO的客户、服务器端编程框架。

    1)本质:JBoss做的一个Jar包

    2)目的:快速开发高性能、高可靠性的网络服务器和客户端程序

    3)优点:提供异步的、事件驱动的网络应用程序框架和工具

      a、并发高

      b、传输快:领拷贝,使用直接缓冲区

      c、封装好:比较简洁,使用链式调用

    通俗的说:一个好使的处理Socket的东东

     中volatile变量在写操作之后会插入一个store屏障,在读操作之前会插入一个load屏障。一个类的final字段会在初始化后插入一个store屏障,来确保final字段在构造函数初始化完成并可被使用时可见。

  1、为了提高性能,处理器设计了多级缓存,cpu的缓存和共享的缓存。cpu把处理结果发到缓存后就可以做其他处理了,但这也造成了可见性问题。

  2、缓存操作是分成缓存行,缓存一致性原则(MESI)通过定义独占、共享、修改、失效等缓存行的状态来协调多个处理器对其的操作。(内存级别)当共享的同一缓存端的数据发生变化时其他cpu都会得到通知。

  3、为了杜绝内存不一致的情况(如指令重排序,cpu和编译阶段都会),又引入了内存屏障来确保一致性。内存屏障分为LoadLoad屏障,LoadStore屏障,StoreStore屏障,StoreLoad屏障,都是确保后一个操作前前一个操作必须完成(指令在中间,分割对应的操作指令,确定前后的一个关系)。(指令级别)

  4、lock前缀指令具备内存屏障功能(load&store)的的CUP指令,执行时锁住子系统来确保执行顺序,甚至跨多个CPU。

  5、JVM中,除了内存屏障,还使用先行发生原则来确保指令的前后关系。如对象锁释放必须先于加锁发生,start先于thread内所有指令执行前发生。

  6、cas操作可以理解为是lock指令(锁着内存)+系统cas指令来实现的。

  1、Redis有哪些数据结构?

  2、使用过Redis分布式锁么,它是什么回事?

  3、如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?

   b、set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的! 如redis的lua脚本

  4、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

    c、在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

  6、使用过Redis做异步队列么,你是怎么用的?

  7、可不可以不用sleep呢?

  8、能不能生产一次消费多次呢?

      a、在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。(消息是即时的,不做存储)

  10、redis如何实现延时队列?

   d、应对的场景就是:并发对数据库更新时,锁表会导致效率低,使用这种延迟操作可以解决这种效率低的问题。

  11、如果有大量的key需要设置同一时间过期,一般需要注意什么?

      a、如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。

   b、一般需要在时间上加一个随机值,使得过期时间分散一些。(过期时间=固定时间+随机值)

  12、Redis如何做持久化的?

   b、因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。    

   c、 在redis实例重启时,会使用bgsave持久化文件重新构建内存,再使用aof重放近期的操作指令来实现完整恢复重启之前的状态。

   13、如果突然机器掉电会怎样?

   b、但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。

  14、bgsave的原理是什么?

   b、子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

   b、使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。

  16、Redis的同步机制了解么?

   c、加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程

  17、是否使用过Redis集群,集群的原理是什么?

50、动态代理有几种,Jdk与Cglib区别

   1、实现方式:

    a、jdk通过反射机制生成一个实现代理接口(参数中interfaces里所有接口且继承了Proxy的代理类)的匿名类,在调用具体方法前调用invokeHandler的invoke处理

      a.2、生成一个实现了参数中interfaces里所有接口且继承了Proxy的代理类的字节码,然后用参数中的classloader加载这个代理类。

      a.4、返回这个代理类的实例。

    b、cglib利用ASM开源包,直接修改代理类class的字节码生成子类来重写其方法。

   2、目标类的限制:

    a、jdk只能正对实现了接口的类

    b、cglib针对有误实现接口的都行

    c、cglib不能重写final类或方法

   3、性能:jdk是越来越快

    1、Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能

    1、字段不可以再分:也就是说一个列名下的值只能是一种类型,如号码中既有手机号、座机号等都不行

  保证字段的原子性,也是关系型数据库的标准(面向对象)

  2、有主键,非主键字段依赖主键(有一个主题):一个主键代表一条记录,只能有一个主题;也就是说一条记录中不能即存在学生的记录信息也存在课程的主题信息

  3、非主键字段不能相互依赖(都是平级的):每列都与主键有直接关系,不存在传递依赖。

52、左连接和右连接说一下,内连接呢

  1、左连接:使用left join on,匹配时匹配表中没能匹配上的也显示,驱动表中只显示匹配的上的

  2、右连接:使用right join on,效果和左连接相反

  3、内链接:使用(inner) join on ,匹配表和驱动表都只显示匹配的上的。

  4、优化:都需要优化驱动表

  5、性能:左右关联比内关联要好一点。

53、数据库索引有几种

    1、指数据库事务正确执行的四个基本要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)    

    2、数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程序的要求。

    3、查询数据库支持的引擎:show engines

55、若hashcode方法永远返回1会产生什么结果

  1、首先、编程时就坚持修改了equals就要修改hashchode要求

  2、hashcode在对象的对比和一些集合类中会被用到,如hashmap

  3、hashcode的存在也是一种优化程序的体现,如hashmap中的桶,如果所有的hashcode相同,那hashcode会构成一个线性表,导致性能降级

  PS:为什么选择31做乘数     

    1、不大不小:为了避免hash重复需要选择一个大一点的质数做乘数,否则就会导致hash值重复的较多,100以上的数乘下来容易超过int的范围。

      2.表示一个由程序员导致的错误 

      3.应该在应用程序级被处理

      1.总是不可控制的(unchecked)

      2.经常用来用于表示系统错误或低层资源的错误

      3.如何可能的话,应该在系统级被捕捉

57、引用计数法与GC Root可达性分析法区别

  1、引用计数:类似给对象添加一个计数器,当对象被引用的时候就在自己的计数器上加一,当某个引用的对象被回收后。引用为零的对象就会被回收

    优点:简单、高效

    缺点:相互引用不能被识别(a.instance=c,b.instance=a,这两项都不再被使用,但却无法回收)

  2、可达性分析:从根开始遍历他的引用,当某个对象到根不可达时则对象该引用可以回收

    根节点:方法区的常量、静态变量

        虚拟机栈区的变量列表的引用

        本地方法栈中的引用

        本地方法栈中引用的对象

    1、五大分区:

      a、程序计数器:记录当前执行程序的位置,改变计数器的值来确定执行下一条指令,如循环、分支、方法跳转    

      b、虚拟机栈:每个线程都会创建一个虚拟机栈,通过压栈出栈的方式执行方法调用。分局部变量表、操作数栈、动态链接、方法出口等。

      c、本地方法栈:native方法

      d、堆:存放对象实例

      e、方法区:用于存放已被虚拟机加载的类信息,常量,静态变量等数据。

      f、直接内存:并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域。

    2、各区域的使用

58、双亲委派机制说一下

  1、某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

  2、全盘责任委托:一个类如果被某个类加载器加载,那么除非指定别的加载器,否则这个类关联的类也有这个类加载器加载。

  3、由下向上询问是否加载,由上向下尝试加载。

  4、线程上下文加载器:针对java的spi情况,也就是引导类加载的类型需要使用二方包的情况,如jdk

59、算法题:找出一个数组中第100个小的数字(堆思想解决)  

60、看你项目用到策略模式和工厂模式,说一下区别

  1、比喻:去必胜客吃披萨,工厂模式关注的是最终能吃到披萨,策略模式关注在关注的是披萨是如何做的。

      工厂是创建型模型,他的作用是创建对象

      策略是行为型模型,他的作用是让一个对象在许多行为中选择一种行为。

    b、关注点不同

      一个关注对象的创建

      一个关注行为的封装

    c、解决不同的问题

      工厂模式,它接受指令,创建出符合要求的实例。它主要解决的是资源的统一分配,将对象的创建独立出来,让对象的创建和具体的使用客户无关。

      策略模式,它为了解决策略的切换与扩展,让策略模式的变化独立于使用策略模式的用户。

    d、工厂相当于黑盒子,策略相当于白盒子

    1、 设计模式有三种类型:创建型(解决:对象的创建和具体的使用解耦),行为型(描述了对象和类的模式,以及它们之间的通信模式)

  ,组合型(解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定的功能的目的)。

    2、项目中:缓存的使用,定义一个公用的缓存操作页面,在缓存工厂中通过配置缓存类别获取具体的缓存实现,redis,tair

 4、工厂模式有三种:简单工厂,工厂方法,抽象工厂。

    a、简单工厂(静态工厂):将类的实例化转交一个工厂,具体的行为由子类决定(即如何构造该实例);解决的问题:怎么构造一个对象有工厂内部决定,如是否设置某个属性等,用于隐藏实现细节。如计算器,获取单例等

    b、工厂方法:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。不同的对象使用不同的工厂

    c、抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。解决的问题:切换数据库

  5、策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户

   定义:一个模板结构,将具体内容延迟到子类去实现。

    1、将复用性高的代码抽取到抽象父类中,具体的操作在继承的子类中定义。

    2、父类调用子类操作,子类扩展不同的行为,这样即实现了控制反转也符合开闭原则。

62、开闭原则懂吗,说一下

1、设计模式中提到的一个概念。

2、目的指导我们如何建立一个稳定的、灵活的系统。

3、开闭原则的定义是:软件中的对象(类、模块、函数等)应该对于扩展是开放的,但是,对于修改是封闭的。(可以新增、尽可能少的修改)

63、NIO说一下你的理解

  1、NIO也就是非阻塞IO,相对于BIO而言,当然也有AIO

  2、打个比喻水工接水的比方:BIO就是多个多个水笼统,每个水龙头都有一个接水工,每个接水工只有接到水才才会做后续处理;NIO是为每个水龙头添加了一个水缸且只有一个水工负责查看接到水刚,当某个水缸接满水,水工就先处理这个水缸的后续处理。

  3、这个水缸就缓冲区buffer,水工就是选择器Select,水工就看查看某个水龙头时就等于连接了通道channel。

  4、具体的实现时,所有的通道都注册到选择器中,选择器轮循查看通道中的数据是否准备就绪,而读出和写入都是直接到了缓冲区。

  5、这个地方提供了一个新的概念:直接缓冲区,绕过内核地址空间(系统空间),直接将数据的物理地址映射到用户地址空间(JVM)。

  ps:之前的数据拷贝都是先写到物理内存,然后再拷贝到jvm中。

  1、AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减。

  2、其中存储的value使用了volatile修饰,操作时使用cas无锁算法。

    1、具体实现就是使用Unsafe。

    2、它有如下功能:内存管理(分配、释放内存),非常规的对象实例化(无需调用构造器),操作类、对象、变量(指针偏移获取),数组操作(指针偏移),多线程同步(对象锁机制,cas操作),线程挂起与恢复,内存屏障(loadFence、storeFence、fullFence)

65、CAS机制是什么?有什么缺点,会出现什么问题?

CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B,若预期值A和内存值V相同就把内存值修改成新值B

在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。

2.不能保证代码块的原子性

CAS机制所保证的只是一个变量的原子性操作,而不能保证整个代码块的原子性。比如需要保证3个变量共同进行原子性的更新,就不得不使用Synchronized了。

这是CAS机制最大的问题所在。

  什么是ABA问题?

 引用原书的话:如果在算法中的节点可以被循环使用,那么在使用“比较并交换”指令就可能出现这种问题,在CAS操作中将判断“V的值是否仍然为A?”,并且如果是的话就继续执行更新操作,在某些算法中,如果V的值首先由A变为B,再由B变为A,那么CAS将会操作成功。

多CPU的情况下的cas操作是CPU提供的支持。

1、这和volatile的底层实现是相同的

2、底层:这个读取、对比以及设置的操作私用lock前缀保证唯一性。

66、本地缓存过期策略怎么设置,一致性怎么保证?

  一、一致性(如下是主动的情况)

    1、当数据时效性要求比较高时,需要保证缓存与数据库保存一致,而且需要保证缓存节点和副本中的数据也要保存一致,不能出现差异现象。

    2、这就比较依赖缓存过期和更新策略,一般会在数据发生更改时,主动更新缓存中的数据或者移除对应的缓存。

    3、一般的缓存使用

    方案一(先更新缓存,再更新数据库):      

      1、是不可用的      

      2、首先库存是以数据库为准的,如果缓存更新完成但数据库未更新完成且库存少于缓存则会造成负库存。

      3、若缓存更新成功,数据库更新失败则缓存一直都是脏数据。

    方案二(新更新数据库,再更新缓存)

      1、不可取

      2、如果两个线程并发执行,会存在A更新数据库,B更新数据库,B更新缓存,A更新缓存(网络原因),则数据库中的就是脏数据。

      3、针对那种依赖前值计算后更新的场景,无疑是浪费性能。

    方案三(先删除缓存,再更新数据库:更新数据库失败对业务也没什么影响)

      1、待优化

      2、存在A删除了缓存,B发现缓存不存在从数据库查询到旧值写到了缓存,A将新值写入到数据库:此时缓存和数据库不一致。

      3、可以采用延时双删策略:先淘汰缓存,再写入数据库,休眠1秒,再次淘汰缓存。此时可以确保上述B的写入被删除。(休眠是为了确保读请求结束,写请求可以删除对请求造成的脏数据)

      4、第二次删除可以采用新线程来做以避免降低吞吐。

      5、第二次删除失败了的解决方案详见方案四

    方案四(先更新数据库,再删除缓存)

      1、待优化

      2、缓存刚好失效,A查询数据库得到旧值,b将新值写入数据库并删除缓存,A将旧值写入缓存(若b的写入数据库操作要足够端以至于B删除缓存早于A写入缓存发生:概率低)

      3、2的解决方案:异步延时删除, 缓存设置有效时间

      4、针对缓存更新失败的解决方案:

      删除失败后,将删除key的消息发送到消息队列,重试删除直到成功(这对业务代码有侵入)

        使用mysql的中间件如Canal,单启一个独立的程序去处理。

    1、缓存过期策略大致分两种:可以通过过期时间来控制内容过期的情况和无法通过过期时间来控制内容过期的情况。

    2、可以通过过期时间来控制内容过期的情况

        a、设置滑动过期(针对时效性不强的):在读取缓存的时候将该缓存项的过期时间在当前时间的基础上延后指定长度的事件。(如文章有评论就延长过期时间的情况)

    1、缓存满了,从缓存中移除数据的策略

      a、新进先出算法

      b、最久未使用算法

      c、最少使用算法

    2、缓存并发问题

      a、缓存过期后将尝试从后端数据库获取数据,当数据获取到更新完成这段会有多个线程到数据库后去数据,对数据库造成极大的冲击,甚至导致血崩。

      b、此时就要加锁,到后台数据库请求数据要先尝试获取锁,未获取锁的线程只能等待。

      c、针对缓存过期也要选择一个范围内随机过期,不能全部集中到某个时间段。

    3、缓存穿透(不存在的key,缓存不起作用)

      a、查询一个不存在的数据,由于缓存是不被命中被动写的(如果没有就查数据库),并且出于容错考虑,如果存储层查不到数据就不写入缓存,这将导致每次都要查询存储层查询,失去了缓存的意义。在流量大的时候,可能db就挂掉了。

      b、缓存空对象,过期时间段,不超过五分钟。

      c、单独过滤处理:将对应数据为空的key进行统一存放

       d、布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉

    4、缓存颠簸:缓存节点故障导致,使用hash算法解决

      a、缓存采用了相同的过期时间,导致缓存再同一时刻同时失效,DB瞬间压力过大崩溃。

      b、在缓存失效的基础上添加1-5分钟的随机值

      c、从应用架构角度,我们可以通过限流、降级、熔断等手段来降低影响,也可以通过多级缓存来避免这种灾难

    6、缓存击穿(一个存在的key,在缓存过期的一刻,同时有大量的请求)

      a、使用互斥锁:使用setnx设置值,成功消息返回的才去查询数据库(成功后设置有效期)

    7、缓存无底洞现象

      a、目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来满足“高性能、高并发、高可用、可扩展”等要求

      b、命中:可以直接通过缓存获取到需要的数据。

  三、cache的使用

我要回帖

更多关于 通达信校验文件失败 的文章

 

随机推荐