说说mysql?
MySQL是一个关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
AQS、阻塞队列?
AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
AQS是自旋锁:在等待唤醒的时候,经常会使用自旋(while(!cas()))的方式,不停地尝试获取锁,直到被其他线程获取成功
阻塞队列?
当阻塞队列为空时,从队列中获取元素的操作将会被阻塞,就好比餐馆休息区没人了,此时不能接纳新的顾客了。换句话,肚子为空的时候也没东西吃。
当阻塞队列满了,往队列添加元素的操作将会被阻塞,好比餐馆的休息区也挤满了,后来的顾客只能走了。
JUC常用工具类?
countDownLatch(相当于减法计数器,就是指一个线程必须等待一些线程执行完以后,才能够往下执行)
cyclibarrier(相当于加法计数器,就是指一个线程必须等待足够多的线程一起到达执行语句时,才能通过,否则线程会自己调用awai方法,等待线程足够多时将被唤醒)
semaphore(计数控制器)用于限制访问某些资源的线程数,有acquire获取许可和release释放线程两个方法
线程安全的类
- ConcurrentHashMap
- CountDownLatch、CyclicBarrier
- Semaphore
- BlockingQueue
- ThreadPoolExecutor
- ReentrantLock、ReentrantReadWriteLock
- CompletableFuture
线程池七大参数?
核心线程数、最大线程数、最大空闲时间、时间单位、任务队列、线程工厂、拒绝策略
mysql的索引有使用过吗?
- 普通索引:一个索引只包含一个列,一个表可以有多个单列索引。
- 唯一索引:索引列的值必须唯一,但允许有空值
- 复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
- 聚簇索引:也称为主键索引,是一种数据存储方式。B+Tree结构,非叶子节点包含健值和指针,叶子节点包含索引列和行数据。一张表只能有一个聚簇索引。
- 非聚簇索引:不是聚簇索引,就是非聚簇索引。叶子节点只是存索引列和主键id。如果sql还要返回除了索引列的其他字段信息,需要回表,第一次索引一般是顺序IO,回表的操作属于随机IO。回表的次数越多,性能越差。此时我们推荐
覆盖索引
怎么知道索引如何生效?
explain函数验证索引是否有效
explain显示了MySQL如何使用索引来处理select语句以及连接表。他可以帮助选择更好的索引和写出更优化的查询语句
有什么参数?
select_type:表示 SELECT 的类型。
table:输出结果集的表。
possible_keys:表示查询时,可能使用的索引。
key:表示实际使用的索引。
key_len:索引字段的长度。
rows:扫描行的数量。
Extra:执行情况的说明和描述。
等
JVM包含哪些东西?
JVM包含两个子系统和和两个组件,
两个子系统为类装载(Class Loader)和执行引擎(Execution engine);
两个组件为运行时数据区(Runtime data area),本地接口(Native Interface)。
类装载(Class Loader):根据给定的全限定名类名(如:java.lang.Object)来装载class 文件到 运行时数据区(Runtime data area )中的方法区(method area)
执行引擎(Execution engine):执行classes 中的指令。
本地接口(Native Interface) :与native libraries 交互,是其他编程语言交互的接口。
运行时数区域(Runtime data arae):这就是我们常说的JVM 内存
强引用和弱引用?
当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题
在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。
举例说Object的方法?wait
知道其他可以让线程等待的方法吗?
HashMap底层原理?扩容机制?默认参数?负载因子?
内部由数组和链表组成,非线程安全。JDK1.7和1.8的主要区别在于头插和尾插方式的修改,头插容易导致HashMap链表死循环,并且1.8之后加入红黑树
对性能有提升。
- put插入:key 计算hash值,取模,找到数组位置,如果数组中没有元素直接存入,反之,则判断key是否相同,key相同就覆盖,否则就会插入到链表的尾部。如果链表的⻓度超过8且数据总量超过64,则会转换成
红黑树
。最后判断元素个数是否超过默认的⻓度(16)*负载因子(0.75),也就是12,超过则进行扩容。 - get查询:计算出hash值,然后去数组查询,是红黑树就去红黑树查,链表就遍历链表查询就可以了。
IOC?
IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦
IOC也叫依赖注入(DI)
所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
AOP动态代理?
面向切面编程
AOP中的代理说是由AOP框架动态生成的一个对象,该对象可以作为目标对象使用。Spring 中的AOP有两种,JDK动态代理,CGLIB代理
JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现AOP。
CGLIB(Code Generation Library)是一个高性能开源的代码生成包,它采用字节码技术,对指定的目标类生成一个子类,并对子类进行增强。
在Spring的核心包中已经集成了CGLIB所需的包,所以开发中不需要导包。
redis常用数据类型?
- String:缓存、计数器、分布式锁等
- List:链表、队列、微博关注人时间轴列表等
- Hash:用户信息、Hash 表等
- Set:去重、赞、踩、共同好友等
- Zset:访问量排行榜、点击量排行榜等
三种特殊的数据类型:Bitmap
、HyperLogLog
、Geospatial
,其中Bitmap 、HyperLogLog的底层都是 String 数据类型,Geospatial 底层是 Sorted Set 数据类型。
redis的持久化机制有哪些?
1、快照RDB。将某个时间点上的数据库状态保存到RDB文件
中,RDB文件是一个压缩的二进制文件,保存在磁盘上。当Redis崩溃时,可用于恢复数据。通过SAVE
或BGSAVE
来生成RDB文件。
- SAVE:会阻塞redis进程,直到RDB文件创建完毕,在进程阻塞期间,redis不能处理任何命令请求。
- BGSAVE:会fork出一个子进程,然后由子进程去负责生成RDB文件,父进程还可以继续处理命令请求,不会阻塞进程。
2、只追加文件AOF。以日志的形式记录每个写操作(非读操作)。当不同节点同步数据时,读取日志文件的内容将写指令从前到后执行一次,即可完成数据恢复。
有技术一点的部分呢和功能?
bean的生命周期?
redis作为缓存是怎么使用的?
Redis是后端的缓存,主要对MySQL的数据作缓存(MySQL查询效率远不及Redis)
对于多查询、少修改的数据(热点数据),则可以将其存入Redis中作为缓存。
如果接触新的东西是怎么学习的?
反问