2026/3/1 23:51:26
网站建设
项目流程
做网站的外包能学到什么,星空影视文化传媒制作公司,动漫制作专业的认知,阿克顿巴网站建设的目的登录模块采用的是用户的手机号作为用户名#xff0c;登录的时候先去判断手机号是否存在#xff0c;然后再判断密码是否正确。当进行密码判断时#xff0c;为了保证用户的密码的安全性#xff0c;我这里使用了md5进行两次加密操作#xff0c;首先通过salt值对输入密码进行第…登录模块采用的是用户的手机号作为用户名登录的时候先去判断手机号是否存在然后再判断密码是否正确。当进行密码判断时为了保证用户的密码的安全性我这里使用了md5进行两次加密操作首先通过salt值对输入密码进行第一次加密md5加密从而防止网络传输的过程中密码被截取然后在到达服务端后在进行第二次md5加密是为了防止数据库的信息泄露时用户信息被反推出来之后再将客户端输入密码与数据库中的密码相对比。如果密码正确则通过uuid随机生成一个token标记该用户并向cookie中写入此tokenredis中存储此token与用户信息的映射当该用户再次登录时从cookie中取出token再去redis中取出与此token对应的用户信息。秒杀模块首先判断用户是否为空然后去判断库存是否充足这里为了解决超卖问题首先在sql语句上加入了库存大于0的判断然后还设置了唯一索引来防止一个用户多次秒杀并且将预库存缓存到了redis当中当一个秒杀请求到达时判断预库存是否还足够同时判断是否已经有了该用户的秒杀订单。这里为了优化用户体验还用上了rabbitmq消息队列先将该秒杀请求放入消息队列中以此实现了异步操作就可以让用户不用等待在这里然后接收端会从消息队列中取出消息进行处理这里就是真正的去数据库判断库存是否足够了并且再次判断用户是否已经秒杀过了然后进行真正的减库存下订单生成订单的操作在消费者处理消息的过程中客户端会自动轮询来判断秒杀的情况。与此同时考虑到如果对redis的访问中有过多的无效访问的话资源开销也是较大的为了解决这个问题我使用了内存标记来减少对redis的访问即设置一个mapkey是商品value在系统初始化时设置成false当预库存不足时设置成true。当秒杀请求到达判断预库存之前会先判断该商品的value是否为true为true就直接返回秒杀失败。秒杀中如何处理超卖问题直接由数据库操作库存的sql语句如下所示。依靠MySQL中的排他锁实现update table_prmo set num num - 1 WHERE id 1001 and num 0利用redis的单线程特性预减库存处理秒杀超卖问题在系统初始化时将商品以及对应的库存数量预先加载到Redis缓存中缓存预热接收到秒杀请求时在Redis中进行预减库存decrement当Redis中的库存不足时直接返回秒杀失败否则继续进行第3步将请求放入异步队列中返回正在排队中服务端异步队列MQ将请求出队出队成功的请求可以生成秒杀订单减少数据库库存返回秒杀订单详情。秒杀中如何解决重复下单问题前端就是客户端点击下单之后在收到服务端响应之前按钮置灰。服务器端在服务端做防重/幂等的处理幂等1.利用数据库实现幂等可以在订单表里添加一个字段requestId添加唯一索引这样一来如果是重复的请求在落库的时候就会报错为了保证幂等性我们可以catch住这个异常根据requestId获取订单号然后向客户端响应订单号。缓存和数据库数据一致性如何保证先删除缓存再更新数据库。解决方案是使用延迟双删。延时双删的方案的思路是为了避免更新数据库的时候其他线程从缓存中读取不到数据就在更新完数据库之后再 Sleep 一段时间然后再次删除缓存。Sleep 的时间要对业务读写缓存的时间做出评估Sleep 时间大于读写缓存的时间即可。流程如下线程1删除缓存然后去更新数据库。线程2来读缓存发现缓存已经被删除所以直接从数据库中读取这时候由于线程1还没有更新完成所以读到的是旧值然后把旧值写入缓存。线程1根据估算的时间Sleep由于 Sleep 的时间大于线程2读数据写缓存的时间所以缓存被再次删除。如果还有其他线程来读取缓存的话就会再次从数据库中读取到最新值。减库存成功了但是生成订单失败了该怎办将减库存与生成订单操作组合为一个事务。要么一起成功要么一起失败。密码校验用户端PASS MD5(明文固定Salt) 作用防止用户的明文密码在网络上进行传输服务端PASS MD5(用户输入 随机Salt) 作用防止万一数据库被盗反查表得到密码如何去减Redis中的库存decrement API减库存increment API回增库存。以上的指令都是原子性的。秒杀系统面临的问题有哪些高并发超卖、重复卖问题脚本恶意请求数据库扛不住加了缓存之后的缓存三大问题击穿、穿透、雪崩秒杀接口地址隐藏在秒杀之前先通过uuid随机生成一个额外的path与url拼接生成秒杀路径然后将该path和用户id一起存入redis这样当用户访问的时候就不是直接暴露原来的地址了而是加上了url后的地址就实现了秒杀接口地址的隐藏。在执行秒杀的时候如果想要访问秒杀接口则要先从redis中取path进行验证判断该path是否存在存在的话才能进行下面的秒杀活动同时我还加上了用户验证码也就是在获取秒杀地址的时候先通过验证码才能获得。入口大流量限制采取发放令牌机制控制流量根据商品id和一串uuid产生一个令牌存入redis中同时引入了秒杀大闸目的是流量控制比如当前活动商品只有100件我们就发放500个令牌秒杀前会先发放令牌令牌发放完则把后来的用户挡在这一层之外控制了流量。秒杀令牌token每秒钟生成多少个跟随用户的请求会动态变化令牌桶机制可以控制每秒生成令牌的个数。防刷进行了限流操作将用户的访问次数保存在了redis中每访问一次次数减1这里设置的是5秒钟内点击5次的。https://blog.csdn.net/weixin_47556194/article/details/127331771