1.意向锁是什么?有什么作用?它是表级锁还是行级锁?
意向锁是什么
在使用 InnoDB 引擎的表里时对某些记录加上「共享锁」之前,需要先在表级别加上一个「意向共享锁」
在使用 InnoDB 引擎的表里时对某些记录加上「独占锁」之前,需要先在表级别加上一个「意向独占锁」
也就是,当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。
意向锁的作用
意向共享锁和意向独占锁是表级锁,不会和行级的共享锁和独占锁发生冲突,而且意向锁之间也不会发生冲突,只会和共享表锁(lock tables ... read)和独占表锁(lock tables ... write)发生冲突。
表锁和行锁是满足读读共享、读写互斥、写写互斥的。
作用:为了快速判断表里是否有记录被加锁
如果没有「意向锁」,那么加「独占表锁」时,就需要遍历表里所有记录,查看是否有记录存在独占锁,这样效率会很慢。
那么有了「意向锁」,由于在对记录加独占锁前,先会加上表级别的意向独占锁,那么在加「独占表锁」时,直接查该表是否有意向独占锁,如果有就意味着表里已经有记录被加了独占锁,这样就不用去遍历表里的记录。
意向锁是表级锁还是行级锁?
表级别锁有以下几种
表锁
元数据锁(MDL)
意向锁
AUTO-INC锁
所以意向锁是表级别锁
其他
普通的 select 是不会加行级锁的,普通的 select 语句是利用 MVCC 实现一致性读,是无锁的。
不过,select 也是可以对记录加共享锁和独占锁的,具体方式如下:
//先在表上加上意向共享锁,然后对读取的记录加共享锁 select ... lock in share mode; //先表上加上意向独占锁,然后对读取的记录加独占锁 select ... for update;
2. Spring、SpringMVC、SpringBoot 三者之间是什么关系?
Spring、SpringMVC、SpringBoot 是三个独立的框架,它们之间的关系是:
Spring 是一个 Java 的轻量级应用框架,提供了基于 IoC 和 AOP 的支持,用于构建企业级应用。Spring 有多个模块,包括 Spring Core、Spring Context、Spring JDBC、Spring Web 等,每个模块提供了不同的功能。
SpringMVC 是 Spring 框架的一部分,是基于 MVC 设计模式的 Web 框架,用于构建 Web 应用程序。它提供了控制器、视图解析器、数据绑定、异常处理等功能,使得开发 Web 应用变得更加简单。SpringMVC 还支持 RESTful 架构。
SpringBoot 是基于 Spring 框架的一个开发框架,用于快速构建独立的、生产级别的 Spring 应用程序。它通过自动配置和约定优于配置的方式,简化了 Spring 应用程序的配置和开发过程。SpringBoot 集成了很多常用的第三方库和工具,例如 Spring Data、Spring Security、Thymeleaf、Logback 等,可以极大地提高开发效率。
因此,SpringBoot 可以看作是在 Spring 的基础上,通过自动配置和约定优于配置的方式,提供了更加简单、快速的开发体验。而 SpringMVC 则是 Spring 框架中用于构建 Web 应用程序的模块。
3. Redis 基础类型中的 String 底层实现是什么?
Redis中的任意数据类型的键和值都会被封装成一个RedisObject,即Redis对象。会在Redis对象中主要由三个字段:当前数据结构的类型、编码方式和指向实际数据的指针。
String类型,首先会在Redis对象中指明他的类型为OBJ_STRING。
String类型有三种编码方式:
1、其最基本的编码方式是
RAW编码
,基于简单动态字符串SDS来实现,存储上限为512mb。他就是在内存中申请一个SDS,然后让Redis对象的指针指向SDS即可。2、当要存储的SDS的长度小于44字节,就会使用
EMBSTR编码
,此时Redis对象的头部和SDS是在一个连续的内存空间中,申请内存的时候只需要一次分配,效率更高。为什么是44个字节呢?因为Redis对象数据结构中其头部有16个字节。然后SDS中头部3个字节,尾巴结束字符一个字节,加在一起共20个字节,20个字节加上44个字节就是64个字节,因为redis内存分配会以2的n次方进行分配,64个字节不会产生内存碎片。3、如果要存储的字符串是一个整数,且大小不超过8位二进制能表示的范围。就采用
int的编码
方式,直接让redis对象的指针位设置为这个整数