欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

相关笔记

程序员文章站 2022-05-20 12:18:31
...
数据库隔离级别分哪些?
事物隔离级别: 对事物并发控制的等级
四个等级: 串行化, 可重复读, 读已提交, 读未提交
串行化:所有事务一个接一个执行, 不存在幻读, 要么范围锁, 要么检查违规  两个事务完全独立,其中一个事务做的操作,对于另外一个事务不产生任何影响。【数据库事务加了锁,所有事务串行执行】
可重复读: 数据不可改但可新增, 可能幻读,  两个事务,其中事务A获取一条数据,事务B在事务A提交事务前无法操作这条数据,这样就保证了可以重复读。【数据库增加了读锁】
读已提交: 两个事务,其中一个事务对数据做的DML操作提交后,另一个事务才能看到。
读未提交: 两个事务,其中一个事务对数据做的DML操作还未提交,另一个事务能够立即看到。

为什么redis没用一致性hash,选用的hash槽
cluster-->node-->slot-->key
原因:使用hash槽的好处是可以方便地添加或删除节点,只需要挪动hash槽的节点位置即可,不会造成集群不可用的状态

redis怎么实现分布式锁
分布式锁的三种实现方式:1 数据库乐观锁;2 基于redis的分布式锁;3 基于zookeeper的分布式锁

public class RedisTool {
    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";

    /**
     * 尝试获取分布式锁
     * @param jedis Redis客户端
     * @param lockKey 锁
     * @param requestId 请求标识
     * @param expireTime 超期时间
     * @return 是否获取成功
     */
    public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);

        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

public class RedisTool {

    private static final Long RELEASE_SUCCESS = 1L;

    /**
     * 释放分布式锁
     * @param jedis Redis客户端
     * @param lockKey 锁
     * @param requestId 请求标识
     * @return 是否释放成功
     */
    public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

使用mysql索引有哪些原则?索引什么数据结构,b+tree 和tree 什么区别
1 最左前缀匹配原则;
2 =和in可以乱序;
3 尽量选择区分度高的列作为索引  count(distinct col)/count(*)
4 索引列不能参与计算,保证列"干净";
5 尽量得扩展索引,不要新建索引;
6 对于查询频率高的字段创建索引;

mysql有哪些存储引擎,都有什么区别?
1 Myisam:静态Myisam、动态Myisam、压缩Myisam  不支持事务,行级锁和外键约束
2 Myisam Merge:Myisam的变种, 将几个相同的Myisam表合并成一个虚表,用于数据仓库和日志
3 InnoDB: 由Myisam更新而来, 支持事务,行级锁和外键约束
4 memory(heap) : 内存中数据表, 使用散列索引,存取速度快,用于临时表
5 archive: 只支持select和insert 不支持索引 .
---------------------------------------------------------------
|    特点    | Myisam  |  BDB  |  Memory  |  InnoDB  |  Archive  |
|----------------------------------------------------------------|
|存储限制    |  没有   |  没有 |    有    |   64TB   |   没有    |
|----------------------------------------------------------------|
|事务安全    |         |  支持 |          |   支持   |           |
|----------------------------------------------------------------|
|锁机制      |  表锁   |  页锁 |   表锁   |   行锁   |   行锁    |
|----------------------------------------------------------------|
|B树索引     |  支持   |  支持 |   支持   |   支持   |           |
|----------------------------------------------------------------|
|哈希索引    |         |       |   支持   |   支持   |           |
|----------------------------------------------------------------|
|全文索引    |  支持   |       |          |          |           |
|----------------------------------------------------------------|
|集群索引    |         |       |          |   支持   |           |
|----------------------------------------------------------------|
|数据缓存    |         |       |   支持   |   支持   |           |
|----------------------------------------------------------------|
|索引缓存    |  支持   |       |   支持   |   支持   |           |
|----------------------------------------------------------------|
|数据可压缩  |  支持   |       |          |          |   支持    |
|----------------------------------------------------------------|
|空间使用    |   低    |   低  |   N/A    |    高    |  非常低   |
|----------------------------------------------------------------|
|内存使用    |   低    |   低  |   中等   |    高    |    低     |
|----------------------------------------------------------------|
|批量插入速度|   高    |   高  |    高    |    低    |  非常高   |
|----------------------------------------------------------------|
|支持外键    |         |       |          |   支持   |           |
----------------------------------------------------------------

设计高并发系统数据库层面该怎么设计,数据库锁有哪些类型,如何实现
加数据库锁,防止脏读(读未提交),不可重复读以及幻读
数据库锁类型:独占锁(排他锁)  共享锁   更新锁     或者分为   乐观锁和悲观锁

数据库事务有哪些 事务有哪些特性?
事务:  事务是需要在同一个处理单元中执行的一系列更新处理的集合
1 平面型事务;
2 嵌套事务;
3 链式事务;
4 补偿事务;
5 SAGE事务
特点: ACID
1 A(原子性)事务是一个不可再分割的工作单位 要么全部成功,要么全部回滚
2 C(一致性)事务使得系统从一个状态转换到另一个一致的状态 数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
3 I(隔离性)多事务并发访问时,事务是相互隔离的, 一个事务不能影响其它事务的运行效果;
4 D(持久性)事务完成以后,该事务对数据库所做的修改持久得保存在数据库之中,并不会被回滚

redis和memcached什么区别,为什么单线程的redis比多线程的memcached效率要高
1 存储方式 Memcached数据全在内存中,断电,数据丢失   redis 半持久化结构, 部分数据存放硬盘
2 支持数据类型  Memcached数据类型简单, redis支持6中数据类型: 字符串  hash结构   列表   集合    可排列集合     基数
3 使用底层模型不同  redis直接构建了VM机制,
4 value大小不同  redis  1GB   Memcached   1MB
redis速度快: 1 完全基于内存, 类似hashMap 查找和操作的时间复杂度是O(1)
2 数据结构简单 3 采用单线程, 避免上下文切换和竞争  4  使用多路I/O复用模型,非阻塞IO   5 底层模型, redis构建VM机制
redis 为什么单线程
因为单线程的redis多路io复用速度已经很快了, CPU不会成为redis的瓶颈, 若多核cup, 可开多个redis示例 组成maste-master或者master-slave的模式, 手动分配CUP核

redis有哪些数据类型,都在哪些场景下使用
redis数据类型: String   hash    list   set   Sorted Set   pub/sub    Transactions
String  适用Key-value 模式,
hash    适用Key-hashMap模式, 对象属性放在hashMap中  属性名为map的key,属性值为map的value
List    适用消息队列模式, list链表   双向链表-->发送缓冲队列
Set     适用排重的消息队列
Sorted Set  适用可排序排重的消息队列
Pub/Sub  发布和订阅  适用即时消息场景
Transactions 事务  ACID

rdis的主从复制是怎么实现的、redis的集群模式是怎么实现的,redis的key是如何寻址的
rdis的主从复制 : Master-Slave模型
原理: master与slave互通, slave发送sync同步指令, master接受指令, 启动存盘进程,同时收集所有slave的修改数据集的指令信息,完成存盘进程后, 同步数据库文件到对应的slave,完成一次完整同步工作,
  slave接受数据库文件后,存盘加载到内存中,
note: 1 当master与slave出现宕机 slave马上进行重连和数据同步
      2 master接受多个slave的sync同步指令时, 后台开启队列保证多个slave有序高效的执行
配置-- redis一个端口为master 其他端口为slave
   slave的conf文件配置 slaveof 127.0.0.1 master端口
redis的集群模式实现: 至少3master和3slave 互通, 6节点 两两相连,
  集群fail    当一个master下无slave 并且该master当掉时,集群fail  或者 超过半数的master当掉时, 集群fail;
  优势: 当一个master下线, 其一个slave切换为master
redis的key寻址: CRC16(key) mod 16384  对应hash槽地址

使用redis如何设计分布式锁,使用zk可以吗,如何实现的,这两种哪种效率更高
redis的分布式锁实现见第三个问题;
基于zk的分布式锁实现原理: 1, 客户端创建临时且有序的子节点;
  2, 虚拟节点排序,获取最小的节点名称
  3, 比较当前jvm创建的节点路径和最小的节点名称,如果当前最小 则获取锁, 否则退出或等待竞争
使用redis如何设计分布式锁的效率更高

redis的持久化,都有什么缺点和优点,具体底层怎么实现的
redis持久化的两种方法:
1,RDB (Redis DataBase) 直接将database中的key-value的二进制形式文件存储在rdb文件中
优点:性能高 ; 缺点: 在save配置文件之间若发生宕机, 数据会丢失;
2,AOF (Append-only File) 将数据的每一条修改命令追加到aof文件
优点:数据不容易丢失; 缺点:性能低

redis过期策略都有哪些,LRU , 写下java版本的代码
定期删除策略:每隔一段时间删除一次过期key操作

dubbo支持哪些序列化协议,hessian,说一下hessian的数据结构,,pb知道吗,说一下pb效率为什么是最高的
dubbo、 rmi、 hessian、 http、 webservice、 thrift、 redis
hessian 二进制RPC协议
1 客户端发起请求,将要传输的信息根据二进制传输协议转化为二进制格式文件
2 填充完毕后将二进制转化为二进制流,通过协议传输
3 接受到流后,将流转化为二进制文件,按照二进制传输协议获取信息并进行处理
4 处理完毕后将结果转化为二进制流并返回
相关标签: 笔记