#青训营笔记创作活动# 问题描述
小F被神秘力量带入了一个魔幻世界,这里危机四伏。为了在异世界中生存,小F需要找到安全区。异世界可以被表示为一个大小为n x m的二维数组,每个格子的值代表该位置的危险程度。
小F的能力值为X,当某个格子的危险程度小于等于X时,这个格子是安全的。如果多个安全的格子相邻(上下左右连通),它们可以构成一个安全区。你需要帮助小F计算出一共有多少个安全区。
测试样例
样例1:
输入:n = 3, m = 3, X = 4, a = [[2, 3, 3], [3, 3, 3], [3, 3, 3]]
输出:1
样例2:
输入:n = 2, m = 2, X = 5, a = [[6, 6], [6, 4]]
输出:1
样例3:
输入:n = 3, m = 3, X = 3, a = [[1, 2, 2], [2, 3, 3], [3, 4, 5]]
输出:1
题解:
一个原二维数组,新建一个visited数组记录是否经过,直接全部遍历,遇到安全值小于能力值且没经过的点就进入while循环。while循环通过队列实现安全区域的搜寻,通过maxnum记录安全区域的个数。
#青训营笔记创作活动#
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)
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)](
展开
评论
点赞