为什么用Dubbo+zeekeeper?介绍一下?
 
 
生产者和消费者是怎么交互的?。
    dubbo首先向zookeerper暴露端口,消费者向它们这边订阅服务通过zookeerper,消费者发送请求,zookeerper用来调度,调度的方式有(三种),轮循,随机,把这些请求都拿给生产者,如果其中一个生产者挂掉,如果有新的生产者,会把请求分发给新的生产者。
 
  
Duboo 通信方式采用长链接方式,所以当spring启动后链接就接通,duboo的消费者和生产直接调用,性能上高于其他http协议
 
 
3、Dubbo 和 Spring Cloud 有什么区别?
 
Dubbo 使用的是 RPC 通信
而 Spring Cloud 使用的是 HTTP RESTFul 方式。
 
 
 
 
 
Mysql
 
连接查询 
分类 内连接 外连接 自然连接 交叉连接
内连接 查询两表数据 然后字段比较
外连接  查询 左外连接 或者右外连接
 
 
InnoDB:
* 提供了具有提交、回滚、崩溃恢复能力的事务安全,但是会占用更多空间用以保存数据和索引。
支持事务处理 支持外键
 
InnDB原理
事务的ACID是通过InnDB日志和锁来保证,事务的隔离性是通过数据库锁的机制 实现的,持久性是通过redo log(从做日志实现的),原子性和一致性通过Undo log来实现的
 
JDBC编程步骤
    注册驱动
    获取连接对象 Connection
    创建Statement对象
    运行sql语句
    处理结果
    关闭连接释放资源
 
 
6、索引设计规范
(19)单表索引建议控制在5个以内
(20)单索引字段数不允许超过5个
解读:字段超过5个时,实际已经起不到有效过滤数据的作用了
 
 
禁止大表使用JOIN查询,禁止大表使用子查询
解读:会产生临时表,消耗较多内存与CPU,极大影响数据库性能
 
避免出现 笛卡尔积的出现   两个表没有关系 然后查两张表
 
in or 这个两个关键字不建议用
 
当B表数据较大 不要使用in
当A表数据较小 不要使用 exists
in 和 not in 也要慎用,否则会导致全表扫描,如
 
索引的实现方式
B+树
 
 
索引分为两大类
 hash类型 查询单条快 范围查询慢
btee类型 B+树 层数越多,数据量指数及增
 
 
SQL语句中使用了or关键字索引会失效,在数据量较大的时候查找效率较低,因此可以使用union或union all代替   
        
 
  建立索引 一定要遵循最左原则  一定要有第一个的字段
  不要在索引上进行计算 函数 类型转换 会导致 索引失效
    不要使用索引中进行范围条件查找 否则只会的索引将失效
解决like 索引不被使用
    查询一个字段name 并且建立一个索引name
    %加在后面索引在 可以全表搜索   索引在
    %加在前面索引不在   索引不在 除非 name也是索引
字符串不加''号 索引会失效
    小表驱动大表
 
索引的优点
    加快数据的检索速度
缺点
        创建索引和维护索引要消费时间
        索引需要占用额外的无理空间
        
分区分表的区别
    分表就是按照一定的规则 把一张大表分成多个小表 
分区
    是按照一定的规则把一张大表分成不同的区块    
 
数据库连接池
    不使用连接池,使用完成之后都需要释放关闭,很消耗资源
当我们使用数据库连接池 ,创建指定数量的连接,之前我们使用连接 直接在连接池里拿 
 
数据库 三范式
    第一范式  强调原子性  
    第二范式  满足第一范式 表中必须有主键 二 列必须完全依赖主键
    第三范式  满足第二范式 非主键直接依赖主键  
 
查询 sql优化
    表结果优化 尽量使用数字类型字段 提高效率
        
 
    explain
type  ref
key_len  使用索引的长度 越少越好
ref  类型 显示所有的哪一列被使用
rews 大致估算索要读取的行数
extra
用using index 好
using filesort 无法用索引排序
 
 
事务ACID是什么?事务并发会产生哪些问题
    ACID表示事务的特性 原子性 一致性 隔离性 和持久性
 
原子性 要么都做完 要么都不做  不可能停在中间环节  事务执行过程出错 将回滚
一致性 事务开始与结束 数据库完成性约束没有被破坏 比如A转B钱 A扣钱了 B没有收到
隔离性 同一个时间 只允许一个事务请求同一个数据 不同的事务直接没有干扰 比如A取钱 B不能转账
持久性 事务完成之后 不可以回滚
 
 
事务并发问题
脏读 事务A读取事务B更新的数据 然后B回滚  A读取的就是脏读
不可重复读 事务A多次请求同一个数据 事务B在事务A多次读取过程中 对数据更改并提交 导致A读取数据不一致
幻读 事务A 操作 数据ABCD  然后事务B 突然插入一条数据  事务发现还有条没有处理
Dubbo Mysql Mbaits_sql语句
 
乐观锁与悲观锁
悲观锁
每次拿数据 都以为别人会修改数据 所以每次拿数据都会上锁 别人就会被阻塞
传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁
 
 
乐观锁  每次拿数据都以为别人不会修改 所以不会上锁 但是更新的时候会判断在此期间是否有人修改过这个数据
1. 版本号机制  写一个字段 每次加1
 
 
两种锁的使用场景
像乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。
 
 
如何让Redis与Mysql数据保持同步?
1. 实时策略——用户体验好,是默认应该使用的策略;
2. 异步策略——适用于并发量大,但是数据没有那么关键的情况,好处是实时性好;
3. 定时策略——并发量实在太大,数据量也大的情况,异步都难以满足的场景;
 
 
 
 
 
 
 
 
1、什么是Mybatis?
Mybatis是一个半ORM框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接
 
iBatis与MyBatis区别
iBatis 封装绝大多数JDBC代码 使开发者关注sql本身 而不需要过多精力处理 注册驱动 获取连接对象 创建stemdsfas的 等这样繁琐的代码
iBatis
mybatis实现DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现
MyBatis采用功能强大的基于OGNL的表达式来消除其他元素。
Mybatis实现了接口绑定 
 
2、Mybaits的优点:
与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
很好的与各种数据库兼容
能够与Spring很好的集成;
 
3 MyBatis框架的缺点
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
 
4 #{}和${}的区别是什么?
#{} 是预编译处理,${}是字符串替换。
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
 
5、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
 
6
Mybatis常用的配置参数
mappers      映射类
dataSource   数据源
transaction Manager   事务
Settings    全局的配置