`
dwj147258
  • 浏览: 187246 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

相关笔记

阅读更多
数据库隔离级别分哪些?
事物隔离级别: 对事物并发控制的等级
四个等级: 串行化, 可重复读, 读已提交, 读未提交
串行化:所有事务一个接一个执行, 不存在幻读, 要么范围锁, 要么检查违规  两个事务完全独立,其中一个事务做的操作,对于另外一个事务不产生任何影响。【数据库事务加了锁,所有事务串行执行】
可重复读: 数据不可改但可新增, 可能幻读,  两个事务,其中事务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 处理完毕后将结果转化为二进制流并返回
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics