title: 网易云一面凉经
网易不按照套路出牌,我面经没写完,感觉没啥必要。
1、怎么在Java层面把redis 的数据持久化。
首先刚开始没听清,以为说的是redis的持久化方式。所以答了RDB快照 和AOF日志。
RDB快照是在某一个时间点,保存当前数据库所有的数据,形成一个副本。接着把这个副本传给从服务器。从服务器将所有的数据请空,导入该副本。所以即使服务器死机,也只是会失去最近一次保存快照之后的数据。缺点是如果数据太多,保存快照的时间会比较长。
AOF日志,是每次将写命令写入文件尾部。但是需要设置同步方式,因为一开始是写在缓存的,需要同步到硬盘上。有三种同步策略
- always:每次写命令,都同步一次
- everysec: 每一秒同步一次
- no:操作系统觉得
综上其实第二种好一点
我的回答其实是牛头不对马嘴,这题应该从Java层面来回答。所以正确的回答是,我们可以用Java获取redis的数据,并且在数据库种创建相应的表,将数据写入数据库中。
2、写入的时间点应该怎么选择。怎么控制定时操作。
这一题结合了实际情况来问,同时引到了网易云如果一个歌单的点赞数和点击数是用redis来保存的话,该什么时候持久化。
可以设置定时任务,每分钟或者每小时,同步一次持久化。
定时任务的设置可以分两类
第一部分是Java基础中的
- 利用线程while(true)并且设置sleep时间来实现定时
- 利用timer和timetask来时间,启动和取消可以控制,而且可以设置第一次启动的delay时间
- 利用schedulexecutorService定时线程池来控制。可以控制第一次线程的delay时间,
第二部分是spring中的
- TimeTask
- Quartz两种触发器simple 周期任务
- crontriggerBean 指定时间运行
3、死锁的四种条件,从Java层面分析,如果要避免死锁,应该从哪一个条件入手
其实应该从环形等待入手的。
解决方案是给每个资源分配序号,所有的线程去获取资源的时候,必须从序号小的开始获取,这样就可以避免死锁
- 互斥 破坏的话就允许多个线程访问同一资源,比如打印机,其实只能单一线程使用。所以不合理
- 请求和保持条件 在线程开始执行前就给线程分配所有资源。这样线程就不需要去请求资源。
- 不可剥夺条件