获得徽章 2
#青训营笔记创作活动#
2023/2/7 打卡day24
今日学习

缓存与数据库不一致问题的产生与解决

- 缓存穿透:缓存穿透是指用户在不断访问一个缓存和数据库中都没有的数据

- 我们就可以将空结果(null)存入到缓存中并且设置一个较短的过期时间
- 接口层增加校验

- 缓存雪崩:Redis挂掉了,请求全部走数据库

- 部署角度:实现 Redis 的高可用,主从+哨兵,Redis集群。

- 应用程序角度:

本地缓存 + 限流&降级

允许的话,设置热点数据永远不过期

缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生

(但实际而言,这一点很多时候其实不做的,因为如果加上随机时间后,再碰撞又该如何呢?)

- 恢复角度:Redis 的 RDB+AOF组合持久化策略,方便redis宕机后及时恢复数据

- 缓存击穿:缓存击穿和缓存穿透其实非常类似,但是缓存击穿说的是数据在缓存中没有,但是在数据库中有的数据。

- 设置热点数据不过期
- 第一时间去数据库获取数据填充到redis中,并且在请求数据库时需要加锁,避免所有的请求都直接访问数据库,一旦有一个请求正确查询到数据库时,将结果存入缓存中,其他的线程获取锁失败后,让其睡眠一会,之后重新尝试查询缓存,获取成功,直接返回结果;获取失败,则再次尝试获取锁,重复上述流程。

- 缓存与数据库的一致性问题:更新、删除缓存中数据以及数据库中的数据的时间先后导致。选择这两种:

- 先删除缓存,再更新数据库
- 先更新数据库,再删除缓存

- 【先删除缓存,再更新数据库】在读写并发时,会产生缓存是旧数据,而数据库是新数据的问题,这该如何解决呢?**延时双删**
展开
评论
#青训营笔记创作活动#
2023/2/6 打卡day23
今日学习
缓存的介绍

- Java中缓存:`Ehcache`或者`Guava Cache`、`Caffeine Cache`等

- 本地缓存在集群多节点场景下会遇到的一个很常见的**缓存漂移**现象

- 使用**集中式缓存**解决节点间缓存不一致问题:Redis、Memcached,常常与`MySQL`等持久化数据库搭配使用,放在数据库前面进行扛压

- 对于一些**变更频率比较高**的数据,采用`集中式缓存`,这样可以确保数据变更之后所有节点都可以实时感知到,确保数据一致;

对于一些**极少变更的数据**(比如一些系统配置项)或者是一些**对短期一致性要求不高**的数据(比如用户昵称、签名等)则采用`本地缓存`,大大减少对远端集中式缓存的网络IO次数。

- 缓存使用场景:降低自身CPU消耗、减少对外IO交互、提升用户个性化体验
- 业务与缓存的集成模式:典型的会有`旁路型缓存`、`穿透型缓存`与`异步型缓存`三种。

- 缓存的一致性保证
展开
评论
#青训营笔记创作活动#
2023/2/5 打卡day22
今日学习
高并发下设计秒杀系统的九个细节

1. 瞬时高并发:页面静态化、CDN加速、缓存、mq异步处理、限流、分布式锁
2. 页面静态化:通过页面静态化减少无效请求;通过CDN实现使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
3. 秒杀按钮:js文件控制、将css、js和图片等静态资源文件提前缓存到CDN上,让用户能够就近访问秒杀页面。
4. 读多写少:改用缓存,比如:redis。即便用了redis,也需要部署多个节点。
5. 缓存问题:
1. 缓存击穿:分布式锁+缓存预热
2. 缓存穿透:使用布隆过滤器(分场景,可以同步存在或者不存在的商品id)
6. 库存问题:预扣库存
1. 数据库扣减库存:使用 单条sql语句实现防止库存超卖的情况
2. redis扣减库存:redis的incr方法是原子性的,可以用该方法扣减库存。
3. lua脚本配合redis
7. 分布式锁
1. redis的分布式锁,首先想到的是setNx命令。
2. 使用redis的set命令,它可以指定多个参数。
3. 自旋锁
4. redisson
8. mq异步处理
1. 消息丢失问题:加一张消息发送表。
2. 重复消费问题:加一张消息处理表。
3. 垃圾消息问题:
4. 延迟消费问题:使用延迟队列rocketmq
9. 如何限流:基于nginx或者redis限流
1. 对同一用户限流
2. 对同一ip限流
3. 对接口限流
4. 加验证码
5. 提高业务门槛
展开
评论
#青训营笔记创作活动#
2023/2/4 打卡day21
今日学习

为什么用公钥加密却不能用公钥解密?

- 加密的数学原理
- HTTPS:TCP三次握手 + TLS 四次握手,目前主流的是TLS1.2
- TLS四次握手的过程中涉及到两对私钥和公钥。分别是服务器本身的私钥和公钥,以及CA的私钥和公钥。

(先跳过redis的内容)
展开
评论
#青训营笔记创作活动#
2023/2/3 打卡day20
今日学习
MySQL 索引相关知识

- MySQL 索引的创建方式:create、alter、DDL
- 查询、删除、指定索引:show、drop、FORCE INDEX
- MySQL 索引分类
- 全文索引的介绍与使用
展开
评论
#青训营笔记创作活动#
2023/2/2 打卡day19
今日学习
MySQL 索引应用

- MySQL 各索引的优劣
- 如何正确建立索引
- 使用联合索引代替单值索引
- 索引失效的场景
- 索引覆盖&索引下推
- MRR 机制:减少离散 io
- 联合索引的跳跃扫描
展开
评论
#青训营笔记创作活动#
2023/2/1 打卡day18
今日学习
在线数据库管理平台 Bytebase 的介绍
Bytebase是一款面向开发者的数据库变更管理工具
文章主要介绍了其在数据库运维方面的功能以及操作
(但是感觉跟主流的navicat、mysql workbench 区别不大)
展开
评论
#青训营笔记创作活动#
2023/1/31 打卡day17
今日学习

SQL优化思路

- 在 慢查询日志 中查看记录到的慢SQL
- explain 的使用以及返回加过的讲解
- profile 查看 SQL 执行耗时
- Optimizer Trace分析详情
- 导致慢查询的情况:
- 隐式转换:MySQL 在数字与字符串比较时,会将数字转换位浮点数在作比较。隐式转换会导致索引失效
- 联合索引的最左匹配
- limit :select … limit 1000,10 -> 标签记录法 or 延迟关联法
- in 元素过多
- order by 文件排序:Using filesort 表示使用文件排序 -> 建立索引、优化max_length_for_sort_data、sort_buffer_size等参数
- != 以及 <> 导致索引失效
- where 子句中,索引字段使用 is null, is not null 导致索引失效
- 左右连接,关联的字段编码格式不一样
- group by使用临时表 :内存临时表太大导致慢,优化:group by 后面字段加索引;order by null 不排序(group by 本身会排序)
- delete + in子查询不走索引!
展开
评论
#青训营笔记创作活动#
2023/1/30 打卡day16
今日学习

SQL 语句的执行

- MySQL 连接池与客户端连接池
- SQL 执行的流程:查询与写入的流程
- 优化器的一些优化准则
- SQL 执行完毕后是如何返回的
展开
评论
#青训营笔记创作活动#
2023/1/29 打卡day15
今日学习

502问题的排查

- HTTP 状态码:200是正常响应,4xx是客户端错误,5xx是服务端错误。
- nginx:客户端和服务端之间加入nginx,可以起到**反向代理和负载均衡**的作用,客户端只管向nginx请求数据,并不关心这个请求具体由哪个服务器来处理。
- 后端 crash 的情况:
- 后端服务端应用如果发生崩溃,nginx在访问服务端时会收到服务端返回的RST报文,然后给客户端返回502报错。502并不是服务端应用发出的,而是nginx发出的。因此发生502时,后端服务端很可能没有没有相关的502日志,需要在nginx侧才能看到这条502日志。
- 排查 502 :优先通过监控排查服务端应用是否发生过崩溃重启,如果是的话,再看下是否留下过崩溃堆栈日志,如果没有日志,看下是否可能是oom或者是其他原因导致进程主动退出。如果进程也没崩溃过,去排查下nginx的日志,看下是否将请求打到了某个不知名IP端口上。
展开
评论
#青训营笔记创作活动#
2023/1/28 打卡day14
今日学习

今天的文章介绍了后端程序员应该有的好习惯

1.注释尽可能全面,写有意义的方法注释
2.项目拆分合理的目录结构
3. 不在循环里远程调用、或者数据库操作,优先考虑批量进行。
4. 封装方法形参
5. 封装通用模板
6. 封装复杂的逻辑判断条件
7. 保持优化性能的嗅觉
8. 可变参数的配置化处理
9. 会总结并使用工具类。
10. 控制方法函数复杂度
11. 在finally块中对资源进行释放
12.把日志打印好
13. 考虑异常,处理好异常
14. 考虑系统、接口的兼容性
15. 代码采取措施避免运行时错误
展开
评论
#青训营笔记创作活动#
2023/1/27 打卡day13
今日学习
网络原理科普

作者自底向上地介绍科普网络协议:
- 传输方式:电路传输、报文传输、分组交换
- 介绍了路由、IP地址、网络的边界等。

展开
评论
#青训营笔记创作活动#
2023/1/26 打卡day12
(计网没学太透先跳过原来的day12文章了)
今日学习

MySQL 整体架构
整体架构包括网络连接层(数据库连接池)、系统服务层(SQL接口,解析器,优化器,缓存&缓冲)、存储引擎层、文件系统层(日志模块,数据模块)
文章简略介绍了上面的内容
展开
评论
关注了
竹子爱熊猫
VIP.1 初学乍练
#青训营笔记创作活动#
2023/1/25 打卡day11
今日学习
代码规范

一些新学到的关于代码规范的点,有一些没遇到过的不是很懂。。

- try catch 内部代码抽成一个方法:针对 try 内部代码太长
- 多用return:针对 if 嵌套
- if条件表达式不要太复杂:用中间变量替换过长的 if 条件
- 参数校验:使用注解?
- 统一返回值、异常处理:Spring?
- 尽量使用聚合/组合代替继承:聚合和组合的区别就是,组合是当对象一创建的时候,就直接给属性赋值,而聚合的方式可以通过set方式来设置。
- 使用线程池代替手动创建线程
- 集合使用应当指明初始化大小:集合扩容导致性能消耗
- 使用StringBuilder进行字符串拼接而不是使用 "+"
展开
评论
下一页
个人成就
文章被点赞 2
文章被阅读 3,458
掘力值 115
收藏集
1
关注标签
0
加入于