主题 | 链接 |
---|---|
Java基础知识 | 面试题 |
Java集合容器 | 面试题 |
Java并发编程 | 面试题 |
Java底层知识 | 面试题 |
Java常用框架 | 面试题 |
计算机网络 | 面试题 |
数据库 | 面试题 |
RabbitMQ | 面试题 |
Redis | 面试题 |
Elasticsearch | 面试题 |
Zookeeper | 面试题 |
系统设计 | 面试题 |
系统设计
系统鉴权
参考微信公众平台的接口授权方式,采用一个授权中心来统一管理。 被调用者拥有一个 systemId,由系统生成;调用者拥有唯一的 appId 和 appSecret,调用者通过 appId 和 appSecret 向授权中心请求一个 accessToken
分布式ID分发器
UUID
原理:包括网卡MAC地址、时间戳、随机数、时序等元素生成
优点:本地生成ID,不需要进行远程调用,时延低,性能非常高,扩展性好
缺点:空间占用较多,不能生成递增有序的数字,没有业务含义
数据库主键自增
优点:简单方便,有序递增,方便排序和分页
缺点:分库分表麻烦,受限于数据库的性能,数据库宕机服务不可用,简单递增容易暴露信息
Redis
原理:Incr,IncrBy原子性增加
优点:性能比数据库好,能满足有序递增
缺点:可能会出现ID重复和不稳定
雪花算法
原理:1bit:一般是符号位,不做处理;41bit:用来记录时间戳;10bit用来记录机器ID;12bit:循环位
优点:高性能高可用:生成时不依赖于数据库,完全在内存中生成;ID自增:存入数据库中,索引效率高
缺点:依赖与系统时间的一致性,如果系统时间被回调,或者改变,可能会造成id冲突或者重复
分布式锁
Redis分布式锁
利用Redis的setnx命令、或者set带参数命令(高版本redis),解锁时利用lua脚本将删除命令和判断超时的命令原子化(不判断超时,可能删除了其它人的锁)
RedLock、Redission
Zookeeper分布式锁
利用Zookeeper的顺序临时节点,临时节点删除则释放锁
在节点上绑定监听器,实现非阻塞锁
将客户端信息写入节点,实现可重入锁
数据库
利用数据库的行锁
优点:实现简单
缺点:性能问题、锁的失效、需要不断重试、非重入锁
单点登录
权限管理
用户(用户组)、角色、权限(权限组)
角色继承、角色与组织架构关联、角色隔离
页面权限、操作权限、数据权限、权限期限、权限委托、多租户权限设计
通过注解+拦截器实现比较好
秒杀系统
前