微服务中如若有两个定时任务,时间是一致的怎么样保证只有一个服务在运行呢?
第一步先获取当前服务ip
第二步获取springcloud集群ip信息
最后将当前ip和集群的ip进行对比,如果当前ip是集群中最小的ip则执行定时任务业务,如果不是则return掉。
MyISAM和InnoDB的区别
MySQL默认采用的是MyISAM。
- MyISAM不支持事务,而InnoDB支持。
(InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。) - InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。
- InnoDB支持外键,MyISAM不支持。
- InnoDB的主键范围更大,最大是MyISAM的2倍。
- InnoDB不支持全文索引,而MyISAM支持。(全文索引是指对char、varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。)
- MyISAM支持GIS数据,InnoDB不支持。(即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。)
- 没有where的count()使用MyISAM要比InnoDB快得多。(因为MyISAM内置了一个计数器,count()时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count()时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count()的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。)
hashMap底层实现原理
map.put(k,v) 原理:先将k,v封装到节点对象中,再调用k的hashcode值得出hash值,再通过哈希算法将hash值转为数组下标,下表位置没有元素则放在这个位置,如果有就拿着k和链表上的每个节点进行比较,都为false则添加到末尾否则有一个节点为true则覆盖当前节点值。
map.get(k)原理: 先调用k的hashcode方法得出值,并通过哈希算法得出数组下标再通过这个数组下标快速定位到某个位置,位置无数据返回null,如果有单向链表,则拿着k和单向链表上的每个节点和k进行比较都为false则返回null,其中一个节点返回true则返回这个节点的value值。
Redis中set、setex、setnx区别(也叫分布式锁)
- set(k,v)
将字符串值 value 关联到 key ,如果 key 已经持有其他值, SET 就覆写旧值,与类型无关; - setex = set expire
将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位), 如果 key 已经存在, SETEX 命令将覆写旧值; - setnx = SET if Not eXists
将 key 的值设为 value ,当且仅当 key 不存在,若给定的 key 已经存在,则 SETNX 不做任何动作;
设置成功,返回 1 。设置失败,返回 0 。
spring事务传播行为
- propagation_required : 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
- propagation_supports:支持当前事务,如果当前没有事务,就以非事务方式执行。
- propagation_mandatory:使用当前的事务,如果当前没有事务,就抛出异常。
- propagation_requires_new: 新建事务,如果当前存在事务,把当前事务挂起。
- propagation_not_supported: 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- propagation_never:以非事务方式执行,如果当前存在事务,则抛出异常。
- propagation_nested: 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。
详细验证: