
获得徽章 2
- #青训营笔记创作活动#
2月14日 打卡day11
今天学习了分布式锁。
线程锁:主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。
进程锁:为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。
分布式锁:当多个进程不在同一个系统中(比如分布式系统中控制共享资源访问),用分布式锁控制多个进程对资源的访问。
基于数据库实现分布式锁基于数据库表(锁表,很少使用)
乐观锁(基于版本号)
悲观锁(基于排它锁)
基于 redis 实现分布式锁: 单个Redis实例:setnx(key,当前时间+过期时间) + Lua
Redis集群模式:Redlock
基于 zookeeper实现分布式锁临时有序节点来实现的分布式锁,Curator
基于 Consul
展开评论点赞 - #青训营笔记创作活动#
2月7日 打卡day10
今天学习了 Java中的线程池。
降低资源消耗。降低频繁创建、销毁线程带来的额外开销,复用已创建线程
降低使用复杂度。将任务的提交和执行进行解耦,我们只需要创建一个线程池,然后往里面提交任务就行,具体执行流程由线程池自己管理,降低使用复杂度
提高线程可管理性。能安全有效的管理线程资源,避免不加限制无限申请造成资源耗尽风险
提高响应速度。任务到达后,直接复用已创建好的线程执行
展开评论点赞 - #青训营笔记创作活动#
2月6日 打卡day9
今天学习了系统设计中消息通知功能的设计与实现。
一般有客户端轮训,websocket 消息总线。
轮训只能是由客户端主动发起,然后服务端返回响应。
而webscoket可以实现双工通信,并且资源占用低
展开评论点赞 - #青训营笔记创作活动#
1月20日 打卡day6
今天学习了MySQL索引
innodb下索引的基本知识。包括底层实现,上层应用评论点赞 - #青训营笔记创作活动#
1月19日 打卡day5
今天学习了MySQL核实考虑分表
“单表记录不超过500w,2000w”
其实并不是这样,具体还需要深入业务,代入计算。
涉及Innodb引擎,索引等知识。展开评论点赞 - #青训营笔记创作活动#
1月17日 打卡day4
今天主要学习了分布式缓存数据库redis。
redis为何快?专门设计的数据结构(sds,zset等)+网络IO模型
redis的使用场景?zset做实时排行榜,hyperloglog实现IP统计,bitmap实现状态压缩统计,setnx实现分布式锁,etc
同时,还应该注意缓存和db的一致性问题,缓存高可用设计,持久化策略。
关于分布式锁,专门设计了redlock,建议使用redisson,其中watchdog的设计值得学习。
展开评论点赞 - #青训营笔记创作活动#
1月17日 打卡day3
今天学习了分库分表的系统设计。分库分表主要应对于海量数据存储,查询响应慢等问题,具体策略有水平拆分,垂直拆分。
拆分策略上,更多的依赖于业务逻辑,例如按照订单创建时间切分,客户归属地切分,或者专库专用等。
但,分库分表之后,会带来一定问题。
首先是ID的全局唯一性,因此有了雪花id等分布式ID技术
其次是分布式事务一致问题,解决方案有Alibaba seata。
然后是跨表分页,排序等问题,高效服务治理问题。
展开评论点赞 - #青训营笔记创作活动#
1月16日 打卡day2
今天学习了电商秒杀场景下的系统设计。
秒杀场景一般是瞬时流量高,并发大,对于系统抗压能力是个考验。一般来说,秒杀系统应该独立于核心业务,保证核心业务的稳定高可用。
应对秒杀场景,可以采用页面静态化(nginx存放静态资源)、cdn加速(内容分发网络),业务层面可以采用限流、削峰等手段保证服务高可用。
对于库存模块,有必要采用redis、zk等分布式锁保证库存扣件逻辑正确。
展开评论点赞 - #青训营笔记创作活动#
1月15,打卡day1
工欲善其事必先利其器,IDEA插件++,工作(摸鱼)效率++
诸如maven helper,LeetCode,docker等插件都是很不错的
评论点赞