1、sentinel熔断
2、hashmap和hashtable区别?
(1)继承的父类不同
HashTable继承Dictionary类,而hashMap继承了AbstractMap类,但是二者都实现了map接口。
(2)线程安全性不同
Hashtable 线程安全,因为它每个方法中都加入了Synchronize。HashMap是线程不安全的。 HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。在hashmap做put操作的时候可能会造成数据丢失。
(3)是否提供contains方法
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。 Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
(4)key和value是否允许null值
Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。
HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
(5)两个遍历方式的内部实现上不同
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式。
(6)hash值不同
哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。
Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算,且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。
(7)内部实现使用的数组初始化和扩容方式不同
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。
HashTable中hash数组默认大小是11,增加的方式是 old X 2+1。
HashMap中hash数组默认大小是16,增加的方式是 old X 2。
3、创建线程方式?
(1)继承Thread类创建线程类。
(2)通过Runable接口创建线程类。
(3)通过Callable和FutureTask创建线程。
(4)通过线程池创建线程。
4、redis分布式锁
缓存击穿是指对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:如果这个key在大量请求同时进来之前正好失效,那么所有对这个key的数据查询都落到db,我们称为缓存击穿。
(1)使用分布式锁,采用redis的KEY过期时间实现 Redis:命令
# set skuid:1:info “OK” NX PX 10000
EX second :设置键的过期时间为 second 秒。
PX millisecond :设置键的过期时间为 millisecond 毫秒。
NX :只在键(key)不存在时,才对键(key)进行设置操作。
XX :只在键(key)已经存在时,才对键(key)进行设置操作。
Redis SET命令用于设置给定key的值,如果key已经存在其他值,SET就会覆盖,且无视类型。
(2)由于redis删除操作缺乏原子性,可以使用lua脚本进行删除,但是由于redis主从切换时,有误删锁的情况,所以不建议使用.
(3)redission框架进行分布式锁的实现,原理和redis的一样,redission给进行了封装,通过调用lock以及unlock方法进行加锁和解锁,使用更简单。不能复用,复用需要重写。
(4)最终我们自定义了一个注解结合AOP+redission框架的方式,把这个分布式锁加以复用,需要用到分布式锁的地方可以直接打注解就可以了。