面试不足之处总结:
1.springmvc的流程
1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2.
DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3.
DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter
。(
附注
:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法
)
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)
。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
HttpMessageConveter
: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换
:对请求消息进行数据转换。如String转换成Integer、Double等
数据根式化
:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证
: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler
执行完成后,向
DispatcherServlet
返回一个ModelAndView对象;
6. 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的
ViewResolver)返回给
DispatcherServlet
;
7.
ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。
2.Spring工作流程描述
Spring Web MVC 处理Http请求的大致过程:
一旦Http请求到来,DispatcherSevlet将负责将请求分发。
DispatcherServlet可以认为是Spring提供的前端控制器,
所有的请求都有经过它来统一分发。
在DispatcherServlet将请求分发给Spring Controller之前,
需要借助于Spring提供的HandlerMapping定位到具体的Controller。
HandlerMapping是这样一种对象,它能够完成客户请求到Controller之间的映射。
在Struts中,这种映射是通过struts-config.xml文件完成的。
其中,Spring为Controller接口提供了若干实现,
例如Spring默认使用的BeanNameUrlHandlerMapping。
还有,SimpleUrlHandlerMapping,CommonsPathMapHandlerMapping。
Spring Controller将处理来自DispatcherServlet的请求。
Spring的Controller类似于struts的Action,
能够接受HttpServletRequest和HttpServletResponse。
Spring为Controller接口提供了若干实现类,
位于org.springframework.web.servlet.mvc包中。
由于Controller需要为并发用户处理上述请求,因此实现Controller接口时,
必须保证线程安全并且可重用。Controller将处理客户请求,
这和Struts Action 扮演的角色是一致的。
一旦Controller处理完客户请求,则返回ModelAndView对象。
给DispatcherServlet前端控制器。
ModelAndView中包含了模型(Model)和视图(View)。
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;
从微观角度考虑,Controller是单个Http请求处理过程中的控制器,
而ModelAndView是Http请求过程中返回的模型和视图。
前端控制器返回的视图可以是视图的逻辑名,或者实现了View接口的对象。
View对象能够渲染客户响应结果。其中,ModelAndView中的模型
能够供渲染View时使用。借助于Map对象能够存储模型。
如果ModelAndView返回的视图只是逻辑名,则需要借助Spring提供的
视图解析器(ViewResoler)在Web应用中查找View对象,
从而将响应结果渲染给客户。
DispatcherServlet将View对象渲染出的结果返回个客户。
3.sql分页
答:1.创建测试环境,(插入100万条数据大概耗时5分钟)。
create database DBTest
use DBTest
--创建测试表
create table pagetest
(
id int identity(1,1) not null,
col01 int null,
col02 nvarchar(50) null,
col03 datetime null
)
--1万记录集
declare @i int
set @i=0
while(@i<10000)
begin
insert into pagetest select cast(floor(rand()*10000) as int),left(newid(),10),getdate()
set @i=@i+1
end
2.几种典型的分页sql,下面例子是每页50条,198*50=9900,取第199页数据。
--写法1,not in/top
select top 50 * from pagetest
where id not in (select top 9900 id from pagetest order by id)
order by id
--写法2,not exists
select top 50 * from pagetest
where not exists
(select 1 from (select top 9900 id from pagetest order by id)a where a.id=pagetest.id)
order by id
--写法3,max/top
select top 50 * from pagetest
where id>(select max(id) from (select top 9900 id from pagetest order by id)a)
order by id
--写法4,row_number()
select top 50 * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber>9900 and rownumber<9951
select * from
(select row_number()over(order by id)rownumber,* from pagetest)a
where rownumber between 9901 and 9950
--写法5,在csdn上一帖子看到的,row_number() 变体,不基于已有字段产生记录序号,先按条件筛选以及排好序,再在结果集上给一常量列用于产生记录序号
select *
from (
select row_number()over(order by tempColumn)rownumber,*
from (select top 9950 tempColumn=0,* from pagetest where 1=1 order by id)a
)b
where rownumber>9900
2.分别在1万,10万(取1990页),100(取19900页)记录集下测试。
测试sql:
declare @begin_date datetime
declare @end_date datetime
select @begin_date = getdate()
<.....YOUR CODE.....>
select @end_date = getdate()
select datediff(ms,@begin_date,@end_date) as '毫秒'
3.购物车怎么判断是否登陆!
答:储存在用户本地终端上的数据
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109(已废弃),最新取代的规范是RFC2965。
Cookie是由服务器端生成,发送给User-Agent(一般是
浏览器
),浏览器会将Cookie的key/value保存到某个目录下的
文本文件
内,下次请求同一网站时就发送该Cookie给
服务器
(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于
JSP
而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。
服
务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。Cookies最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookies的功用。另一个重要应用场合是“购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies,以便在最后付款时提取信息
Cookie是由服务器端生成,发送给客户端,在客户端存储,而session是有服务器端生成,并存储于服务器端,因而session比cookie安全。但是如果什么都放session的话,会拖垮服务器的。
要实现购物车,首先我们用
js
模拟一个商品对象,这里只给出了加入购物车的功能
'use strict';
var
id=
0;
function
getId() {
id++;
return
id;
}
function
Good(name,price,introduce,img,id) {
this.
name=name;
this.
price=price;
this.
introduce=introduce;
this.
id=id;
this.
img=img;
};
Good.
prototype.
show=
function(){
var
str=
'<div class="box"> <a href="" ><img src="'+
this.
img+
'"></a><p>'+
this.
name+
'</p> <a href="javascript:void(0)" id="a'+
this.
id+
'">加入购物车</a> </div>';
$(
'.content').
append(
str);
return this;
};
//加入购物车
Good.
prototype.
add=
function(){
var
that=
this;
$.
ajax({
url:
"action.php",
type:
"POST",
data:{
_name:
that.
name,
_price:
that.
price,
_introduce:
that.
introduce,
_id:
that.
id},
error:
function () {
alert(
"加入购物车失败!");
},
success:
function(data){
var
str=data;
//alert(data);
if(
confirm(data)){
location.
assign(
"car.php");
}
}
});
};
//添加监听
Good.
prototype.
adde=
function () {
var
_id=
"#a"+
this.
id;
var
that=
this;
$(
_id).
click(
function () {
that.
add();
});
};
new
Good
(
"haha"
,
132
,
"hehehehehe"
,
"images/demo.png"
,
getId
()).
show
().
adde
();//new 一个对象
当点击加入购物车是,通过ajax异步交个后台实现。
下面是后台处理action.php文件
<?php
header
(
'content-type:text/html;charset=utf-8'
);
//得到传过来的商品信息
$name
=
$_POST
[
'_name'
];
$id
=
$_POST
[
'_id'
];
$price
=
$_POST
[
'_price'
];
$introduce
=
$_POST
[
'_introduce'
];
//通过cookie来存储。
if
(
isset
(
$_COOKIE
[
'goods'
])){
$arr
=
unserialize
(
$_COOKIE
[
'goods'
]);
//print_r($arr);
//判断是否已经加入购物车
foreach
(
$arr
as
$ar
){
if
(
$ar
[
'id'
]==
$id
){
die
(
"已经加入购物车,是否去结算?"
);
}
}
//通过二维数组来存储
$arrr
=
array
(
'id'
=>
$id
,
'name'
=>
$name
,
'price'
=>
$price
,
'introduce'
=>
$introduce
);
array_push
(
$arr
,
$arrr
);
setcookie
(
"goods"
,
serialize
(
$arr
),
time
()+
3600
);
echo
"加入购物车成功,是否去结算?"
;
}
else
{
$arr
[
0
][
'id'
]=
$id
;
$arr
[
0
][
'name'
]=
$name
;
$arr
[
0
][
'price'
]=
$price
;
$arr
[
0
][
'introduce'
]=
$introduce
;
setcookie
(
"goods"
,
serialize
(
$arr
),
time
()+
3600
);
echo
"加入购物车成功,是否去结算?"
;
}
删除购物车上的商品
delect.php文件
//由于购物车信息不算太重要,提交订单后才涉及服务器后台的处理,所以可以放cookie,当然放session也是可以的
//但是如果放太多东西到session上的话,会浪费服务器资源,带宽等,拖累服务器。
//session 判断登录
setcookie
(
"goods"
,
""
,
time
()-
1
);//也可以用unset(
$_COOKIE
[
'goods'
]
)来销毁
die
(
"<script>
location
.
assign
(
\"
car.php
\"
)</script>"
);
<?php
$id
=@
$_GET
[
'id'
];
if
(
isset
(
$_COOKIE
[
'goods'
])&&
$_COOKIE
[
'goods'
]!=
null
) {
$arr
= @
unserialize
(
$_COOKIE
[
'goods'
]);
}
else die
(
"<script>
location
.
assign
(
\"
car.php
\"
)</script>"
);
for
(
$i
=
0
;
$i
<
sizeof
(
$arr
);
$i
++){
if
(
$arr
[
$i
][
'id'
]===
$id
){
$arr
[
$i
]=
null
; //也可用unset($arr[$i])
break
;
}
}
setcookie
(
"goods"
,
serialize
(
$arr
),
time
()+
3600
);
die
(
"<script>
location
.
assign
(
\"
car.php
\"
)</script>"
);
//清空购物车,可以直接撤销cookie
<?php
header
(
'content-type:text/html;charset=utf-8'
);
session_start
();//要用session必须先用session_start().
//为了方便演示,这里不从数据库读取账号密码
$defult_user
=
"123456"
;
$defule_password
=
"admin"
;
$user
=
$_POST
[
'user'
];
$password
=
$_POST
[
'password'
];
//因为有错误超过五次的用户在半个小时内禁止登录,所以要先检测是否有禁止登录
if
(
isset
(
$S_ESSION
[
'time'
])){
//要控制session的有效时间,好像是要修改服务器的配置文件,这里用另一种方法来实现
if
(
time
()-
$_SESSION
[
'time'
]>
1800
){
session_destroy
();//销毁
}
}
if
(!
isset
(
$_SESSION
[
'login'
])){
$_SESSION
[
'login'
]=
true
;
};
if
(
$_SESSION
[
'login'
]) {
if
(
$user
==
$defult_user
&&
$password
==
$defule_password
) {
if
(
isset
(
$_SESSION
[
'in'
])&&
$_SESSION
[
'in'
]==
true
){//$_SESSION['in']用来判断是否已经登录,防止表单重复提交
die
(
"<script>
alert
(
\"
你已经登陆了
\"
);
location
.
assign
(
\"
shop.html
\"
)</script>"
);
}
else if
(
isset
(
$_SESSION
[
'flag'
])){
unset
(
$_SESSION
[
'flag'
]);
unset
(
$_SESSION
[
'login'
]);
$_SESSION
[
'in'
]=
true
;
}
die
(
"<script>
alert
(
\"
登陆成功
\"
);
location
.
assign
(
\"
shop.html
\"
)</script>"
);
}
else if
(!(
isset
(
$_SESSION
[
'flag'
]))) {
$_SESSION
[
'flag'
] =
1
;
die
(
"<script>
alert
(
\"
密码错误
\"
);
location
.
assign
(
\"
login.html
\"
)</script>"
);
}
else
{
$_SESSION
[
'flag'
]++;
if
(
$_SESSION
[
'flag'
]==
5
){
$_SESSION
[
'login'
]=
false
;
$_SESSION
[
'time'
]=
time
();
}
die
(
"<script>
alert
(
\"
密码错误
\"
);
location
.
assign
(
\"
login.html
\"
)</script>"
);
}
}
else
{
die
(
"<script>
alert
(
\"
你已经连续登陆五次错误,请半小时后登录
\"
);
location
.
assign
(
\"
login.html
\"
)</script>"
);
}
4.属性线程怎么写,方法线程怎么写?
答:start方法和run方法,Runnable类,Thread类(如:Thread类实现了Runnable接口
5.map与list的区别!
用户可以根据元素的整数 索引(在列表中的位置)访问元素,并搜索列表中的元素
map将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值
简单的说就是list只能保存一列表;Map<k,v>能保存2列表
6.redis怎么从缓存,判断你是否登陆!
答:
1. 用户登录首先判断是否在redis缓存中,如果在redis缓存中,直接登录成功;
2. 若用户未在redis缓存,则访问Mysql,判断用户是否存在,如果不存在,则提示用户注册;如果存在,则登录成功;
3. 在mysql存在并登录成功的同时,将改条数据用Redis Hash类型进行缓存,并设置过期时间为30分钟;
4. 设置redis最大内存,若超出内存范围,则使用FIFO方式进行清除。
8.动态sql
1、动态SQL的元素:
if
choose (when, otherwise)
trim (where, set)
foreach
bind
2、if语句:
<select id="findActiveBlogWithTitleLike" resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
这条语句会提供一个可选的文本查找功能。如果你没有传递title,那么所有激活的博客都会被返回。但是如果你传递了title,那么就会查找相近的title(对于敏锐的检索,这中情况下你的参数值需要包含任意的遮掩或通配符)的博客。
假若我们想可选地搜索title 和author呢?首先,要改变语句的名称让它有意义。然后 简单加入另外的一个条件。
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
3、choose(when, otherwise)
有时我们不想应用所有的条件, 相反我们想选择很多情况下的一种。Java 中的switch和语句相似,MyBatis提供choose元素。
我们使用上面的示例,但是现在我们来搜索当title提供时仅有title 条件,当author提 供时仅有author条件。如果二者都没提供,只返回featured blogs。
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
【注:choose语句中的when是只要满足一个条件之后就放弃继续比较了,比较方式同Java中的Switch语句类似。】
4、trim(where, set)
考虑,多个动态查询条件情况:
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
如果这些条件都没有匹配上将会发生什么?这条 SQL 结束时就会成这样:
SELECT * FROM BLOG
WHERE
这会导致查询失败。如果仅仅第二个条件匹配是什么样的?这条 SQL 结束时就会是这 样:
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
这个查询也会失败。这个问题不能简单的用条件来解决,如果你从来没有这样写过,那 么你以后也不会这样来写。
MyBatis 有一个简单的处理,这在 90%的情况下都会有用。而在不能使用的地方,你可 以自定义处理方式。加上一个简单的改变,所有事情都会顺利进行:
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
where 元素知道如果由被包含的标记返回任意内容,就仅仅插入“WHERE” 。而且,如 果以“AND”或“OR”开头的内容,那么就会跳过WHERE不插入。
如果 where 元素没有做出你想要的,你可以使用 trim 元素来自定义。比如,和 where 元素相等的trim元素是:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
prefixOverrides属性采用管道文本分隔符来覆盖, 这里的空白也是重要的。它的结果就是移除在prefixOverrides属性中指定的内容,插入在with属性中的内容。
和动态更新语句相似的解决方案是set。set元素可以被用于动态包含更新的列,而不包含不需更新的。比如:
<update id="updateAuthorIfNecessary">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio}</if>
</set>
where id=#{id}
</update>
这里,set 元素会动态前置 SET 关键字,而且也会消除任意无关的逗号,那也许在应用 条件之后来跟踪定义的值。
如果你对和这相等的trim元素好奇,它看起来就是这样的:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
注意这种情况下我们覆盖一个后缀,而同时也附加前缀。
5、foreach
另外一个动态SQL通用的必要操作是迭代一个集合, 通常是构建在IN条件中的。
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach 元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可 以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素 是很智能的,它不会偶然地附加多余的分隔符。
注意 你可以传递一个 List 实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list” 作为键,而数组实例将会以“array”作为键。
6、bind
bind元素允许你在自定义变量(不用符合OGNL规范),并且应用到上下文中。例如:
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select
7. SQL分页查询
通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用
㊣Repair & Infrastructure & Cook℡ 2017/08/24 16:44:45
1.自我介绍,不在意说的内容,重要表达流畅,逻辑层次清晰!
2.用sql写出,展示第二页的内容。
oracle :
select * from (select *,rownum from table order by culm1) A where A.rownum>10 and A.rownum<20
sql server :
select top 10 * from (
select top 20 * from table1 order by culm1
) order by culm1 desc
mysql
select top 10 * form table where id not in (select top 20 id from table order by id) order by id;
3.用sql写出用订单管理,按照那个字段进行的进行排序的。
4.用sql写出格式化日期。
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
5.如何定义订单编号。
6.数据库中订单管理表以那个字段作为索引!
7.return_url notif_url是自己公司的还是支付宝的!有什么作用
答:现支付宝的通知有两类。
1-服务器通知(支付宝通知我们的服务器),对应的参数为notify_url,支付宝通知使用POST方式
2-页面跳转通知(支付成功后,从支付宝跳转到指定的地址),对应的参数为return_url,支付宝通知使用GET方式 (通知地址不需要像以前一样去账户内设置,而是由客户在支付的时候通过参数传递给我地址。
例如 notify_url=
http://www.xxx.com/notify_alipay.asp
注意:
www.XXX.com是您网站的域名,也可以用ip地址代替。对于服务器通知,ip地址一定是公网的,私有地址(例如10.2.1.1或者 192.168.1.1)支付宝无法通知到客户端)
以下内容来自支付宝官方网站,不过由于地址改变了,导致原帖无法访问,通过快照查找到其内容,特分享一下.
1. 确认您使用的接口是用notify_url还是return_url。
2. notify_url为服务器通知,支付宝可以保证99.9999%的通知到达率,前提是您的网络通畅。
3. return_url为网页重定向通知,是由客户的浏览器触发的一个通知,若客户去网银支付,也会受银行接口影响,由于各种影响因素特别多,所以该种类型的通知支付宝不保证其到达率。
买家付款成功后,会跳到 return_url所在的页面,这个页面可以展示给客户看,这个页面只有付款成功才会跳转,并且只跳转一次..
notify_url: 服务器后台通知,这个页面是支付宝服务器端自动调用这个页面的链接地址,这个页面根据支付宝反馈过来的信息修改网站的定单状态,更新完成后需要返回一个success给支付宝.,不能含有任何其它的字符包括html语言.
流程:买家付完款(trade_status=WAIT_SELLER_SEND_GOODS)--->支付宝通知 notify_url--->如果反馈给支付宝的是success(表示成功,这个状态下不再反馈,如果不是继续通知,一般第一次发送和第二次发送的时间间隔是3分钟)
剩下的过程,卖家发货,买家确认收货,交易成功都是这个流程 。
8.订单信息是如何传递给支付宝的?
每个客户的购物网站上,都有自己的订单流水号,那么可以通过支付宝接口的参数out_trade_no,将客户网站的订单流水号传递给支付宝,以作对账之用。
在支付宝程序中,out_trade_no,一定是变量,不可以是一个定值。 例如,客户网站订单变量是 ,那么在参数设置中out_trade_no = dingdan。
9.签名验证的时候,是验证什么?一个字段,还是多个字段,还是其它?
10.对账功能你了解多少,说一说你所知道的内容!
11.Liunx环境中vi,如何将a替换A
12. Liunx中的日志系统,说出你了解多少!
13.Rrdis是什么?说出你所知到的。
答:Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis的开发工作由VMware主持。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
14.数据库如何提高数据查询!
15.你还有什么需要了解的内容。
1.简述你的项目。
2.画出从订单提交到支付整个流程。
3.说一下怎么实现对账。
4.如果库存仅剩一件商品,现在很多人提交订单,你是怎么处理的。
6.写一下分页的sql。
7.动态sql你知道多少?
8.mybatis你经常用哪些东西!如:update
9.购物车是你直接加入数据库的吗?如果不是,怎么实现!
10.如果订单提交成功,但是支付不成功,你是怎么处理的。
11.购物车你是怎么加入redis里面的。
12.redis数据类型有哪些?
13.你平时通过什么方式学习新技术!你最近看哪些方面的技术!
14.sql的索引
15.你最擅长的是哪些东西,说一说你的见解!
16.多个tomcat怎么保证是同一用户
答:这个一般通过单点登录解决,应该用Session或者Cookie进行验证。nginx有一个属性,进行保证同一个用户。
17.一个订单你提交的时候显示成功支付宝也扣钱了但是你把数据保存到数据库时候失败了。
答:会对账,会退的。如果真的没退,来这也没用,找客服。