
获得徽章 1
- #青训营笔记创作活动#
2月15日 打卡day34
今日学习: redis知识点总结
**优点:**
1. 完全基于内存操作,性能极高,读写速度快,Redis 能够支持超过 100KB/s 的读写速率
2. 基于io多路复用支持高并发,支持10万级别的并发读写
3. 单线程处理命令, 保证命令原子性
4. 支持主从模式,支持读写分离与分布式
5. 具有丰富的数据类型与丰富的特性(发布订阅模式)
6. 支持持久化操作,不会丢失数据
**缺点:**
1. 数据库容量受到物理内存的限制,不能实现海量数据的高性能读写
2. 相比关系型数据库,不支持复杂逻辑查询,且存储结构相对简单
3. 虽然提供持久化能力,但实际更多是一个 disk-backed 功能,与传统意义上的持久化有所区别
[刨根问底 Redis, 面试过程真好使 - 掘金 (juejin.cn)](juejin.cn)
展开评论点赞 - #青训营笔记创作活动#
2月14日 打卡day33
今日学习: 跨域问题
出现跨域问题的场景
1. 协议不同, http与https
2. 域名不同
3. 端口不同
解决跨域问题
1. @CrossOrigin标注允许跨域的域名, 只能对单个controller生效
2. 配置文件实现跨域: 在WebMvcConfigurer中实现addCorsMappings方法
3. CorsFilter跨域, 与方法2类似, 实现一个CorsFilter Bean对象, 对其配置跨域参数
4. 通过Response跨域: 在Response头中设置跨域Header: Access-Control-Allow-Origin
跨域原理: 浏览器为了安全考虑, 默认不允许不同域名的网站直接发送Http请求, 需要加入
Access-Control-Allow-Origin等Header配置.
在实际部署时, 可以使用Nginx启动反向代理, 将前后端代理到同一域名下.
[面试突击81:什么是跨域问题?如何解决? - 掘金 (juejin.cn)](juejin.cn)
展开评论点赞 - #青训营笔记创作活动#
2月13日 打卡day32
今日学习: Hertz 集成 JWT
1. 用户登录: 新建jwt对象, 传入Key(加密token), Timeout(超时时间), MaxRefresh(最大刷新时间), Authenticator(验证用户登录), PayloadFunc(基于用户信息生成token)
2. 将token信息从接口返回
3. 访问配置jwt的中间件时: 对token进行校验
4. 从token中可以反向获取用户的信息
[使用 Go HTTP 框架 Hertz 进行 JWT 认证 - 掘金 (juejin.cn)](juejin.cn)
展开评论点赞 - #青训营笔记创作活动#
2月11日 打卡day30
今日学习: 缓存
- 本地缓存
基于接口维度, 在内存中做短期缓存
java中的框架有 Ehcache, Guava Cache, Caffeine Cache
会出现缓存漂移(多次刷新内容, 命中到不同后台服务后, 响应不一致)
- 集中式缓存
redis集群, 可以实现跨机器的缓存, 并且方便的进行扩容
- 缓存一致性
- 先更新缓存, 在更新数据库
- 先更新数据库, 再更新缓存
- 先删除缓存, 在更新数据库
- 先更新数据库, 再删除缓存
低并发的场景下可以利用数据库的事务特性, 将更新缓存与更新数据库放到同一事务中, 如果更新缓存失败则同步回滚
高并发场景下可以结合`重试`+`mq异步补偿`的方式更新缓存, 保证数据的最终一致性
[聊一聊作为高并发系统基石之一的缓存,会用很简单,用好才是技术活 - 掘金 (juejin.cn)](juejin.cn)
展开评论点赞 - #青训营笔记创作活动#
2月10日 打卡day29
今日学习: AOP+Redis+注解 实现接口ip限流
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Order(Ordered.HIGHEST_PRECEDENCE)
public @interface RequestLimit {
/**
* 允许访问的次数,默认值120
*/
int count() default 120;
/**
* 间隔的时间段,单位秒,默认值60
*/
int time() default 60;
/**
* 访问达到限制后需要等待的时间,单位秒,默认值120
*/
int waits() default 120;
}
```
通过AOP对方法切面, 在方法执行前进行拦截
具体实现步骤:
1. 解析注解参数
2. 解析请求信息: ip和方法
3. 生成key
4. 获取redis中该key的访问次数
5. 判断次数是否超过范围
- 若超出范围,则拒绝访问,返回提示,并将TTL重置为注解上的等待时间
- 若没有超过范围,则允许访问,并将访问次数+1
- 若查询不到该key,则往redis中进行添加,将值设置为1,将TTL设置为注解上的值
[基于 AOP + Redis + 自定义注解 实现细粒度的接口IP访问限制 | 开源微服务项目 - 掘金 (juejin.cn)](juejin.cn)
展开评论点赞 - #青训营笔记创作活动#
2月9日 打卡day28
今日学习 秒杀系统设计
(又是一片秒杀系统, 十分经典的场景设计)
特点
- 瞬时流量高
- 读多写少
- 实时性要求高
解决思路
1. 页面静态化: 避免刷新页面的请求频繁消耗后端接口资源
2. CDN加速: 将前端资源缓存到CDN服务器上, 提升访问速率
3. 缓存: 商品详情信息缓冲到redis中
- 缓存击穿: 大量请求到来, 且redis没有保存商品信息, 则会将流量导入到数据库中, 将数据库击穿. 解决: 需要使用分布式锁, 保证同一商品详情, 只有一次请求
- 缓存穿透: 非法请求传入不存在的商品id, 此时redis没有缓存, 需要一直访问数据库. 解决: 布隆过滤器, 过滤不存在id
- 缓存雪崩: 缓存在同一段时间内一起到期, 流量又进入数据库. 解决: 随机过期时间, 定期更新缓存
4. mq异步处理
- 消息丢失: 加入消息发送表+job重试
- 重复消费: 消费处理表
- 垃圾消息: 设置重试上限
- 延迟消息实现未支付订单超时
5. 限流
6. 分布式锁
查询商品信息时, 防止多余数据库访问, 使用redis添加分布式锁
7. 库存:
下单接口采用redis减库存+mq异步生成订单
为保证redis减库存的原子性(查询剩余库存+减库存), 使用lua脚本操作redis
减redis库存完成后, 放入mq中, 开启订单消费服务生成订单 (如果需要秒杀成功后实时查询订单, 可以考虑生成令牌, 用户查询时传入令牌, 提前消费)
[高并发下秒杀商品,你必须知道的9个细节 - 掘金 (juejin.cn)](juejin.cn)
展开评论点赞