招银网络科技7月8日 视频面
面了30分钟
1 自我介绍
2 看你项目用到了redis,介绍一下redis
3 介绍一下redis雪崩,缓存穿透
我说缓存穿透可以用布隆过滤器解决
4 介绍一下布隆过滤器
5 怎么解决数据库和缓存的不一致问题
我说 缓存只做失效,不做更新
失效就是应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
更新就是先把数据存到数据库中,成功后,再让缓存失效。(这个回答是错的)
应该回答:
1、问题描述
在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库,但还没有更新完,另外一个请求来查询数据,发现缓存里没有,就去数据库里查,还是以上面商品库存为例,如果数据库中产品的库存是100,那么查询到的库存是100,然后插入缓存,插入完缓存后,原来那个更新数据库的线程把数据库更新为了99,导致数据库与缓存不一致的情况。
2、解决方案
遇到这种情况,可以用队列的去解决这个问,创建几个队列,如20个,根据商品的ID去做hash值,然后对队列个数取摸,当有数据更新请求时,先把它丢到队列里去,当更新完后在从队列里去除,如果在更新的过程中,遇到以上场景,先去缓存里看下有没有数据,如果没有,可以先去队列里看是否有相同商品ID在做更新,如果有也把查询的请求发送到队列里去,然后同步等待缓存更新完成。
这里有一个优化点,如果发现队列里有一个查询请求了,那么就不要放新的查询操作进去了,用一个while(true)循环去查询缓存,循环个200MS左右,如果缓存里还没有则直接取数据库的旧数据,一般情况下是可以取到的。
6 看你简历熟悉数据库,char和varchar什么区别?(不会)
自己下去查的
区别一,定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。
因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。
区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节。
7 字符串在class文件中是用什么格式存储的?
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。
因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。
区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节。
7 字符串在class文件中是用什么格式存储的?
我说是二进制,面试官说当然是二进制,然后呢?(连着两个不会。。)
8 介绍一下类加载器
9 介绍一下双亲委派模型,优点?
10 有没有排查过内存泄漏,说一下具体步骤
1 确定频繁Full GC现象:通过“虚拟机进程状况工具:jps”找出正在运行的虚拟机进程id,再利用“虚拟机统计信息监视工具:jstat”监视虚拟机各种运行状态信息,发现fullGC频繁,确认内存泄露
2 找出导致频繁Full GC的原因:使用“Java内存影像工具:jmap”生成堆转储快照;使用Java heap分析工具(如MAT),找出内存占用超出预期的嫌疑对象
3.根据情况,分析嫌疑对象和其他对象的引用关系。
4.分析程序的源代码,找出嫌疑对象数量过多的原因。
11算法题 统计字符串出现次数
最后反问 :自己还有什么改进的地方?
多了解整体的开发流程,你redis掌握的还行,但是我们平常做开发,用到的东西是方方面面的,而不是了解几个点就行了,你说你熟悉数据库,char和varchar要熟悉,还有我们做中文编码,对字符串的存储格式要了解。
总体感觉凉了
发现了一个和我相同面试官的楼主,问题相似度太高了,所以说刷面经真的很有必要。。。
#招银网络提前批面试##招银网络##校招##Java工程师##面经#