1. MyISAM与InnoDB关于锁方面的区别是什么
MyISAM默认用的是表级锁,不支持行级锁
InnoDB默认用的是行级锁,也支持表级锁
MyISAM:
200万条数据进行select *,然后新建一个session进行update,发现也卡住了,所以MyISAM用的是表锁
共享锁:
lock tables 表明 read;加读锁
unlock tables;解锁
排他锁:
更新语句自动有写锁,select
上了共享锁就不能再上排他锁
上了排他锁也不能上共享锁
InnoDB:
需要加 lock in share mode才能加共享锁,默认select是没有锁的(需要先关闭自动提交,然后打开两个session,一个select但是不commit,一个update)
对id为3的加共享锁,对id为4的数据更新仍然成功,所以是行级锁
不走索引的话,就是表级锁了
排他 和 排他 冲突
排他 和 共享 冲突
共享 和 排他 冲突
共享 和 共享 兼容
行级锁,所得粒度越高,代价越大
MyISAM适合
频繁执行全表count语句
增删改频率不高
没有事务
Redis
从海量Key里查询出某一固定前缀的key
Keys pattern:查找所有符合给定模式pattern的key
keys k1*
找出k1开头的key,数量过大会卡顿
SCAN cursor [MATCH pattern][COUNT count]
基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
以0为游标开始一次新的迭代,直到命令返回游标0完成一次遍历
不保证每次执行都返回某个给定数量的元素,支持模糊查询
一次返回的数量不可控,只能是大概率符合count参数
scan 0 match k1* count 10
返回游标和部分数据


***Redis实现分布式锁
互斥性、安全性(只能被自己删除)、死锁、容错(宕机也能释放锁)
setnx key value
成功为1,不成功为0,时间复杂度O(1)
setnx长期有效的问题
Expire key seconds
增加锁持有时间
(setex不存在则创建,存在则覆盖,返回的都是ok,无法判断锁是否存在,而且时间只能为秒setex key seconds value
)
set key value [EX seconds][PX milliseconds] [NX|XX]
EX seconds:过期时间为秒
PX millisecond:过期时间为毫秒
NX:键不存在时才对键进行设置操作
XX:键存在时,才对键进行设置操作
SET操作成功完成时,返回OK,否则返回nil
java中通过"OK".equals()判断是否加锁成功
大量的key同时过期的注意事项
集中过期,由于清除大量的key很耗时,会短暂出现卡顿现象
解决方案:
在设置key的过期时间的时候,给每个key加上随机值,使过期值分散
实现异步队列
使用List作为队列,rpush添加消息,lpop消费消息
缺点:没有等待队列里面有值就直接消费
弥补:可以通过在应用层引入Sleep机制去调用lpop重试
不想通过sleep:
BLPOP key[key ...] timeout:阻塞直到队列有消息或者超时
blpop testlist 30
缺点:只能供一个消费者消费

一个生产者多个消费者消费:
pub/sub:主题订阅者模式
发送者pub发送消息,订阅者sub接收消息
订阅者可以订阅任意数量的主题

subscribe myTopic 订阅频道
subscribe anotherTopic 订阅另一个频道
publish myTopic "Hello" 发布消息

但是消息的发布无状态,无法保证可达,下线之后再上线就接收不到这个消息了
解决这个问题就要专业的消息队列,如kafka解决
Java的IO机制
BIO、NIO、AIO
Block-IO:InputStream、OutputStream,Reader和Writer
NonBlock-IO:构建多路复用的、同步非阻塞的IO操作
Channels(FileChannel、DatagramChannel、SocketChannel、ServerSockerChannel 包含了udp和tcp通道)、Buffer、Selecter(聊天服务器用到)

Select源码中用到DefaultSelectorProvider去创建一个SelectorProvider实例,调用的是底层操作系统
到openJDK的DefaultSelectorProvider下查看源码,

使用了底层操作系统的多路复用
IO多路复用,调用系统级别的select\poll\epoll

底层是数组、链表、。。。


Asynchronous IO:基于事件和回调机制
AIO进一步加工结果

BIO:

使用线程池

NIO:

AIO:


BIO:
NIO:数目多,连接短
AIO:连接数目多,连接长(相册服务器 java1.7)
spring
你了解Spring IOC么
IOC控制反转
Spring Core最核心的部分
需要先了解依赖注入(DI)
注入方式:
setter
Interface
Constructor
Annotation
BeanDefinition
主要用来描述Bean的定义
BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法
BeanDefinitionRegistry类中有registerBeanDefinition方法,将BeanDefinition注册到BeanFactory的实现类DefaultListableBeanFactory
DefaultListableBeanFactory

BeanDefinitionMap是一个HashMap,涌来放BeanDefinition

key是BeanName,BeanName也有单独的ArrayList存储,以便后续Bean的实例化
BeanFactory
Spring框架最核心的接口
提供IOC的配置机制
包含Bean的各种定义,便于实例化Bean
建立Bean之间的依赖关系
Bean生命周期控制

ListableBeanFactory
定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数,是否包含等
HierarchicalBeanFactory
父子级联IOC容器接口,可以通过于此访问父容器阿Bean(业务层和持久层Bean在父容器中,展示层Bean在子容器中)
ConfigurableBeanFactory
增强IOC容器可定制性,装载了类装载器,属性遍历器,属性初始化后置处理器。
AutoWireCapableBeanFactory
定义容器按某种规则,名字、类型,对Bean进行装配
SingletonBeanFactory
允许在运行期间向容器注册SingletonBean的实例方法
BeanFactory
一堆getBean方法,按类型,按名称、
ApplicationContext
是BeanFactory的子接口,增强了BeanFactory

功能(继承多个接口)


Spring Boot的默认启动类(Spring.run)就是加载了AnnotationConfigServletWebServerApplicationContext
网友评论