CAS,全称为Compare and Swap,即比较-替换。假设有三个操作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才会将内存值修改为B并返回true,否则什么都不做并返回false。当然CAS一定要volatile变量配合,这样才能保证每次拿到的变量是主内存中最新的那个值,否则旧的预期值A对某条线程来说,永远是一个不会变的值A,只要某次CAS操作失败,永远都不可能成功。
1.项目多大,分为多少个系统,项目几个人做的,大概做了多长时间
答:项目分为前后台:
前台:门户、商品搜索、商品详情、购物车、用户中心、单点登录、订单系统、支付系统等。
后台:商家管理系统,运营商管理系统,财务管理系统
后台:商品管理、活动管理、商品推荐、订单管理、CMS、CRM、采购管理、WMS、财务管理、统计报表、系统管理、网络管理。
项目是10-20人做的(在这个范围里选一个具体值),大概做了6-8个月(选具体值)。
2.前台和后台是分开的么?前后台数据是如何交互的。
答:前后台分离,数据交互用的是ajax和http协议。
3.数据库如何与redis同步?缓存需要去更新么?如何删除redis中的数据?其他地方有用到过redis么?
答:redis和mysql数据的同步,代码级别大致可以这样做: 读: 读redis->没有,读mysql->把mysql数据写回redis 写: 写mysql->成功,写redis
应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql,此种情况存在的问题主要是如何保证mysql与redis的数据同步,二者数据同步的关键在于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 server和Storage 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+nignx。Nginx的配置文件:/usr/local/nginx/conf/nginx.conf
10.Spring中AOP的应用场景?Aop原理、好处?Spring中IOC的作用?对象创建的过程。
答: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的话可以对系统之间的调用进行解耦,实现系统间的异步通信。
原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。
Activemq在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、修改商品信息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操作。在此场景下就可以使用activemq。一旦后台对商品信息进行修改后,就向activemq发送一条消息,然后通过activemq将消息发送给消息的消费端,消费端接收到消息可以进行相应的业务处理。
17.redis为什么可以做缓存?项目中使用redis的目的是什么?redis什么时候使用?
答:1)Redis是key-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(库房表)关联。
此表定义了商品的分类。
类型和类别不同,类型定义了商品的特性,如手机有“网络制式”、“机身内存”、“屏幕尺寸”等等属性和参数,还要定义其“摩托罗拉”或是“诺基亚”的品牌,属性和参数的字段是props、params。
商品的类型品牌表
详细内容请看:https://wenku.baidu.com/view/90f2501a25c52cc58ad6be06.html
20.秒杀功能能否与正常的商品购买放在同一台服务器上?
答:可以,但是尽量不要这么做。因为秒杀商品,抢购的用户会比较多,并发量过高容易引起宕机,导致正常购买商品功能也不能正常使用,所以建议放在不同服务器上。
21.activeMQ如果数据提交不成功怎么办?
答:Activemq有两种通信方式,点到点形式和发布订阅模式。如果是点到点模式的话,如果消息发送不成功此消息默认会保存到activemq服务端直到有消费者将其消费,所以此时消息是不会丢失的。
如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。
--------------------- 本文来自 fulai0_0 的**** 博客 ,全文地址请点击:https://blog.****.net/fulai0_0/article/details/52127320?utm_source=copy
''22.reids在项目中如何使用?作用是什么?
答:redis中存储的都是key-value格式的。拿商品数据来说,key就是商品id,value是商品相关信息的json数据。
在商城系统中当并发量比较高,频繁的对数据库进行读操作的时候都需要添加缓存。例如页面中内容数据的缓存、商品数据的缓存以及用户数据的缓存等。
做商品数据的缓存时,因为商品的数据量很大,而且缓存是把数据保存到内存中,此时不可能把所有的商品数据都放到缓存中。所以需要设置商品数据缓存的有效期,当用户访问到非热点数据后,此数据放到缓存中,当缓存到期后就从缓存中删除,而且长时间不会添加到缓存。而热点数据一旦从缓存中删除会马上又添加到缓存。这样可以提高缓存的利用率,同时也减轻了数据库的压力。
23.redis是内存数据库,如果宕机了,如何解决数据丢失的问题?
答:方案一:redis拥有两种不同形式的持久化方法,它们都可以用小而紧凑的格式将存储在内存中的数据写入硬盘:第一种持久化方法为时间点转储,转储操作既可以在“指定时间段内有指定数量的写操作执行”这一条件被满足时执行,又可以通过条用两条转储到硬盘中命令中的任何一条来执行;第二种持久化方法将所有修改了数据库的命令都写入一个只追加文件里面,用户可以根据数据的重要程度,将只追加写入设置为从不同步、每秒同步一次或者每写入一个命令就同步一次。
方案二:使用redis集群。Redis实现了主从复制的特性:执行复制的从服务器会连接上主服务器,接受主服务器发送的整个数据库的初始副本;之后主服务器执行的写命令,都会被发送给所有连接着的从服务器去执行,从而实时地更新从服务器的数据集。因为从服务器包含的数据会不断地进行更新,所以客户端可以向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。
24.单点登录具体实现了什么功能?
答:去登陆页面,提交登陆页面,用户名、密码、验证码的校验,错误信息的回显,保存用户到Session中,重定向到登陆之前的访问页面,Ajax跨域判断用户是否登陆
25.商品存入数据库怎么保证数据库数据安全?
答:1)对用户安全管理
用户操作数据库时,必须通过数据库访问的身份认证。删除数据库中的默认用户,使用自定义的用户及高强度密码。
2)定义视图
为不同的用户定义不同的视图,可以限制用户的访问范围。通过视图机制把需要保密的数据对无权存取这些数据的用户隐藏起来,可以对数据库提供一定程度的安全保护。实际应用中常将视图机制与授权机制结合起来使用,首先用视图机制屏蔽一部分保密数据,然后在视图上进一步进行授权。
3)数据加密
数据加密是保护数据在存储和传递过程中不被窃取或修改的有效手段。bcrypt 加密 在需要加密的数据中加盐
4)数据库定期备份
5)审计追踪机制
审计追踪机制是指系统设置相应的日志记录,特别是对数据更新、删除、修改的记录,以便日后查证。日志记录的内容可以包括操作人员的名称、使用的密码、用户的IP地址、登录时间、操作内容等。若发现系统的数据遭到破坏,可以根据日志记录追究责任,或者从日志记录中判断密码是否被盗,以便修改密码,重新分配权限,确保系统的安全。
26.第一个是当两个客户同时买一件商品时库存只有一个了,怎么控制?
答:可以使用mysql的行锁机制,实现乐观锁,在更新商品之前将商品锁定,其他用户无法读取,当此用户操作完毕后释放锁。当并发量高的情况下,需要使用缓存工具例如redis来管理库存。