
获得徽章 2
- #青训营笔记创作活动#
2023/2/10 打卡day27
今日学习
今天主要学习了mysql的锁机制,包括mysql行锁,表锁以及乐观锁和悲观锁等等知识,了解了mysql如何在高并发场景下保证数据读写的安全性
展开评论点赞 - #青训营笔记创作活动#
2023/2/9 打卡day26
今日学习
今天学习的事一些go语言的基础知识,包括go的数组和切片的区别,defer与recover的使用等,此外,作者还介绍了一些go底层相关知识。
展开评论点赞 - #青训营笔记创作活动#
2023/2/8 打卡day25
今日学习
今天学习到了关于数据库分局分表的相关知识,包括为什么要分库分表,如何分库分表以及分库分表带来的问题等等。评论点赞 - #青训营笔记创作活动#
2023/2/8 打卡day25
今日学习
今天学习到了关于数据库分局分表的相关知识,包括为什么要分库分表,如何分库分表以及分库分表带来的问题等等。评论点赞 - #青训营笔记创作活动#
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
- 联合索引的跳跃扫描展开评论点赞