MySQL

作者: isuntong | 来源:发表于2020-02-18 21:30 被阅读0次

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

相关文章

网友评论

      本文标题:MySQL

      本文链接:https://www.haomeiwen.com/subject/amfnfhtx.html