1、实习遇到的问题
连锁餐饮企业客户关系管理系统的设计与实现
对餐饮客户的信息维护
增加删除客户,修改客户信息,查询客户,利用SpringMVC,对浏览器发送的请求,controller层调用service层处理业务,dao层进行数据库操作,最后返回数据给前台页面 springmvc+mysql+navicate+javascript+html+kafka+quartz
按消费金额对用户分级,
每次消费成功时往表里存一条记录,每天零时按规则执行一次用户等级的统计来更新用户表
优化:
在用户每次消费金额变化的时候发送一个事件,自动升级的程序自动去订阅这个事件,异步去计算用户的等级,每两小时更新一次,kafka+quartz 消息队列+分布式定时任务。event producer consumer
quartz定时任务驱动参数存在数据库,优先抢占,任意bean中的方法加注解@Async @scheduled注解作为线程体,quartz有一套表,job_details配置job,trigger配置job什么时候运行,job接口定义一个任务,quartz读取配置信息存到表里,以后读表执行任务。
发送祝福短信等功能,在客户生日纪念日等特殊日期为客户发送祝福短信
查询当天生日的人,
发送邮件的工具类,JavaMailSender createMimeMessage,MimeMessageHelper,setTo,setFrom,setSubject,setText,mailSender.send(helper.getMimeMessage)
根据数据库查询结果使用调度器定时发送祝福邮件,ServletContextListener
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import javax.mail.MessagingException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import com.cc.birthday.Customer;
import com.cc.mail.MailUtils;
public class BirthdayListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
// 当web应用启动开启任务调动---功能在用户的生日当天发送邮件
//开启一个定时器
Timer timer=new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// 为当前的生日的用户发邮件
//1.获得今天过生日的人
//获得今天的日期
SimpleDateFormat format=new SimpleDateFormat("MM-dd");
String currentDate=format.format(new Date());
//根据当前时间从数据库查询今天过生日的人
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
String sql="select * from customer where birthday like ?";
List<Customer> customerList=null;
try {
customerList = qr.query(sql, new BeanListHandler<Customer>(Customer.class),"%"+currentDate);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2.发邮件
if(customerList!=null&&customerList.size()>0){
for(Customer c:customerList){
String emailMsg="亲爱的:"+c.getRealname()+",生日快乐!";
try {
MailUtils.sendMail(c.getEmail(), "happy..birthday", emailMsg);
System.out.println(c.getRealname()+"邮件发送完毕");
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
},new Date(),10*1000);
//实际开发中起始时间是一个固定的时间
//实际开发中间隔时间是1天
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
}
2、项目
标注工具
问题 京沪全线1319km 20亿条动检数据,导入数据库的时候,数据太多所以很慢
geo文件 2 3G,我们把数据进行了分割,我把6500万条数据分为500个文件,每个文件大约11万条数据,将这11万条数据放到ArrayList中,然后批量导入
添加索引,快速查询和检索,普通,主键,唯一,组合索引
社区论坛,
3、自我介绍
1分钟:各位面试官上午好,我叫滕菲,河北保定人,本科毕业于河北工业大学,现就读于北京交通大学,明年6月份研究生毕业,在学校学习期间,我认真学习了专业知识,取得了优异的成绩;积极参与实验室的科研项目,积累了实践经验,熟练掌握了开发工具和开发流程,性格开朗活泼,抗压能力强,喜欢唱歌跑步,羽毛球打得还不错,做事认真负责,担任班级负责人和团支部书记,有组织能力,获得校一等奖学金,优秀团干部等荣誉称号,我的介绍完毕,谢谢!
4、为什么来上海
比较喜欢上海这座城市,将来想在上海发展,研究生本来想去上海交通大学,对这座城市有特殊的感情
5、技术上根据你的项目会问些场景实现
6.redis的数据会丢失吗
Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。 众所周知Redis 的持久化机制有两种,第一种是快照RDB,将redis在内存的数据库中的数据定时转存到硬盘上,先将数据集写入到临时文件中,写入成功后,再替换之前的文件,再用二进制压缩存储。那么此操作是一种间隔存储的,类似一种快照形式;实现rdb持久化,第二种是 AOF 日志,将redis的操作日志以追加的形式写入到文件中。会对每一次操作的命令进行一个记录,那么在redis服务进行一个启动的时候,会读取日志中的命令,对redis中的数据进行一个恢复。
7、微服务的好处
将大型应用程序细分为多个小的独立功能。每个功能都由一个小型,高度专注的团队提供支持,该团队负责其服务,并确保他们为该服务选择适当的技术,流程和工具。帮助团队更加高效、更快和轻松的部署、错误和故障隔离、可扩展性
8、两个栈排序
解题思路:
循环遍历要排序的栈,第一次遍历时直接把数据放入栈2中,在下次遍历时,比较栈1出栈的数据与栈2数据的大小,如果栈2数据大于要压入的数时,进行出栈压入栈1中,直到数据比要压入数小,同时记录栈2出栈次数j,然后压入数据,再把压入栈1的数据重新压回到栈2中。
public static Stack<Integer> sortBy2Stack(Stack<Integer> stack){
int size=stack.size();
Stack<Integer> tempStack=new Stack();//结果栈
int temp;
int j=0;
while(stack.size()>0){
temp=stack.pop();
if(tempStack.size()!=0){//判断结果栈是否为空
while (tempStack.size()>0&&tempStack.peek()>temp){
stack.push(tempStack.pop());
j++;//记录出栈次数
}
tempStack.push(temp);
while(j>0){
tempStack.push(stack.pop());
j--;//根据出栈次数重新压栈
}
}else{
tempStack.push(temp);
}
}
return tempStack;
}