自我介绍+项目
1、自我介绍
面试官你好,我叫念靖渊,来自西安邮电大学大数据与人工智能实验室,目前在计算机学院读大三;
我是从大二上的时候加入了我们学校的实验室,也就是从那个时候开始学习编程的,然后在大二上的时候学习了 Java语言,然后紧接着在寒假期间学习了 MySQL,到了大二下的时候,开始了对 JavaWeb 的一个学习,然后陆续学习了后续 Java 框架的使用,然后在暑假和大三上的时候,和同学一起合作做了一个项目,这个项目是一个美食类的社交APP,其实就相当于是一个美食类的”微博“,我主要负责了其中的好友功能以及用户签到以及Feed流和大额代金券的抢购这四个功能;然后在大三上剩余时间对JDK的部分源码进行了阅读,像 HashMap的源码,concurrentHashMap的源码都有过阅读,然后学习了一些MySQL的一些知识,像日志系统,还有事务机制都有一定了解;
目前的话,就是说,掌握的最好的是Java并发编程, 对HashMap的源码,concurrentHashMap的源码都有过阅读,对Java并发包下的部分源码也有了解,像 CAS、线程池;其次对MySQL的索引、日志系统、事务机制、还有TCP和HTTP相关的一些知识都比较熟悉,对简历上写的剩余部分都有一个大概的了解;
以上就是我过往的学习经历和现在对知识点的一个掌握情况
2、美食APP项目
1、用户签到
这个功能的话,涉及到了对于用户签到信息的存储,一起统计一个月内用户的连续签到天数和一个月内用户的签到天数
存储的话,其实在我第一次写的时候,是采用 MySQL 对用户的签到信息进行存储,但是我在学了 Redis 之后,使用 Bitmap 对签到信息进行了存储
字段名 | 描述 |
---|---|
id | 数据表主键(AUTO_INCREMENT) |
fk_diner_id | 用户ID |
sign_date | 签到日期(如2010-11-11) |
amount | 连续签到天数(如2) |
为什么要用 BitMap 对签到信息进行存储呢?
使用 MySQL 存储的话,单表是有4个字段,分别是 id、用户id、签到日期和连续签到天数,单行数据的长度在接近50个字节左右,这是一个人签到一日天的数据,那么一个人假设他连续签到一个月,那么签到信息总共接近1500字节;
但是我们使用 Redis 的 Bitmap 的话,一个人一个月的签到信息最多只有31个比特,算下来是不到4个字节,对于存储空间的节约还是很大的
设计思路上其实并不难,但是在代码的编写上遇到了一个困难,我没有办法去统计连续签到天数,因为把用户的签到数据从位图中取出来,这个数据是由二进制转换成10进制的一个非常大的数据,非常难以计算
后来的解决方案是:
这里采用位运算来统计来连续签到次数
先右移一位,然后左移一位,如果等于自己,表示未签到;如果不等表示签到了
算完一位后,右移把这一位丢弃了,然后计算下一位,写了一个for循环来实现的对连续签到天数的计算
其实就是取低位连续不为0的个数即为连续签到次数
2、积分功能
这个功能主要是两个点:一个是添加积分,根据我们之前的签到信息来送积分;另外一个是积分排行榜
利用 MySQL 来对积分记录进行存储,表结构的设计:
CREATE TABLE `t_diner_points` (
`id` int(11) NOT NULL AUTO_INCREMENT , //主键id
`fk_diner_id` int(11) NULL DEFAULT NULL , //用户id
`points` int(11) NULL DEFAULT NULL , //积分数
`is_valid` int(11) NULL DEFAULT NULL , //逻辑删除字段
`create_date` datetime NULL DEFAULT NULL ,
`update_date` datetime NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci
AUTO_INCREMENT=1
ROW_FORMAT=COMPACT;
根据我们之前统计的连续签到次数去添加积分;
积分排行榜
使用 MySQL 来进行实现,需要写复杂的 SQL 语句,获取排行榜前20