老虎集团【4面】

1. 主键索引与非主键索引区别? https://www.cnblogs.com/heishuichenzhou/p/10813463.html
非主键索引查找数据,根据条件,查找到对应的主键ID,然后根据主键ID去索引表里面找对应的数据
2. redis主从同步原理(问了3次)
全量和增量同步
全量:
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。
具体步骤如下: 
1)从服务器连接主服务器,发送PSYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令; 
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令; 
增量:
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
 
 
断线之后的命令,如何同步?
redis2.8之前, 全量同步,效率低
之后,增量同步, 需要关注以下几个点:
如何记录断线后的命令?
1.主从都会记录复制的偏移量(记录上次复制到哪里了)
主从服务器都会记录上次复制的偏移量
2.主服务器复制积压区
从服务器断线后,主服务器的命令都会放到积压区,等待重服务器上线以后同步
3. 如何判断是全量同步还是增量同步
主服务器和从服务器启动以后,会生成一个40位的ID,这是每个服务器的标示。
当初次进行同步的时候,主服务器会把自己的ID发给从服务器保存;断线重连后,从服务器发送同步命令,
主服务器会讲从服务发送来的ID和自己运行的ID进行对比,如果一致,执行增量同步;如果不一致,执行全量同步;
 
 
3. redis slot
Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分哈希槽。
 
节点 A 、B 、C 的例子中, 如果节点 B 下线了, 那么集群将无法正常运行, 因为集群找不到节点来处理 5501 号至 11000号的哈希槽。
 
首先要开启cluster-enable 
> cluster meet ip port 可以让集群握手,加入到集群中
  A 与 B 握手,握手成功后,会通过gossip协议广播给集群中的其它节点,让其它节点与节点B进行握手,经过一段时间握手成功。B也就加入到集群中了。
> cluster nodes 查看集群节点
> cluster addslots 0 1 2 3 .... 分配slot
只有slot全部被分配以后集群才会上线。
 
集群中执行命令
当16384个slot被分配完毕后,集群上线;客户端就可以发送命令到集群中;
当客户端的命令发送到集群后,接收命令的node会根据key计算出要处理的命令属于哪个slot,
如果这个槽点是在自己这台机器上, 直接保存即可
如果不是,返回一个moved错误,就会给客户端返回一个redirect至正确的节点,然后在执行命令;
 
计算key属于哪个slot
def  slot_nums(key):
    return crc16(key) & 16384
 
> 查看key属于哪个slot: cluster keyslot "name"
def cluster_keyslot(key):
    slot = slot_nums(key)
    return reply_client(slot)
 
4. redis常用的命令
5. 索引底层实现原理
 
6. 短url设计
7. jwt原理
8. 分布式算法raft与paxos区别
9. in操作 对于list, set, tuple, dict 效率如何?
10. django中间件与装饰器区别
11. django路由到达视图函数的流程(源码级)
12. 数据库管理工具
13. celery相关: 异步任务怎么处理? 用celery做什么?celery任务在执行过程中,手动中断, 脱离supervisor管理,如何进行处理
14. io模型?io多路复用?epoll水平触发和边缘触发
水平触发:当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll_wait()时,它还会通知你在上没读写完的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率!(也就是描述符有变化,但是你不想读,人家就不停提醒你去读)
边缘触发:当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符(也就是描述符有变化,人家只提醒你一次去读,如果你没去读,人家不管了)
15. 项目技术点,流程
16. 迭代器,生成器,可迭代对象原理
17. redis分布式锁?
18. 分布式ID如何生成?
19. 可重入锁  https://www.cnblogs.com/gxyandwmm/p/9387833.html  python 里面的threading.Rlock()  https://studygolang.com/articles/16480
20. mysql事务隔离级别(从小到大)
21. 索引失效场景? mysql哪些类型会导致索引不可用?
22. nginx配置相关
23. 消息队列相关, rabbitmq
24. 设计一个消息队列
25. etcd实现原理;一致性hash算法
26. tcp握手流程
27. 简单说说微服务
28. 简单说说常见过的rpc框架
29. 服务之间如何通信
20. 缓存雪崩?穿透?
 
 
哎,最后止步于4面,有点可惜~
原文地址:https://www.cnblogs.com/vipchenwei/p/11882607.html