Spring

1.Spring事务的传播特性

2.Spring事务管理(详解+实例)

3.mem dump中unreachable objects分析

4.tcp滑动窗口作用

  • 保证tcp的可靠性
  • 保证tcp的流控特性
    AdvertisedWindow接收方能接受的大小,EffectiveWindow发送方还能发送数据的大小

5.请求/响应的步骤

  • 客户端连接到web服务器
  • 发送Http请求
  • 服务器接受请求并返回http响应
  • 释放tcp连接(closed:服务器主动关闭,keep-alive:连接会保留一段时间)
  • 客户端浏览器解析html内容

6.tcp/ip协议的四层模型
应用层,传输层,网络互联层,主机到网络层


image.png
image.png

7.如何设计一个数据库


image.png

8.innodb和myisam区别

myisam 默认表级锁,不支持行级锁

读锁为:共享锁,查询为读锁
写锁为:排他锁,增删改为写锁

相关命令:
手动加读锁:lock tables 表名 read
手动释放锁:unlock tables
对select上排他锁:select * from person_info_myisam for update

innodb 默认行级锁,支持表级锁,支持事务

  • 在查询数据时,若sql不含索引,使用表级锁,否则,使用行级锁,或者get锁(普通非唯一索引)
  • 表级的意向锁,分为:IS(共享读锁),IX(排他写锁)

读锁为:共享锁,查询为读锁
写锁为:排他锁,增删改为写锁

相关命令:
查看事务是否自动提交:show variables like 'autocommit'
关闭自动提交:set autocommit = 0
对select上读锁:select * from person_info_myisam lock in share mode

9.事务隔离级别
命令:
查看当前事务级别:select @@tx_isolation
设置当前session的事务隔离级别(未提交读 脏读):set session transaction isolation level read uncommitted

10.对主键索引或者唯一索引会用Gap锁吗
1.如果where条件全部命中,则不会用Gap锁,只会加记录锁
2.如果where条件部分命中或者全不命中,则会加Gap锁
3.Gap锁会用在非唯一索引或者不走索引的当前读中

11.classloader的种类

  • BootStrapClassLoader :c++编写,加载核心库java.*
  • ExtClassLoader:java编写,加载扩展库javax.*
  • AppClassLoader:java编写,加载程序所在目录
  • 自定义ClassLoader:Java编写,定制化加载

12.解决哈希(HASH)冲突的主要方法
数据结构与算法:hash冲突解决

手写图解

13.elasticsearch原理

反向索引又叫倒排索引,是根据文章内容中的关键字建立索引

建立倒排索引,基于 Lucene 库进行封装,将对搜索引擎的操作都封装成restful的api,同时还考虑了海量数据,实现了分布式,是一个可以存储海量数据的分布式搜索引擎。

14.spring 自动装配发展

  • 模式注解,@component,@since 2.5
  • @Enable模块实现,@EnableServer 参考 @EnableCaching实现,@since 3.1
//1.定义接口
public interface Server {
    /**
     * 启动服务器
     */
    void start();

    /**
     * 关闭服务器
     */
    void stop();

    /**
     * 服务器类型
     */
    enum Type {

        HTTP, // HTTP 服务器
        FTP   // FTP  服务器
    }
}

2.实现上述定义的server接口
@Component // 根据 ImportSelector 的契约,请确保是实现为 Spring 组件
public class FtpServer implements Server {

    @Override
    public void start() {
        System.out.println("FTP 服务器启动中...");
    }

    @Override
    public void stop() {
        System.out.println("FTP 服务器关闭中...");
    }
}

3.实现上述定义的server接口
@Component // 根据 ImportSelector 的契约,请确保是实现为 Spring 组件
public class HttpServer implements Server {

    @Override
    public void start() {
        System.out.println("HTTP 服务器启动中...");
    }

    @Override
    public void stop() {
        System.out.println("HTTP 服务器关闭中...");
    }
}

4.自定义Enable注解,666
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//@Import(ServerImportSelector.class) // 导入 ServerImportSelector
@Import(ServerImportBeanDefinitionRegistrar.class) // 替换 ServerImportSelector
public @interface EnableServer {

    /**
     * 设置服务器类型
     * @return non-null
     */
    Server.Type type();
}

5.类似enablecache的importselector接口实现
public class ServerImportSelector implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        // 读取 EnableServer 中的所有的属性方法,本例中仅有 type() 属性方法
        // 其中 key 为 属性方法的名称,value 为属性方法返回对象
        Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(EnableServer.class.getName());
        // 获取名为"type" 的属相方法,并且强制转化成 Server.Type 类型
        Server.Type type = (Server.Type) annotationAttributes.get("type");
        // 导入的类名称数组
        String[] importClassNames = new String[0];
        switch (type) {
            case HTTP: // 当设置 HTTP 服务器类型时,返回 HttpServer 组件
                importClassNames = new String[]{HttpServer.class.getName()};
                break;
            case FTP: //  当设置 FTP  服务器类型时,返回 FtpServer  组件
                importClassNames = new String[]{FtpServer.class.getName()};
                break;
        }
        return importClassNames;
    }
}

6.注册到 BeanDefinitionRegistry,这里解释一下,如果server接口的实现类(httpserver,ftpserver)没有被定义成bean(例如:没有Component 注解),就需要进行bean的注册
public class ServerImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        // 复用 {@link ServerImportSelector} 实现,避免重复劳动
        ImportSelector importSelector = new ServerImportSelector();
        // 筛选 Class 名称集合
        String[] selectedClassNames = importSelector.selectImports(importingClassMetadata);
        // 创建 Bean 定义
        Stream.of(selectedClassNames)
                .map(BeanDefinitionBuilder::genericBeanDefinition) // 转化为 BeanDefinitionBuilder 对象
                .map(BeanDefinitionBuilder::getBeanDefinition)     // 转化为 BeanDefinition
                .forEach(beanDefinition ->
                        // 注册 BeanDefinition 到 BeanDefinitionRegistry
                        BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition, registry)
                );
    }
}

7.引导类进行测试
@Configuration
@EnableServer(type = Server.Type.HTTP) // 设置 HTTP 服务器
public class EnableServerBootstrap {

    public static void main(String[] args) {
        // 构建 Annotation 配置驱动 Spring 上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 注册 当前引导类(被 @Configuration 标注) 到 Spring 上下文
        context.register(EnableServerBootstrap.class);
        // 启动上下文
        context.refresh();
        // 获取 Server Bean 对象,实际为 HttpServer
        Server server = context.getBean(Server.class);
        // 启动服务器
        server.start();
        // 关闭服务器
        server.stop();
        // 关闭上下文
        context.close();
    }
}

  • 条件装配 @condition @since 4.0
//步骤一:自定义注解
@Target({ElementType.METHOD}) // 只能标注在方法上面
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnSystemPropertyCondition.class)
public @interface ConditionalOnSystemProperty {
    /**
     * @return System 属性名称
     */
    String name();

    /**
     * @return System 属性值
     */
    String value();
}

//步骤二:添加conditional判断
public class OnSystemPropertyCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 获取 ConditionalOnSystemProperty 所有的属性方法值
        MultiValueMap<String, Object> attributes = metadata.getAllAnnotationAttributes(ConditionalOnSystemProperty.class.getName());
        // 获取 ConditionalOnSystemProperty#name() 方法值(单值)
        String propertyName = (String) attributes.getFirst("name");
        // 获取 ConditionalOnSystemProperty#value() 方法值(单值)
        String propertyValue = (String) attributes.getFirst("value");
        // 获取 系统属性值
        String systemPropertyValue = System.getProperty(propertyName);
        // 比较 系统属性值 与 ConditionalOnSystemProperty#value() 方法值 是否相等
        if (Objects.equals(systemPropertyValue, propertyValue)) {
            System.out.printf("系统属性[名称 : %s] 找到匹配值 : %s\n",propertyName,propertyValue);
            return true;
        }
        return false;
    }
}

//步骤三:配置 @Configuration 类
@Configuration
public class ConditionalMessageConfiguration {

    @ConditionalOnSystemProperty(name = "language", value = "Chinese")
    @Bean("message") // Bean 名称 "message" 的中文消息
    public String chineseMessage() {
        return "你好,世界";
    }

    @ConditionalOnSystemProperty(name = "language", value = "English")
    @Bean("message") // Bean 名称 "message" 的英文消息
    public String englishMessage() {
        return "Hello,World";
    }
}

public class ConditionalOnSystemPropertyBootstrap {

    public static void main(String[] args) {
        // 设置 System Property  language = Chinese
        System.setProperty("language", "Chinese");
        // 构建 Annotation 配置驱动 Spring 上下文
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        // 注册 配置Bean ConditionalMessageConfiguration 到 Spring 上下文
        context.register(ConditionalMessageConfiguration.class);
        // 启动上下文
        context.refresh();
        // 获取名称为 "message" Bean 对象
        String message = context.getBean("message", String.class);
        // 输出 message 内容
        System.out.printf("\"message\" Bean 对象 : %s\n", message);
        
        context.close();
    }
}
  • 自动装配

底层装配技术

  • spring模式注解装配
  • spring@Enable模块装配
  • spring条件装配
  • spring工厂加载机制
    - 实现类:SpringFactoriesLoader
    - 配置资源:META-INT/spring.factories

实现方式:
1.激活自动装配@EnableAutoConfiguration
2.实现自动装配xxxAutoConfiguration
3.配置自动装配实现META-INT/spring.factories

15.索引失效场景
例如:一张USER表 有字段属性 name,age 其中name为索引

下面列举几个索引失效的情况

    1. select * from USER where name=‘xzz’ or age=16;

例如这种情况:当语句中带有or的时候 即使有索引也会失效。

  • 2.select * from USER where name like‘%xzz’ ;

例如这种情况:当语句索引 like 带%的时候索引失效(注意:如果上句为 like‘xzz’此时索引是生效的)

  • 3.select * from USER where name=123;(此处只是简单做个例子,实际场景中一般name不会为数字的)
    例如这种情况:如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
  • 4.如果mysql估计使用全表扫描要比使用索引快,则不使用索引(这个不知道咋举例子了 )
  • 5.假如上述将name和age设置为联合索引,一定要注意顺序,mysql联合所以有最左原则,下面以name,age的顺序讲下

(1)select * from USER where name=‘xzz’ and age =11;

(2)select * from USER where age=11 and name=‘xzz’;

例如上诉两种情况:以name,age顺序为联合索引,(1)索引是生效的,(2)索引是失效的

总结起来就5点吧:
1.索引不存储null值
2.不适合键值较少的列(重复数据较多的列)
3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')
4.索引失效的几种情况
5.MySQL主要提供2种方式的索引:B-Tree索引,Hash索引
查看文章 MySQL索引失效的几种情况

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,113评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,644评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,340评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,449评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,445评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,166评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,442评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,105评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,601评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,066评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,161评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,792评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,351评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,352评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,584评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,618评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,916评论 2 344

推荐阅读更多精彩内容