设计模式之单例模式

什么是单例模式
    单例对象的类必须保证只有一个实例存在。对单例的实现可以分为2大类:懒汉式和饿汉式,他们区别在于:

  • 懒汉式:指全局的单例实例在第一次被使用时构建。
  • 饿汉式:指全局的单例实例在类装载时构建。
        从区别看,日常使用较多的应该是懒汉式的单例,毕竟按需加载才能做到资源的最大化利用。

more >>

linux常用命令

系统信息

arch 显示机器的处理器架构
uname -m 显示机器的处理器架构
uname -r 显示正在使用的版本内核
dmidecode -q 显示硬件系统部件
hdparm -i/dev/hda 罗列一个磁盘的架构特性
hdparm -t/dev/sda 在磁盘上执行测试性读写操作
cat /proc/cupuinfo 显示CPU info的信息
cat /proc/interrupts 显示中断
cat /proc/swaps 显示哪些swap被使用
cat /proc/meminfo 检验内存使用
cat /proc/version 显示内核的版本
cat /proc/net/dev 显示网络适配器及统计
cat /proc/mounts 显示已加载的文件系统
Ispci -tv 罗列PCI设备
Isusb -tv 罗列USB设备
date 显示系统时间
cal 2019 显示2019年的日历表
date 111021002019.00 设置日期和时间 -月日时分年.秒
clock -w 将时间保存到BIOS

more >>

面试题-spring

1.spring五个事务隔离级别和7个事务传播行为
    脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另一个事务也访问这个数据,然后使用了这个数据。
    不可重复读:在一个事务还没有结束时,另一个事务也访问了该同一数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在同一个事务内两次读到的数据是不一样的。
    幻读:第一个事务对一个表中的数据进行修改,这种修改涉及到表中的全部数据行,同时,第二个事务也修改了表中的数据,这种修改是向表中新增一行数据。那么,就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生幻觉一样。
    可参考:https://www.cnblogs.com/ubuntu1/p/8999403.html

more >>

面试题-数据库

1.delete与truncate区别
    truncate是DDL语句(create、drop、alter、truncate),delete是DML语句(insert、update、delete、select);DCL语句(grant、revoke)
    truncate的速度快于delete
    delete数据可以进行rollback进行数据回滚,truncate是永久删除不能回滚
    truncate不会触发表上的delete触发器,而delete会正常触发
    truncate语句不能带where条件意味着只能全部数据删除,而delete可带where条件进行删除
    truncate操作会重置表的高水位线,而delete不会

more >>

面试题-java基础

1.interface与abstract区别
    ①抽象类可以有构造方法,接口不能有构造方法
    ②抽象类可以有普通成员变量,接口没有普通成员变量
    ③抽象类可以包含非抽象的普通方法,接口的所有方法必须都是抽象的
    ④抽象类的抽象方法的访问类型可以是public、protected,接口的方法只能是public类型的(默认为public abstract)
    ⑤抽象类可以包含静态方法,接口不能包含静态方法
    ⑥抽象类与接口中都可以包含静态成员变量,抽象类的静态成员变量的访问类型可以是任意的,但接口定义的变量只能是public abstract final类型
    ⑦一个类可以实现多个接口,但只能继承一个抽象类

more >>

集群/分布式环境下5种共享session处理策略

1.粘性session:将用户锁定到某个服务器上
    优点:简单,不需要对session进行处理
    缺点:缺乏容错性,如果当前访问的服务器发生故障,用户被转移到另一个服务器上时,他的session信息会失效
    使用场景:发生故障对客户产生的影响较小的时候,毕竟服务器故障是小概率事件
    实现方式:nginx在upstream模块配置ip_hash属性即可实现粘性session

more >>

面试题-并发与线程

1.线程有那些状态?
    新建状态:当用new操作符创建一个线程时。此时程序还没有开始运行线程中的代码。
    就绪状态:一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就处于就绪状态。处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。因为在单CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由Java运行时系统的线程调度程序来调度的。
    运行状态:当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法
    阻塞状态:所谓阻塞状态是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进入运行状态。线程运行过程中,可能由于各种原因进入阻塞状态:①线程通过调用sleep方法进入睡眠状态;②线程调用一个在I/O上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;③线程试图得到一个锁,而该锁正被其他线程持有;④线程在等待某个触发条件。
    死亡状态:有两个原因会导致线程死亡:①run方法正常退出而自然死亡;②一个未捕获的异常终止了run方法而使线程猝死;
    等待状态:或者叫条件等待状态,当线程的运行条件不满足时,通过锁的条件等待机制(调用锁对象的wait()或显示锁条件对象的wait()方法)让线程进入等待状态。处于等待状态的线程将不会被CPU执行,除非线程的运行条件得到满足后,其可被其它线程唤醒,进入阻塞状态。调用不带超时的Thread.join()方法也会进入等待状态。
    限时等待状态:是等待状态的一种特例,线程在等待时我们将设定等待时间,如超过了我们设定的时间,等待线程将自动唤醒进入阻塞状态或就绪状态。在调用Thread.sleep()方法、带有超时设定的Object.wait()、带有超时设定的thread.join()方法等,线程会进入限时等待状态。

more >>

面试题-nginx

1.什么是Nginx
    Nginx是一个高性能的HTTP和反向代理服务器,及电子邮件代理服务器,同时也是一个非常高效的反向代理、负载平衡。

more >>

面试题-Redis

1.Redis支持的数据类型
    String字符串、Hash(哈希)、List(列表)、Set(集合)、zset(sorted set:有序集合)
2.什么是Redis持久化
    持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

more >>

数据库读写分离


CREATE USER ‘username‘@’%’ IDENTIFIED BY ‘password’;
username:用户名
%:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
password:用户密码

GRANT REPLICATION SLAVE ON *.* to ‘username‘@’%’;

log-bin=mysql-bin //启用二进制日志 (主数据库必须)
server-id=1 //服务器唯一ID,默认是1,一般取IP最后一段(必须)(不同服务器的server-id应不同)

more >>