获得徽章 1
#青训营笔记创作活动#
2月21日 打卡day40
今日阅读的文章是《「Redis应用」Redis "高级"应用场景 -- 限流、延时队列、幂等处理》
Redis限流:固定窗口计数,Redis过期机制实现,但存在窗口临界问题;滑动窗口计数,Zset实现;漏桶算法限制常量流出速率,令牌桶算法限制平均流入速率
Nginx限流:突发流量限制访问频率,加上burst参数,在结合nodelay一起使用,瞬间超出设置的每秒处理量时,超出的请求立马处理,不能延迟;控制并发连接数,ngx_http_limit_conn_module提供了限制连接数功能
Redis实现延时队列:String设置key,过期监听触发事件,但是Redis从未保证会在设定的过期时间立即删除并发送过期通知;ZSet存储定时任务
Redis实现布隆过滤器:布隆过滤器可以用于检索一个元素是否在一个集合中,如果布隆过滤器判断存在,则放“可能会误判”,后续过程跟普通查询Redis过程是一样的,不存在,则直接返回,不走redis。将所有可能存在的数据哈希到一个足够大的bitmaps中,一定不存在的数据会被这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。布隆过滤器不好删除元素,加计数器解决
Redis实现幂等处理:先删除token,再执行业务
Redis的incr:签到等需要计数的序列号、记录登录失败次数防爆破
登录失败逻辑
展开
评论
#青训营笔记创作活动#
2月20日 打卡day39
今日阅读文章《利用Optional解决空指针异常》
空指针异常(NullPointerException)指java中的异常类,当应用程序试图在需要对象的地方使用null时(调用null对象的实例方法、访问或修改null对象的字段、将null作为一个数组,获得其长度、将null作为一个数组,访问或修改其时间片、将null作为Throwable值抛出),抛出该异常
Java8引入的Optional类用于解决空指针异常
基本用法:使用同名方法创建、使用of()和ofNullable()方法创建包含值的Optioanal实例、get()方法获得实际值对象、isPresent()方法验证是否有值、API用以返回对象值、
转换与过滤:map()和flatMap()方法转换Optional的值
文章还介绍了使用Optional重写案例,Optional类源码解析
Optional是Java语言的有益补充,旨在减少代码中的空指针异常,这个简单而强大的类有助于创建简单、可读性更强、比对应程序错误更少的程序
展开
评论
#青训营笔记创作活动#
2月19日 打卡day38
今日阅读的文章是《实现真正的高性能高并发的上亿级别秒杀系统!》
秒杀系统我在青训营课程的学习中有过了解,也在之前的阅读中读到过秒杀系统,所以今天的要记的是知识点上的补充
秒杀特点是持续时间短,抢购人数多,参与人数远远高于商品数量
在《高并发秒杀商品,你必须知道的9个细节》中提到设计秒杀系统需要注意的9个细节:瞬时高并发、页面静态化、秒杀按钮、读多写少、缓存问题、库存问题、分布式锁、mq异步处理、如何限流。该文章提供的更多是设计方向
本文章结构也是这样安排的,但是这篇文章就是将怎么做,提供更详细的方法
负载均衡:高并发系统架构采用分布式集群部署,服务上层有层层负载均衡,提供各种容灾手段,保证系统的高可用。OSPF,是一个内部网关协议,最多6条链路同时执行负载均衡;LVS;Ngnix,轮询、加权轮询、ip hash轮询
消息丢失问题,加消息发送表;重复消费问题,加消息处理表;垃圾消息问题,在job重试时进行相关处理;延迟消费问题,使用延迟队列;支付回调问题:完成支付,修改订单状态为已支付,删除缓存中排队信息、下单状态
熔断:雪崩效应,在微服务架构中多个服务层调用,基础服务故障导致级联故障,进而造成整个系统不可用;熔断器,隔离模式、熔断器模式、命令模式、Hystrix、Metrics
Redis限流:setnx、zset、令牌桶
展开
评论
#青训营笔记创作活动#
2月18日 打卡day37
今日阅读的文章是《聊一聊安全且正确使用缓存的那些事 —— 关于缓存可靠性、关乎数据一致性》
我在day24、25、26有阅读过缓存的相关知识
本文章探讨了缓存使用过程中的典型异常的触发场景与防护策略,以及保持缓存与数据库数据一致性的方法
热点数据与淘汰策略我在学习青训营存储篇课程和阅读Redis相关文章有过接触
缓存雪崩、缓存击穿、缓存穿透、缓存数据一致性这些问题和它们的解决方案我都有了解过,本次阅读就当是重新温习了
展开
评论
#青训营笔记创作活动#
2月17日 打卡day36
今日阅读的文章是《go基础语法50问,来看看你的go基础合格了吗?》
这里面有两点重复了,所以实际上只有49问
重复的那一问是“Go语言编程的好处是什么”,当然我只有这个是可能答上来的,编译运行很快、支持并行操作、垃圾处理器、内置字符串和maps、函数是它的最基本编程单位,以上是这一问的答案。我还没有使用过Go语言进行一些算法或小项目的编程,对这些问题都不是很了解,这篇文章我觉得对我今后学习Go语言会有解惑救急的帮助
展开
评论
#青训营笔记创作活动#
2月16日 打卡day35
今日阅读的文章是《使用 Go HTTP 框架 Hertz 进行 JWT 认证》
hertz-jwt是众多外部拓展组件之一,Hertz丰富的扩展生态为开发者带来了很大的遍历
本篇文章会围绕Hertz开源仓库的一个demo讲述使用Hertz完成JWT的认证与授权的流程
通过这个demo,学习使用命令行工具hz生成脚手架代码,使用JWT扩展完成登录认证和授权访问,使用Gorm访问数据库
展开
评论
#青训营笔记创作活动#
2月15日 打卡day34
今天阅读的文章是《(六)MySQL索引原理篇:深入数据库底层揭开索引机制的神秘面纱!》
这篇文章是该系列文章中的第六篇,此前在day20和21有读过第4篇和第5篇,分别是初始篇和应用篇
本文章将揭开MySQL索引底层的神秘面纱
索引选择了B+树作为底层数据结构。不选择二叉树,是因为当索引的字段值按顺序增长,二叉树会转变为链表结构,检索的过程就是全表扫描了。还有由于树结构在磁盘中,各节点的数据并不连续,无法利用局部性原理。不选择红黑树,数据量一大,树会很高。每个节点中只存储一个数据,节点之间是不连续的,无法利用局部性原理。不选择B-Tree,对于大范围查询的需求,需要通过多次磁盘IO来检索数据
B+树节点分为了叶节点和叶子节点两类,最下面的一排节点之间,都存在一个单向指针,指向下一个节点所在的位置。B+树以接近完美的形式解决之前其他数据结构中的所有问题
MySQL在设计索引结构时,对于原始的B+Tree又一次做了改造,叶子节点之间是互存指针的,所有叶子节点是一个双向链表结构
全表扫描过程、磁盘IO实现、局部性原理、B+Tree数据结构、建立索引、写类型SQL对索引的影响等等,该文章内容丰富,值得细读
展开
评论
#青训营笔记创作活动#
2月14日 day33打卡
今天阅读的文章是《为什么说MySQL单表行数不要超过2000w?》
在day3阅读的文章《我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知?》中说明道:常规表的存放记录数约一千万条数据。InnoDB三层B+树情况下的数据存储量范围为一百二十多万条到将近5亿条。做项目考虑分表的时候还是得多关注一下表的实际情况,而不是盲目的认为两千万数据就是那个临界点。
今该文章得到的结论也是相同的:MySQL的表数据以页的形式存放,页在磁盘中不一是连续的,页的空间会有一些固定的信息,如页头、页尾、页码、校验码。索引结构不会影响单表最大行数,2000w只是推荐值,超过了这个值可能会导致B+树层级更高,影响查询性能。
展开
评论
#青训营笔记创作活动#
2月13日 打卡day32
今天阅读的文章是《(十五)MySQL命令大全:以后再也不用担心忘记SQL该怎么写啦~》
如题,该文章就是一本MySQL命令集合大全,非常的全面。主要包括十三个部分:基本操作与库命令、增删改查、数据库各种函数介绍、MySQL支持函数类型、索引相关命令、事务与锁相关命令、存储过程、存储函数与触发器的相关语法、用户与权限管理命令、视图临时表命令、数据导出导入与备份还原命令、表分区相关命令、MySQL、InnoDB、MyISAM参数相关命令、还有MySQL常见的错误码
内容丰富,学习中遇到不会的可以查查
展开
评论
下一页
个人成就
文章被点赞 19
文章被阅读 2,447
掘力值 212
收藏集
0
关注标签
9
加入于