获得徽章 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:签到等需要计数的序列号、记录登录失败次数防爆破
登录失败逻辑展开评论1 - #青训营笔记创作活动#
2月19日 打卡day38
今日阅读的文章是《实现真正的高性能高并发的上亿级别秒杀系统!》
秒杀系统我在青训营课程的学习中有过了解,也在之前的阅读中读到过秒杀系统,所以今天的要记的是知识点上的补充
秒杀特点是持续时间短,抢购人数多,参与人数远远高于商品数量
在《高并发秒杀商品,你必须知道的9个细节》中提到设计秒杀系统需要注意的9个细节:瞬时高并发、页面静态化、秒杀按钮、读多写少、缓存问题、库存问题、分布式锁、mq异步处理、如何限流。该文章提供的更多是设计方向
本文章结构也是这样安排的,但是这篇文章就是将怎么做,提供更详细的方法
负载均衡:高并发系统架构采用分布式集群部署,服务上层有层层负载均衡,提供各种容灾手段,保证系统的高可用。OSPF,是一个内部网关协议,最多6条链路同时执行负载均衡;LVS;Ngnix,轮询、加权轮询、ip hash轮询
消息丢失问题,加消息发送表;重复消费问题,加消息处理表;垃圾消息问题,在job重试时进行相关处理;延迟消费问题,使用延迟队列;支付回调问题:完成支付,修改订单状态为已支付,删除缓存中排队信息、下单状态
熔断:雪崩效应,在微服务架构中多个服务层调用,基础服务故障导致级联故障,进而造成整个系统不可用;熔断器,隔离模式、熔断器模式、命令模式、Hystrix、Metrics
Redis限流:setnx、zset、令牌桶展开评论1 - #青训营笔记创作活动#
2月18日 打卡day37
今日阅读的文章是《聊一聊安全且正确使用缓存的那些事 —— 关于缓存可靠性、关乎数据一致性》
我在day24、25、26有阅读过缓存的相关知识
本文章探讨了缓存使用过程中的典型异常的触发场景与防护策略,以及保持缓存与数据库数据一致性的方法
热点数据与淘汰策略我在学习青训营存储篇课程和阅读Redis相关文章有过接触
缓存雪崩、缓存击穿、缓存穿透、缓存数据一致性这些问题和它们的解决方案我都有了解过,本次阅读就当是重新温习了展开评论1 - #青训营笔记创作活动#
2月17日 打卡day36
今日阅读的文章是《go基础语法50问,来看看你的go基础合格了吗?》
这里面有两点重复了,所以实际上只有49问
重复的那一问是“Go语言编程的好处是什么”,当然我只有这个是可能答上来的,编译运行很快、支持并行操作、垃圾处理器、内置字符串和maps、函数是它的最基本编程单位,以上是这一问的答案。我还没有使用过Go语言进行一些算法或小项目的编程,对这些问题都不是很了解,这篇文章我觉得对我今后学习Go语言会有解惑救急的帮助展开评论1 - #青训营笔记创作活动#
2月16日 打卡day35
今日阅读的文章是《使用 Go HTTP 框架 Hertz 进行 JWT 认证》
hertz-jwt是众多外部拓展组件之一,Hertz丰富的扩展生态为开发者带来了很大的遍历
本篇文章会围绕Hertz开源仓库的一个demo讲述使用Hertz完成JWT的认证与授权的流程
通过这个demo,学习使用命令行工具hz生成脚手架代码,使用JWT扩展完成登录认证和授权访问,使用Gorm访问数据库展开评论1 - #青训营笔记创作活动#
2月14日 day33打卡
今天阅读的文章是《为什么说MySQL单表行数不要超过2000w?》
在day3阅读的文章《我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知?》中说明道:常规表的存放记录数约一千万条数据。InnoDB三层B+树情况下的数据存储量范围为一百二十多万条到将近5亿条。做项目考虑分表的时候还是得多关注一下表的实际情况,而不是盲目的认为两千万数据就是那个临界点。
今该文章得到的结论也是相同的:MySQL的表数据以页的形式存放,页在磁盘中不一是连续的,页的空间会有一些固定的信息,如页头、页尾、页码、校验码。索引结构不会影响单表最大行数,2000w只是推荐值,超过了这个值可能会导致B+树层级更高,影响查询性能。展开评论1 - #青训营笔记创作活动#
2月15日 打卡day34
今天阅读的文章是《(六)MySQL索引原理篇:深入数据库底层揭开索引机制的神秘面纱!》
这篇文章是该系列文章中的第六篇,此前在day20和21有读过第4篇和第5篇,分别是初始篇和应用篇
本文章将揭开MySQL索引底层的神秘面纱
索引选择了B+树作为底层数据结构。不选择二叉树,是因为当索引的字段值按顺序增长,二叉树会转变为链表结构,检索的过程就是全表扫描了。还有由于树结构在磁盘中,各节点的数据并不连续,无法利用局部性原理。不选择红黑树,数据量一大,树会很高。每个节点中只存储一个数据,节点之间是不连续的,无法利用局部性原理。不选择B-Tree,对于大范围查询的需求,需要通过多次磁盘IO来检索数据
B+树节点分为了叶节点和叶子节点两类,最下面的一排节点之间,都存在一个单向指针,指向下一个节点所在的位置。B+树以接近完美的形式解决之前其他数据结构中的所有问题
MySQL在设计索引结构时,对于原始的B+Tree又一次做了改造,叶子节点之间是互存指针的,所有叶子节点是一个双向链表结构
全表扫描过程、磁盘IO实现、局部性原理、B+Tree数据结构、建立索引、写类型SQL对索引的影响等等,该文章内容丰富,值得细读展开评论1 - #青训营笔记创作活动#
2月13日 打卡day32
今天阅读的文章是《(十五)MySQL命令大全:以后再也不用担心忘记SQL该怎么写啦~》
如题,该文章就是一本MySQL命令集合大全,非常的全面。主要包括十三个部分:基本操作与库命令、增删改查、数据库各种函数介绍、MySQL支持函数类型、索引相关命令、事务与锁相关命令、存储过程、存储函数与触发器的相关语法、用户与权限管理命令、视图临时表命令、数据导出导入与备份还原命令、表分区相关命令、MySQL、InnoDB、MyISAM参数相关命令、还有MySQL常见的错误码
内容丰富,学习中遇到不会的可以查查展开评论1 - #青训营笔记创作活动#
2月11日 打卡day30
今日阅读的文章是《面试突击81:什么是跨域问题?如何解决?》
跨域问题指的是不同站点之间,使用ajax无法相互调用的问题。其本质是浏览器的一种保护机制,其初衷是为了保证用户的安全,防止恶意网站窃取数据。但也会阻碍不同站点之间的正常调用
跨域有三种情况:协议不同、域名不同、端口不同
Spring Boot在跨域问题上有多种解决方案,文章介绍了5个:
(1)使用@CrossOrigin注解,只能实现局部跨域
(2)通过配置文件
(3)通过CorsFilter对象
(4)通过Response对象,局部跨域,应用的范围最小
(5)通过实现 ResponseBodyAdvice
以上方法均为在返回头中设置“Access-Control-Allow-Origin”参数,该参数用来表示允许跨域访问的原始域名,当设置为“*”时,表示允许所有站点跨域访问展开评论1 - #青训营笔记创作活动#
2月12日 打卡day31
今日阅读的文章是《用万字长文来讲讲本地锁至分布式锁的演进和Redis实现,扩展 Redlock 红锁》文章介绍了本地锁的使用以及存在的问题、分布式锁基本知识及它的实现、Redis的集群模式和哨兵模式下分布式锁的思考
本地锁存在问题:多服务并发时,只给当前进程加锁,多个用户一起获取锁,可能会有多个用户同时获取到锁,出现问题
Redis Setnx(SET IF NOT EXISTS):在指定的key不存在时,为key设置指定的值
解决死锁问题:将加锁和设置锁时间变成一个原子操作,Redis中的set命令可以添加参数,可以实现SETNX+EXPIRE效果
lua脚本实现分布式锁,将释放锁的操作变成原子性操作,确保其正确性
Redisson实现分布式锁:Redisson中有看门狗机制,可以为锁续期,将业务执行完全
文章还介绍了关于Redlock红锁的基本知识展开评论1