1、用户在线时长怎么设计
传统方法:记录用户登录时间、退出时间,然后相减,但是用户如果非正常退出,长时间挂机怎么办?
方法一:引入心跳机制(探活,可以利用socket+调度器来定时发送信息进行实现)如果大于k分钟没有回应,则认为该用户下线
方法二:(小规模)利用数据库去记录用户的最后一次操作的时间,然后利用调度器(timer,xxl-job)去扫描数据库中,所有用户的最后操作时间是否大于k分钟,大于则判定下线。注意用户下线要删掉数据库信息,上线则加入数据库,每次操作都只更新最后操作时间。(该表保存了所有在线的用户信息)
方法三:(大规模)利用redis去记录操作时间,功能与方法一类似,但是我们采用的是zset类型,value保存用户操作的时间戳
2、如何排查死锁
(1)jps:获取进程id
(2) jstack 进程id: 可以查看到线程获取锁的情况,可以给线程命名更好的查找
3、如何排查内存泄露
内存泄露是指程序中不在需要的内存未能被释放,导致内存使用量不断增加,最终可能耗尽所有可用的内存
常见的内存泄露原因:
(1)未释放的资源:如网络连接,io流未关闭
(2)缓存未清理:长期未使用的缓存数据未能及时清理,如ThreadLocal
(3) 静态集合类:Map,List保存了大量的对象引用
(4)循环引用:如果垃圾回收机制不完善,导致该引用不会被清理
追踪方案:
(1)启动时添加参数,发生内存溢出时自动生成dump文件(堆转存文件),然后使用MAT分析dump(堆转存文件),可以看线程的引用链
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpath=./dump.hprof
(2)top: Linux查看各个进行的资源占用情况(-p 进程id:只显示指定的id内容,-H 在进程中显示线程的详细信息 )
(3)jamp:可以打印java共享对象内存和堆内存的使用细节(jamp -heap 进程id:看该进程堆内存的使用)
(4) jconsole监控工具观察jvm的内存使用和GC的活动
4、服务器上的慢SQL怎么查?
方法一:
(1)启用慢查询日志:
slow_query_log=on ;
slow_query_log_file=/var/lib/mysql/slow.log;
log_query_time =3 #秒,阈值
(2)查看日志:show variables like '%slow_query_log'
方法二:
(1)使用mysql提供的工具mysqldumpsow进行分析
(2)例如按查询时间排序并显示前10条最慢的sql:
mysqldumpslow -s t -t 10 /var/lib/mysql/slow.log
(3)参数:-s,表示排序 ;t :查询时间,与前面s参数合用表示按时间排序; -t:类似top n,上面-t 10就是说取前10条
5、如何限流
(1)漏桶算法
(2)令牌桶
(3)滑动窗口
(4)计数器
(5)sentinel: 【1】直接(默认):统计当前资源的请求,到达阈值则直接限流;【2】关联:统计与当前资源相关的另外一个资源,到达阈值时,则对当前资源限流(例如读接口关联写接口,当写接口到达阈值,对读限流);【3】链路,统计从指定链路访问到本资源的请求,到达阈值,对指定链路限流(有普通用户和vip用户都需要访问一个接口,因此可以把接口链路普通用户,对普通用户访问接口限流)
6、MYSQL中LBCC以及MVCC的区别
举个例子:当事务A开始查询数据库,假设查询出1条数据,此时事务A还没有结束,事务B开始插入(或修改)1条数据,然后事务又开始查询数据库,这样就会查询出2条数据==》产生了脏读(读了未提交的数据)、不可重复读(两次读取数据不一样)、甚至是幻读(查的时候没有,插入的时候又有了)
因此
(1)LBCC:基于锁的并发控制,当一个事务去读取数据的时候,就上锁不允许其他事务操作,当读多写少时,这种就无法解决并发问题,能解决幻读
(2)MVCC:多版本可控制,首先有三个隐藏字段:row_id(没有主键就充当主键)、trx_id储存当前数据的事务id、roll_ptr回滚指针;每个事务只能查询小于当前事务id的数据,不能解决幻读
7、Nacos配置动态刷新为什么使用长轮询机制
首先了解2种更新:(1)服务端连接客户端,服务端推送配置==》长时间连接,消耗内存,需要判断连接是否短开(利用心跳,占用服务端资源)(2)客户端连接服务端,客户端拉取配置===》缺少时效性,因为客户端不会时刻连接服务端,如果用时间间隔如30s拉取一次,30s时间长了,更新不及时,时间短了,资源浪费。
Nacos的长轮询机制:
客户端向服务端进行长连接的请求(例如30s,超过30s就进入超时状态),如果服务端收到请求,则判断配置是否有更新,有则返回,没有则服务端线程就挂起(不消化资源),等待29.5s,如果29.5s内有更新则提前结束并返回,并进行下一次长连接,如果29.5s内没有跟新,则最后0.5s进行检测配置文件,无论有没有更新都正常返回,为什么留0.5s?因为如果是第30s配置更新,但是连接要超时了,因此留0.5s作为配置更新期

被折叠的 条评论
为什么被折叠?



