1.缓存穿透,缓存雪崩,缓存击穿解决方案分析

1)缓存穿透就是比如拿Redis数据库来说,它是一个键值对,有可能用户查询某个数据的时候没有查到这个key,就跑到数据库中去查了,我们设置缓存的目的就是为了不让请求去数据库中查,但是穿透呢,没查到key会自动去数据库中去查了。这种透过缓存去数据库中查就叫缓存穿透。一般我们把那些空的也存到缓存中,这样就不会穿透缓存了,一般发生的也不是特别多。

2)缓存雪崩就是在高并发的情况下,因为在缓存中有缓存的时间,同一时间下有好多数据失效了,这样在高并发访问量比较大的时候呢,同时又去数据库查,这样数据库的压力就很大,有可能就挂掉了,这就是缓存雪崩。一般我们给实效时间设置点随机数,不让它一起失效。

3)缓存击穿就是指某一个数据失效的话,这个数据访问的也比较多,比如说淘宝在0点的时候某个数据实效了,这个时候又有很多用户提前预购了,在0点的时候去抢它,这个时候就会造成击穿的效果。一般这种击穿很难处理,因为你也不知道这个数据会不会用到,所以我也不是太清楚怎么处理。

2.缓存数据和数据库数据一致性问题

1)用MQ模式的消息队列,保证串行。

2)或者用Id先查询数据,保证每次操作数据是同一个,然后再设置队列。如果分布式的话就再加个服务Id,保证同一个服务。

3.设计模式

Java中有23种设计模式,常见的设计模式有:

1)单列模式

一句话总结:一个类在Java虚拟机中只有一个对象,并提供全局访问点。

生活中例子:太阳,月亮,国家主席等。

解决什么问题:对象的唯一性,性能浪费太多。

项目里面怎么用:数据库连接对象,属性配置文件的读取对象。

模式结构:分为懒汉模式和饿汉模式(如果考虑性能问题的话,就使用懒汉模式,因为懒汉模式是在方法里面进行初始化的,构造器私有化,对外提供方法加同步关键字)。

框架里面的使用:Struts1的Action。

Jdk里面使用:java.lang.Runtime#getRuntimejava.awt.Desktop#getDesktop。

懒汉模式:就是说比较懒,在用到它的时候它才去创建对象(懒汉模式线程不安全,懒汉加载慢,但是在内存作用域短,节省空间)。

/** 懒汉模式* 懒汉线程不安全* 懒汉加载慢,但是在内存作用域短,节省空间*/
public class SingletonA {//SinglettonA的唯一实例private static SingletonA instance = null;//将构造函数私有,防止外界构造SingletonA实例private SingletonA() {}//获取SingletonA的唯一实例,用synchronized关键字保证某一时刻只有一个线程调用此方法public static synchronized SingletonA getInstance(){//如果instance为空,便创建一个新的SingletonA实例,否则,返回已有的实例if(instance == null){instance = new SingletonA();}return instance;}public void print(){System.out.println("我是懒汉模式!");}public static void main(String[] args) {SingletonA s1 = SingletonA.getInstance();SingletonA s2 = SingletonA.getInstance();System.out.println(s1 == s2);}
}

饿汉模式:就是说比较饿,在用到它的时候它早早的就加载完对象了(饿汉模式线程安全,饿汉加载快,但是在内存中作用域长,不节省空间)。

/** 饿汉模式* 饿汉线程安全* 饿汉加载块,但是在内存中作用域长, 不节省空间*/
public class SingletonB {//SingletonB的唯一实例private static SingletonB instance = new SingletonB();//将构造函数私有,防止外界构造SingletonB实例private SingletonB() {}//获取SingletonB的实例public static SingletonB getInstance() {return instance;}public void print() {System.out.println("我是饿汉模式");}public static void main(String[] args) {SingletonB s1 = SingletonB.getInstance();SingletonB s2 = SingletonB.getInstance();System.out.println(s1 == s2);}}

2)Factory(简单的工厂模式)

一句话总结:用一个方法来代替new关键字。

生活中的例子:制衣厂,面包厂等生产厂。

解决什么问题:对象产生过多,或者经常有子类替换生成。

项目里面怎么用:对于经常生成的对象,或者父子类替换的对象。

模式结构:写一个对外声明的方法,方法里面使用new关键字代替。

框架里面使用:Spring的核心就是工厂模式。

Jdk里面使用:newInstance。

工厂模式代码:

public class UserFactory {public static User createUser(int i){//如果输入的是1,就创建它的子类,否则就创建父类if(i == 1){return new Alices();}return new User();}
}

3)Proxy(代理模式)

一句话总结:为其他对象提供一个代理,以控制对当前对象的访问。

生活中的例子:房屋中介,婚姻介绍所。

解决什么问题:不能直接访问该对象,或者太大的资源耗费多。

项目里面怎么用:权限,或者大对象的访问权限。

模式结构:代理类和被代理类实现同一个接口,用户访问的时候先访问代理对象,然后让代理对象去访问被代理对象。

框架里面使用:Spring里面的AOP实现。

Jdk里面使用:java.lang.reflect.Proxy。

代理模式代码:

创建一个接口:

public interface SellHouse {  void sell(double money);
}  

创建一个被代理类:

public class Hoster implements SellHouse {  @Override  public void sell(double money) {  System.out.println("祝你居住愉快");  }
}  

创建一个代理类:

public class Medium implements SellHouse {  SellHouse hoster=new Hoster();  @Override  public void sell(double money) {  if(money>=1000){  hoster.sell(money);  }else{  System.out.println("你的价格太低了");  }  }
}  

创建一个测试类:

public class Renter {  public static void main(String[] args) {  SellHouse renter=new Medium();  renter.sell(500);  }
}  

转载于:https://www.cnblogs.com/chuanqi1995/p/10107369.html

Java面试总结(2018 - 12 - 10)相关推荐

  1. java 面试宝典2018

    Java面试宝典2018版 一. Java基础部分 7 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2.Java有没有goto? 7 3.说说 ...

  2. 2018.12.10:中断三个月的python学习又接上了

    2018.12.10:中断三个月的python学习又接上了 记录最近的烦心事.开心事和一般事 烦心事 小奶猫老跟我吵,本来每天挺开心的,一会去跟她聊天就搞得我动怒 英语四级马上考试,但是不想学,心里又 ...

  3. Java面试宝典2018版

    1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java&qu ...

  4. Java面试总结(2018)

    1. 请讲讲冒泡排序 .快速排序这两种排序的原理 冒泡排序原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素 ...

  5. 【一周头条盘点】中国软件网(2018.12.10~2018.12.14)

    每一个企业级应用的人都置顶了中国软件网 中国软件网为你带来最新鲜的行业干货 一周热点 青云QingCloud容器管理平台KubeSphere开启公测 近日,企业级全栈云ICT服务商青云QingClou ...

  6. JAVA面试汇总(2021.10)

    Java基础 1.JAVA中有哪些基本类型 类型名称 字节空间 取值范围 整数型 byte 1 -2的7次方到2的7次方-1 short 2 -2的15次方到2的15次方-1 int 4 -2的31次 ...

  7. JAVA面试考点解析(12) -- 算法

    94.用Java写一个冒泡排序. 答:冒泡排序几乎是个程序员都写得出来,但是面试的时候如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码: import java.util.Comp ...

  8. 《惢客创业日记》2018.12.10(周一)创业者从0到1的十个阶段(一)

    今天早晨,四点就起来了.虽然昨天晚上11点半才躺在床上,但是,就是睡不着.因为,这十几天拜访的人有点儿多,来自各方的观点把我的思绪彻底打乱了.如果创业的道路有一个带有刻度的时间线或者进度台阶,那就太好 ...

  9. 2018.12.10 第5题:定义两个类,描述如下: [必做题] 5.1定义一个人类Person: 5.1.1定义一个方法sayHello(),可以向对方发出问候语“hello,my name is

    #定义两个类,描述如下: [必做题] 5.1定义一个人类Person: 5.1.1定义一个方法sayHello(),可以向对方发出问候语"hello,my name is XXX" ...

最新文章

  1. 【AI2】app inventor2离线开发环境百度网盘下载链接,安卓app图形化开发环境
  2. CV:利用cv2自带两步法haarcascade_frontalface_default.xml、_smile.xml实现对人脸、笑脸同时检测
  3. Java必会的基础知识(3)
  4. 超级计算机预测南方下雪,今冬南方就不下雪了?超级计算机:可能性确实在减小,但还要观察...
  5. python中使用pickle进行序列化
  6. 商城计价中心 - 从容应对复杂场景价格计算
  7. Linux常用命令——chattr、lsattr
  8. Fedora32升级Fedora33后无线网络无法连接的问题
  9. 拒绝空谈 AI 设想!手把手教你构建实时、高可用的 AI 调度平台
  10. Java头文件找出循环依赖_Node.js 如何找出循环依赖的文件?如何解决循环依赖问题?...
  11. Linux 命令行提示符路径显示
  12. (附源码)Flutter Demo
  13. vue项目中报常见错误
  14. 废旧手机变身服务器,打造私人云盘
  15. 【网络流量识别技术之初级入门篇】
  16. python wxpython菜鸟教程_wxpython新手向教程
  17. 风袖使用RocketMQ实现订单状态转变
  18. Android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能
  19. Homework5_ch4 类和对象(3)
  20. matlab潮流计算求节点自导纳,matlab潮流计算.docx

热门文章

  1. MYSQL专题-绝对实用的MYSQL优化总结
  2. 计算机网络按信号频带占用方式分为,《计算机网络及组网技术》第2阶段测试题....
  3. db2 修改表空间自增长_db2表空间及日志文件调整
  4. 一款功能齐全的网管软件:Ip-tools
  5. devc 无法编译循环语句_鸡生蛋还是蛋生鸡?详解第一个编译器是怎么来的~
  6. 开发运维效率提升 80%,计算成本下降 50%,分众传媒的 Serverless 实践
  7. 从单体到混乱的微服务,阿里云托管式服务网格是如何诞生的?
  8. matlab用lism求零输入响应,信号与系统matlab课后作业_北京交通大学讲解.docx
  9. dump文件分析工具_使用这个 Python 工具分析你的 Web 服务器日志文件 | Linux 中国...
  10. mybatis 无法初始化类_从零开始手写 mybatis(一)MVP 版本