技术串讲 CAS 有用

CAS,全称为Compare and Swap,即比较-替换。假设有三个操做数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才会将内存值修改成B并返回true,不然什么都不作并返回false。固然CAS必定要volatile变量配合,这样才能保证每次拿到的变量是主内存中最新的那个值,不然旧的预期值A对某条线程来讲,永远是一个不会变的值A,只要某次CAS操做失败,永远都不可能成功。html

 

 

1.项目多大,分为多少个系统,项目几我的作的,大概作了多长时间mysql

答:项目分为先后台:nginx

前台:门户、商品搜索、商品详情、购物车、用户中心、单点登陆、订单系统、支付系统等。web

后台:商家管理系统,运营商管理系统,财务管理系统ajax

后台:商品管理、活动管理、商品推荐、订单管理、CMSCRM、采购管理、WMS、财务管理、统计报表、系统管理、网络管理。redis

项目是10-20人作的(在这个范围里选一个具体值),大概作了6-8个月(选具体值)。算法

2.前台和后台是分开的么?先后台数据是如何交互的。spring

答:先后台分离,数据交互用的是ajaxhttp协议。sql

3.数据库如何与redis同步?缓存须要去更新么?如何删除redis中的数据?其余地方有用到过redis么?数据库

答:redismysql数据的同步,代码级别大体能够这样作: 读: redis->没有,读mysql->mysql数据写回redis : mysql->成功,写redis

应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql,此种状况存在的问题主要是如何保证mysqlredis的数据同步,两者数据同步的关键在于mysql数据库中主键,方案是在redis启动时去mysql读取全部表键值存入redis中,往redis写数据...

他们两个之间没有直接同步的方法,这个依赖于你的架构设计 1,插入时同步,好比先更新了oracle,再更新redis,这个要靠代码逻辑来作。谁先谁后得看设计了。 2,查询时同步,这时你的redis是作缓存来用,那么它的更新依赖于你设定的逻辑

缓存通常不须要更新,若是有内容改变,经过主键来进行覆盖。

redis来生成惟一主键,用redis来存储购物车信息。

4.Redis存储的数据结构有哪些?

答: String类型是redis中默认的类型,对于任何没有指定类型的数据结构,都是string.

list是一种最经常使用的线性存储结构,基于list的各类优化算法也不少,redis使用list来存储一些对插入顺序/排序有要求的数据;同时由于list是一种最轻量级的数据结构,并且当list中数据较少时,其查询复杂度接近o(1),所以对于一些hash结构,数据较少时redis也使用了list来表示它们。

Set经常使用来存储不重复数据的数据结构,底层基于hashtable

sortedset(zset):排序集合,集合中每一个元素都有“权重”。

Hsah

5.前台集群搭了几台服务器,网站的并发量多大?

  网站的并发量在1000之内。

6.后台保存商品的时候图片存储在哪?fastDFS怎么存储?图片服务器宕机如何处理?

答:FastDFS图片服务器,它是用c语言编写的一款开源的分布式文件系统

FastDFS架构包括 Tracker serverStorage server。客户端请求Tracker server进行文件上传、下载,经过Tracker server调度最终由Storage server完成文件上传和下载。

使用nginx搭建集群,若是所有宕机,重启。

7.从服务器如何判断主服务器是否宕机?3

答:为了屏蔽负载均衡服务器的宕机,须要创建一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,经过传送诸如“I am alive”这样的信息来监控对方的运行情况。当备份机不能在必定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

 

8.前台作过静态页面么?Freemark如何生成静态页面?生成模板的命令?

答:作过。

第一步:建立一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号

第二步:设置模板文件所在的路径

第三步:设置模板文件使用的字符集。通常就是utf-8.

第四步:加载一个模板,建立一个模板对象

第五步:建立一个模板使用的数据集,能够是pojo也能够是map。通常是Map

第六步:建立一个Writer对象,通常建立一FileWriter对象,指定生成的文件名。

第七步:调用模板对象的process方法输出文件。

第八步:关闭流。

@Test

public void genFile() throws Exception {

// 第一步:建立一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。

Configuration configuration = new Configuration(Configuration.getVersion());

// 第二步:设置模板文件所在的路径。

configuration.setDirectoryForTemplateLoading(new File("D:/workspaces-itcast/term197/e3-item-web/src/main/webapp/WEB-INF/ftl"));

// 第三步:设置模板文件使用的字符集。通常就是utf-8.

configuration.setDefaultEncoding("utf-8");

// 第四步:加载一个模板,建立一个模板对象。

Template template = configuration.getTemplate("hello.ftl");

// 第五步:建立一个模板使用的数据集,能够是pojo也能够是map。通常是Map。

Map dataModel = new HashMap<>();

//向数据集中添加数据

dataModel.put("hello", "this is my first freemarker test.");

// 第六步:建立一个Writer对象,通常建立一FileWriter对象,指定生成的文件名。

Writer out = new FileWriter(new File("D:/temp/term197/out/hello.html"));

// 第七步:调用模板对象的process方法输出文件。

template.process(dataModel, out);

// 第八步:关闭流。

out.close();

}

9.作集群的时候用的服务器?Nignx如何使用?

答:用的tomcat+nignxNginx的配置文件:/usr/local/nginx/conf/nginx.conf

 

10.SpringAOP的应用场景?Aop原理、好处?SpringIOC的做用?对象建立的过程。

答:AOP适合于那些具备横切逻辑的应用:如性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。

一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法建立方面,从而使得编译器能够在编译期间织入有关方面的代码。

Aop好处:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,经过对这些行为的分离,咱们但愿能够将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

Ioc做用:解耦合,使用对象的时候不用在代码里每次都new一个对象,而是把对象的建立交给spring容器来管理。

建立对象的过程:当在main方法中建立对象时,JVM会先去方法区下找有没有所建立对象的类存在,悠久建立,没有就把该类加载到方法区;在建立类的对象时,首先去堆内存中开辟一块空间,开辟完空间后分配该空间,当空间分配完成后,加载对象中全部的非静态成员

变量到该空间下,全部的非静态变量加载完成后,对全部的非静态变量进行初始化,初始化完成后,调用相应的构造方法到栈中,在栈中执行构造函数时,先执行隐式,再执行构造方法中的代码。

11.Spring常见建立对象的注解?

答:@Component web  @Controller :业务层  @Service:持久层   @Repository

12.什么是存储过程?好处?

答:存储过程能够说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法同样实现一些功能(对单表或多表的增删改查),而后再给这个代码块取一个名字,在用到这个功能的时候调用他就好了。

好处:1.因为数据库执行动做时,是先编译后执行的。然而存储过程是一个编译过的代码块,因此执行效率要比T-SQL语句高。2.一个存储过程在程序在网络中交互时能够替代大堆的T-SQL语句,因此也能下降网络的通讯量,提升通讯速率。3.经过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

13.所作模块有什么功能?

后台管理系统:管理商品、订单、类目、商品规格属性、用户管理以及内容发布等功能。

前台系统:用户能够在前台系统中进行注册、登陆、浏览商品、首页、下单等操做。

会员系统:用户能够在该系统中查询已下的订单、收藏的商品、个人优惠券、团购等信息。

订单系统:提供下单、查询订单、修改订单状态、定时处理订单。

搜索系统:提供商品的搜索功能。

单点登陆系统:为多个系统之间提供用户登陆凭证以及查询登陆用户的信息。

14.所作模块用到多少张表?表与表之间的关系?

15.Shiro如何进行权限控制。

1.经过浏览器访问路径,配置文件查看,是否须要认证等,若是不须要,直接访问controller

2.若是须要认证,经过配置文件的loginUrl跳到这个地址,输入用户名、密码等

3.登陆:1.访问自定义的form表单过滤器FormAuthenticationFilter(本身起的名字和shiro同样了,因此。。)的createToken方法,装配token;若是没有自定义表单过滤器,默认的FormAuthenticationFilter会自动装配表单token2.访问自定义realms的认证方法doGetAuthenticationInfo(),查库(或者缓存),判断用户名和密码是否正确。

4.若是登陆以后访问的url,经过1配置文件里的配置须要权限:调用自定义realms的受权方法doGetAuthorizationInfo(),查库(或者缓存),查出用户权限,判断是否拥有权限,没权访问,跳到响应的refuse配置的路径,有权访问,跳到响应的url

16.activeMQ的做用、原理?几种模式,每种的特色及使用问题?在项目中如何应用?

答:Activemq的做用就是系统之间进行通讯。固然可使用其余方式进行系统间通讯,若是使用Activemq的话能够对系统之间的调用进行解耦,实现系统间的异步通讯。

原理就是生产者生产消息,把消息发送给activemqActivemq接收到消息,而后查看有多少个消费者,而后把消息转发给消费者,此过程当中生产者无需参与。消费者接收到消息后作相应的处理和生产者没有任何关系。

Activemq在项目中主要是完成系统之间通讯,而且将系统之间的调用进行解耦。例如在添加、修改商品信息后,须要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操做。在此场景下就可使用activemq。一旦后台对商品信息进行修改后,就向activemq发送一条消息,而后经过activemq将消息发送给消息的消费端,消费端接收到消息能够进行相应的业务处理。

17.redis为何能够作缓存?项目中使用redis的目的是什么?redis何时使用?

答:1Rediskey-value形式的nosql数据库。能够快速的定位到所查找的key并把其中的value取出来。而且redis的全部的数据都是放到内存中,存取的速度很是快,通常都是用来作缓存使用。2)项目中使用redis通常都是做为缓存来使用的,缓存的目的就是为了减轻数据库的压力提升存取的效率。3)在互联网项目中只要是涉及高并发或者是存在大量读数据的状况下均可以使用redis做为缓存。固然redis提供丰富的数据类型,除了缓存还能够根据实际的业务场景来决定redis的做用。例如使用redis保存用户的购物车信息、生成订单号、访问量计数器、任务队列、排行榜等还可使用redis来生成惟一主键。

18.solr的原理?分词器的原理?

答:Solr是基于Lucene开发的全文检索服务器,而Lucene就是一套实现了全文检索的api,其本质就是一个全文检索的过程。全文检索就是把原始文档根据必定的规则拆分红若干个关键词,而后根据关键词建立索引,当查询时先查询索引找到对应的关键词,并根据关键词找到对应的文档,也就是查询结果,最终把查询结果展现给用户的过程。

IK分析器的分词原理本质上是词典分词。如今内存中初始化一个词典,而后在分词过程当中逐个读取字符,和字典中的字符相匹配,把文档中的全部的词语拆分出来的过程。

19.商品模块用到几张表?表与表之间的关系?

答:

用于存储商品基本信息,商品自定义属性。

 

 

 

 

一种商品可能有多种规格,那么每一种规格就是一个货品。如某某衬衫是一个商品,他可能存在L号及白色和S号白色两种货品。

 

这个表是为了定义多个库房的货品库存状况,其中depotid字段es_depot(库房表)关联。

此表定义了商品的分类。

 

类型和类别不一样类型定义了商品的特性,如手机有“网络制式”、“机身内存”、“屏幕尺寸”等等属性和参数,还要定义其“摩托罗拉”或是“诺基亚”的品牌,属性和参数的字段是propsparams

 

商品的类型品牌表

详细内容请看:https://wenku.baidu.com/view/90f2501a25c52cc58ad6be06.html

 20.秒杀功能可否与正常的商品购买放在同一台服务器上?

答:能够,可是尽可能不要这么作。由于秒杀商品,抢购的用户会比较多,并发量太高容易引发宕机,致使正常购买商品功能也不能正常使用,因此建议放在不一样服务器上。

21.activeMQ若是数据提交不成功怎么办?

答:Activemq有两种通讯方式,点到点形式和发布订阅模式。若是是点到点模式的话,若是消息发送不成功此消息默认会保存到activemq服务端直到有消费者将其消费,因此此时消息是不会丢失的。

若是是发布订阅模式的通讯方式,默认状况下只通知一次,若是接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的状况。若是要求消息必须送达不能够丢失的话,须要配置持久订阅。每一个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时须要配置发送模式为持久化。此时若是客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。

  --------------------- 本文来自 fulai0_0 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/fulai0_0/article/details/52127320?utm_source=copy 

''22.reids在项目中如何使用?做用是什么?

答:redis中存储的都是key-value格式的。拿商品数据来讲,key就是商品idvalue是商品相关信息的json数据。

在商城系统中当并发量比较高,频繁的对数据库进行读操做的时候都须要添加缓存。例如页面中内容数据的缓存、商品数据的缓存以及用户数据的缓存等。

作商品数据的缓存时,由于商品的数据量很大,并且缓存是把数据保存到内存中,此时不可能把全部的商品数据都放到缓存中。因此须要设置商品数据缓存的有效期,当用户访问到非热点数据后,此数据放到缓存中,当缓存到期后就从缓存中删除,并且长时间不会添加到缓存。而热点数据一旦从缓存中删除会立刻又添加到缓存。这样能够提升缓存的利用率,同时也减轻了数据库的压力。

23.redis是内存数据库,若是宕机了,如何解决数据丢失的问题?

答:方案一:redis拥有两种不一样形式的持久化方法,它们均可以用小而紧凑的格式将存储在内存中的数据写入硬盘:第一种持久化方法为时间点转储,转储操做既能够在“指定时间段内有指定数量的写操做执行”这一条件被知足时执行,又能够经过条用两条转储到硬盘中命令中的任何一条来执行;第二种持久化方法将全部修改了数据库的命令都写入一个只追加文件里面,用户能够根据数据的重要程度,将只追加写入设置为从不一样步、每秒同步一次或者每写入一个命令就同步一次。

方案二:使用redis集群。Redis实现了主从复制的特性:执行复制的从服务器会链接上主服务器,接受主服务器发送的整个数据库的初始副本;以后主服务器执行的写命令,都会被发送给全部链接着的从服务器去执行,从而实时地更新从服务器的数据集。由于从服务器包含的数据会不断地进行更新,因此客户端能够向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。

24.单点登陆具体实现了什么功能?

答:去登录页面,提交登录页面,用户名、密码、验证码的校验,错误信息的回显,保存用户到Session,重定向到登录以前的访问页面,Ajax跨域判断用户是否登录

25.商品存入数据库怎么保证数据库数据安全?

答:1)对用户安全管理

用户操做数据库时,必须经过数据库访问的身份认证。删除数据库中的默认用户使用自定义的用户及高强度密码

2)定义视图

为不一样的用户定义不一样的视图,能够限制用户的访问范围。经过视图机制把须要保密的数据对无权存取这些数据的用户隐藏起来,能够对数据库提供必定程度的安全保护。实际应用中常将视图机制与受权机制结合起来使用,首先用视图机制屏蔽一部分保密数据,而后在视图上进一步进行受权。

3)数据加密

数据加密是保护数据在存储和传递过程当中不被窃取或修改的有效手段。bcrypt 加密 在须要加密的数据中加盐

4)数据库按期备份

5)审计追踪机制

审计追踪机制是指系统设置相应的日志记录,特别是对数据更新、删除、修改的记录,以便往后查证。日志记录的内容能够包括操做人员的名称、使用的密码、用户的IP地址、登陆时间、操做内容等。若发现系统的数据遭到破坏,能够根据日志记录追究责任,或者从日志记录中判断密码是否被盗,以便修改密码,从新分配权限,确保系统的安全。

26.第一个是当两个客户同时买一件商品时库存只有一个了,怎么控制?

答:可使用mysql的行锁机制,实现乐观锁,在更新商品以前将商品锁定,其余用户没法读取,当此用户操做完毕后释放锁。当并发量高的状况下,须要使用缓存工具例如redis来管理库存。