线程池和threadlocal一起用会有什么问题?
- 内存泄露
- 数据不一致
介绍一下redis
Redis是远程字典服务器,使用ANSIC语言编写的完全开源的键值型数据库,提供了丰富的数据类型,数据保存在内存中,支持事务、持久化、发布订阅、lua脚本等多种特性,提供了主从、哨兵、集群等多种架构
redis单线程模型有什么局限性?
大key删除问题
为什么会产生大key?
一种是体量大,比如说明星的粉丝
一种是累加,比如说汇总统计
Redis怎么设置过期时间,底层是怎么实现的?过期删除策略?
Expire命令或是pexpire命令
定时器+惰性删除+内存回收机制
https的握手过程
基于TSL的握手......
arraylist了解吗,插入过程?
底层实现是动态数组,
末尾插入o1,指定位置插入on,因为要向后移动
array list的哪一步会导致线程不安全
添加删除遍历都会导致
布隆过滤器的底层数据结构
一个位数组+几个哈希函数
redis有哪些限流方式?
- 最简单的就是用redis来计数
- setnx命令来实现
- 基于redis的令牌桶算法
- Redis中的zset可以实现滑动窗口限流
- Lua脚本
Nginx代理的作用
隐藏后端服务器,提高安全性
提供一个统一的入口,便于分发请求
负载均衡。反向代理。安全性。终止SSL。缓存。日志和监控。静态文件服务。
URL重写和重定向。站点分离
Nginx的负载均衡策略有哪些?
- 轮询
- 加权轮询
- 最少链接
- IP哈希
- URL哈希
- 健康检查
- 地理位置
- 自定义
https解析过程
- 建立TCP连接
- TSL握手
- HTTP请求和响应
介绍下了解的存储引擎
- InnoDB
- 支持事务
- 支持外键
- 支持行级锁
- 支持故障恢复
- Myisam
- 不支持事务
- 支持表级锁
- 支持全文索引
- 支持压缩
- Memory
- 存储在内存中快速访问
- Archive
- 支持压缩存储,适合大量数据的归档存储
单例有几种实现方式?
- 懒汉式:需要时才创建
- 饿汉式:类加载时就创建
- 双重检查锁定:优化的懒汉,线程安全
- 枚举:天然线程安全
- 静态内部类
sleep和wait的区别
- 是否会释放锁
- 是否需要等待唤醒
- 是哪个类的方法
线程的生命周期
- 创建
- 就绪
- 运行
- 阻塞
- 等待
- 终止
线程进程的区别
- 进程是操作系统资源分配和调度的基本单位,线程是进程中的执行单元
- 进程有独立的地址空间,多个线程共享同一个进程的地址空间
- 进程创建需要额外分配资源,线程不需要
- 线程切换开销小于进程
- 进程之间的隔离性比线程好
哪些可以作为GC ROOT?
- 被同步锁持有的对象
- 本地方法栈引用的对象
- 虚拟机栈引用的对象
- 方法区类静态变量引用的对象
- 方法区中常量引用的对象
- JNI引用的对象
http常见状态码
200:请求被成功处理
201:成功处理并且创建一个或多个资源
204:成功处理但是没有返回任何内容
301:永久重定向
302:临时重定向
403:拒绝请求
404:请求资源找不到
500:服务端出问题了
502:网关转发给服务器收到错误响应
为什么数据库翻页查询,越往后查询越来越慢?
对于limit,mysql并不是跳过offset条,而是拆线呢offset+n条,放弃offset条,返回n条,所以当limit特别大的时候就会特别慢
优化:
- 如果ID是连续的,直接根据ID分页
- 子查询
- 延迟关联
对于插入和更新操作,如何不用两个语句去分别判断,用一条语句实现存在就更新,不存在插入?
MySQL 在版本 5.7 和更高版本中引入了 ON DUPLICATE KEY UPDATE 语法来处理这种情况。
线程池是如何保证核心线程的存活的?
当一个线程被创建并启动后,它会进入一个无限循环(除非显式地中断或完成),在这个循环中,线程不断地从任务队列中获取任务并执行。
核心线程与非核心线程的区别 对于核心线程而言,这个循环会一直持续下去,直到线程池本身被关闭或者线程被显式地中断。核心线程不会因为任务队列暂时为空而被销毁。
对于非核心线程(也称为临时线程),当没有任务可供执行时,非核心线程会在等待一定的时间(由 keepAliveTime 参数指定)之后自动销毁。
除非 allowCoreThreadTimeOut 被设置为 true,在这种情况下,核心线程也会遵循相同的超时机制。