项目实战问题

1、 怎么快速给几百万数据的表加索引?

影子策略

方案思路
创建一张与原表(tb)结构相同的新表(tb_new)
在新表上创建索引
重命名原表为其他表名(tb => tb_tmp),新表重命名为原表名(tb_new => tb),此时新表(tb)承担业务
为原表(tb_tmp)新增索引
交换表,新表改回最初的名称(tb => tb_new),原表改回最初的名称(tb_tmp => tb),原表(tb)重新承担业务
把新表数据导入原表(即把新表承担业务期间产生的数据和到原表中)
实践
SQL实现:

以下sql对应上面六步

create table tb_new like tb;

alter table tb_new add index idx_col_name (col_name);

rename table tb to tb_tmp, tb_new to tb;

alter table tb_tmp add index idx_col_name (col_name);

rename table tb to tb_new, tb_tmp => tb;

insert into tb (col_name1, col_name2) select col_name1, col_name2 from tb_new;

缺点
步骤3之后,新表改为原表名后(tb)开始承担业务,步骤3到结束之前这段时间的新产生的数据都是存在新表中的,但是如果有业务对老数据进行修改或删除操作,那将无法实现,所以步骤3到结束这段时间可能会产生数据(更新和删除)丢失。

pt-online-schema-change

pt-online-schema-change 方案利用三个触发器(DELETE\UPDATE\INSERT触发器)解决了“影子策略”存在的问题,让新老表数据同步时发生的数据变动也能得到同步。

工作原理
创建一张与原表结构相同的新表
对新表进行DDL操作(如加索引)
在原表上创建3个触发器(DELETE\UPDATE\INSERT),用来原表复制到新表时(步骤4)的数据改动时的同步
将原表数据以数据块(chunk)的形式复制到新表
表交换,原表重命名为old表,新表重命名原表名
删除旧表,删除触发器

原文链接:https://blog.csdn.net/weixin_35973945/article/details/131397218

2、 更新数据先删缓存还是先更新数据库,各有什么优缺点?怎么解决?

延迟双删策略

先清除缓存,然后再写入数据库。有可能存在删除缓存以后,另一个线程读取数据,发现没有数据,就去数据读取数据,然后写入缓存中,此时缓存中的数据为脏数据;解决办法:

先删除缓存
再写入数据库
休眠500ms
删除缓存 其中第三步骤的500ms,是根据业务读取数据平均耗时,这样做的目的是确保读请求可以结束,写请求可以删除读请求造成的脏数据的问题。

3、什么是 CSRF 攻击?XSS 攻击?如何防范?

CSRF:跨站请求伪造,可以通过通过判断来源和加 Token 的方式来防范。

XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有 CSP

4、为了防止SQL注入,可以采取以下措施:

  • 永远不要信任用户的输入,对用户的输入进行校验,可以通过正则表达式或限制长度等方式。
  • 永远不要使用动态拼装SQL,而应使用参数化的SQL或直接使用存储过程进行数据查询存取。
  • 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
  • 不要把机密信息直接存放,应加密或hash掉密码和敏感信息。
  • 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装。

5、雪花算法

使用1位作为符号位,确定为0, 表示正
使用41位作为毫秒数
使用10位作为机器的ID : 高5位是数据中心ID, 低5位是机器ID
使用12位作为毫秒内的序列号, 意味着每个节点每秒可以产生4096(212) 个ID

6、php-fpm应该如何优化

https://www.nowcoder.com/discuss/516116434313809920

7、什么是索引下推

php-fpm与php-fastcgi的关系?fastcgi配置。

https://blog.csdn.net/weixin_42104231/article/details/83573006

8、redis处理秒杀思路

  * 秒杀需要解决的问题
         * 超卖,库存遗留,未付款问题
         *
         *
         * 步骤一:添加一个秒杀活动,配置本次秒杀的产品ID,库存,开始展示时间,开始时间,结束时间,加入缓存,维护两个个库存字段信息,一个作为总数记录,一个维护实时库存
         * 步骤二:首页获取活动信息,未到开始时间抢购按钮置灰,活动开始后10秒内重复点击只发送一次请求,前端,后端都需要判断,
         * 使用用户ID+活动ID作为key,设置过期时间进行用户是否重复点击判断。如果是,则直接返回提示信息,如果否,则进行下一步
         * 判断实时库存与购买数量对比,如果小于等于0,则返回
         * 步骤三:维护一个已购买的秒杀活动的参与人员的一个无序集合,先判断用户ID是否已经在集合当中了,如果是,则表明已经参加过秒杀,
         * 维护一个目前正在参与活动人员集合,是剩余库存的2倍容量
         *
         *
         * 否:购买的核心代码
         * 如果正在参与活动人员集合 > 剩余库存的2倍容量
         * 是:直接返回
         * 否:加入集合,核心代码
         * 加分布式锁,保证每次只有一个人抢到:未提升可用性,添加多个分布式锁并行抢购
         * 
         * 可以使用算法:给一个最大的锁数量,如果超过就取最大,否则就取 锁数量 = 库存/5, 相当于给没把锁分配了5个库存
         * 这样作的好处是避免某个分布式锁一直占用,那么就会出现少卖的情况,这样也可以并行处理,不用串行化
         * 
         * 如果抢到:再获取一遍库存,对比与购买数量的结果,大于等于,购买成功,生成订单,减少redis库存,从正在参与集合中删除人员,加入已成功购买的集合,加入订单队列,异步执行后续操作。小于:直接返回提示
         * 没有抢到,sleep1秒,重新获取锁,重试3次,还是没抢到锁,直接推出,从正在参与的集合中删除人员
         *
         *
         *
         * 异步队列的作用:
         * 1. 减库存
         * 2. 发送短信,消息,生成商家订单等异步操作
         *
         *
         * 再来一个定时任务:延时任务,使用redis有序集合实现,用来取消超期订单,并释放库存。

9、红包发放策略

预拆包

可能问题,某些营销群发没人抢,浪费cpu
太高内存,可能超过内存,导致失效

实时拆包

可能出现超卖

并发资源争抢问题,高逼格话语

【实用算法】 红包分配 — 二倍均值法

二倍均值法
剩余红包金额为M,剩余人数为N,那么有如下公式:

每次抢到的金额 = 随机区间 (0, M / N X 2)

这个公式,保证了每次随机金额的平均值是相等的,不会因为抢红包的先后顺序而造成不公平。

案例
假设有10个人,红包总额30元。

30/10X2 = 6, 所以第一个人的随机范围是(0,6 ),平均可以抢到 3元。

假设第一个人随机到3元,那么剩余金额是30-3 = 27 元。

27/9X2 = 6, 所以第二个人的随机范围同样是(0,6 ),平均可以抢到3元。

假设第二个人随机到3元,那么剩余金额是27-3 = 24元。

24/8X2 = 6, 所以第三个人的随机范围同样是(0,6 ),平均可以抢到3元。

假设第三个人随机到3元,那么剩余金额是24-3 = 21元。

21/7X2 = 6, 所以第三个人的随机范围同样是(0,6 ),平均可以抢到3元。

假设第四个人随机到3元,那么剩余金额是21-3 = 18元。

以此类推,每一次随机范围的均值是相等的。

10、分布式锁问题

1.锁到期了,程序未执行完
2.加完锁,程序挂了
3.

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值