面试题总结

对整理的面试题总结一些简略的回答,深入的分析还是需要自己去研究

1 微服务的限流方案,和服务降级方案

分布式微服务架构下,某一个节点出现故障,会导致雪崩效应。分布式总体限流方案:利用redis,记录调用量,服务降级,限流降级:把非重点的服务关闭。故障降级:设置默认值,采用兜底数据,开关预置、配置中心


2 Synchronized原理:每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权

http://www.cnblogs.com/paddix/p/5367116.html


3、乐观锁,先进行业务操作,在最后一步更新数据时再加锁,实现为每一条数据加一个版本号,查询出版本号,然后更新的时候以此版本号为依据,如果不一致则报错或者回滚事物
悲观锁:查询的时候就加锁 select for update 仅适用于innodb,且必须在事物块中才生效


4、redis集群三种模式:1主从模式,一个master,一个slave,master将数据同步给从 2 Sentinel模式,哨兵模式,Sentinel可以监控主从状态,当主下线以后,先标记成主观下线,然后多个Sentinel投票,超过半数支持则客观下线 3、Cluster模式,多台机器,将redis服务分片cluster模式自带的选举机制类似哨兵选举,但不存在哨兵,当master宕掉后,由该master的一个或多个slave节点来选举出新的master


5、redis的几种数据存储结构 ,redis数据存储结构有多种,依据存储数据的类型和大小等场景来分别使用

1、简单动态字符串 SDS

没有用c语言的字符串,而是自定义了名为SDS的数据结构,解决了内存溢出问题,预分配了空间(free)减少了内存分配次数,获取字符串长度复杂度为常数

2、双向链表

3、字典(hash)Redis的Hash,为单链表结构

就是在数组+链表的基础上,进行了一些rehash优化等。

4 跳跃表skipList

每个节点中维护多个指向其他节点的指针,节点是有序的 ,和平衡树很相似,为什么不用平衡树呢

skipList & AVL 之间的选择

  1. 从算法实现难度上来比较,skiplist比平衡树要简单得多。

  2. 平衡树的插入和删除操作可能引发子树的调整,逻辑复杂,而skiplist的插入和删除只需要修改相邻节点的指针,操作简单又快速。

  3. 查找单个key,skiplist和平衡树的时间复杂度都为O(log n),大体相当。

  4. 在做范围查找的时候,平衡树比skiplist操作要复杂。

  5. skiplist和各种平衡树(如AVL、红黑树等)的元素是有序排列的。

5 整数集合(intset)

对int存储做了优化,根据属性分配不同大小,如果放入更大的,则进行encoding升级

6 压缩列表(ziplist)ziplist是redis为了节约内存而开发的顺序型数据结构。它被用在列表键和哈希键中。一般用于小数据存储。

ZSet(sorted set-有序集合)在redis中有两种实现,skipList和zipList,在这基础上加上了score分值的概念,通过score和index来进行排序,相当于是一个进行了排序的链表

面试题总结

https://blog.****.net/Dome_/article/details/93389132