赞
踩
自己开源的项目,是一个基于Java的高并发商品秒杀系统平台项目,使用的是SpringCloud微服务构架方案,前后端分离,前端用React写的。
本文是自己总结的一些秒杀难点和知识点吧,如果大家有兴趣可以来我的Github开源项目上来看一看,提一些意见,大家一起讨论一些东西。
我的github开源项目
页面缓存思路:首先我们需要明白,一个页面是从后端提高数据后,交给springMvc或者SpringBoot进行渲染,主要的页面消耗是在渲染这部分。因此我们需要在这之前进行拦截。当客户的请求到达后端时,先去redis中查询缓存,如果缓存中找不到,则进行数据库逻辑操作,然后渲染,存入缓存并返回给前端!如果在缓存中找到了则直接返回给前端。存储在Redis缓存中的页面需要设置超时时间,缓存的时间长度根据页面数据变化频繁程度适当调整。
所谓热点数据,就是指在某段时间内被频繁使用的对象数据。比如用户登录信息,用户在登录后,每次访问都会携带其cookie信息进入后端,当信息到达后端后,其cookie信息就是我们存在redis中的key值。在这一步我们会做四个操作,并且在某些时候可使用拦截器进行处理。
热点数据缓存,页面静态化进行ajax请求信息更新,此类信息一般都是比较频繁发生变化的,涉及的可能是需要保存在数据库的操作,类似表格信息,即时刷新的数据等!如果是属于查看类的并且前端大量请求,可以经由于后端监控,定时写入缓存。
一般情况下封装以类名–对象名为组合的字符串作为Redis的Key值,然后存入数据库,每次访问到目标的方法都先去缓存读取,然后再处理
缓存雪崩问题:
缓存雪崩是指因为数据未加载到缓存中,或者缓存同一时间大面积的失效,在某一时刻大量的缓存没有命中,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
缓存穿透问题:
查询一个数据库必然不存在的数据,那么缓存里面也没有。比如文章表中查询一个不存在的id,每次都会访问DB,如果有人恶意破坏,发送高频请求,那么很可能直接对DB造成影响。对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。或者对于查询为空的字段,设置一个默认值在缓存中,如果查询到则返回默认值! 或者使用具备特点的key值,如果不符合则经由于系统过滤掉,不进入缓存也不进入数据库,此做法可以降低一定的压力,但是解决不了根本的问题
缓存失效问题:
如果缓存集中在一段时间内失效,DB的压力凸显,DB负载急剧上升。这个没有完美解决办法,但可以分析用户行为,尽量让失效时间点均匀分布。
缓存预热问题:
系统部署时,防止用户一瞬间访问数据库,负载过大,由开发人员主动将数据加载到缓存中
除了将页面资源与数据进行缓存以减少数据库访问外,还可以利用浏览器特点,将页面给完全缓存在浏览器中,等到浏览器过时,再访问项目,项目的请求经过项目内部缓存,缓存如果过时,再访问数据库!
将页面静态化的特点必须解决页面如何获取与处理数据,如何跳转页面的问题!在此我们可以参考 ajax技术 ,将请求与页面完全独立,保证页面是静态页面,而请求通过Ajax技术局部刷新与全局刷新的特点来实现。
Redis缓存减少对于数据库的访问,数据库的访问压力是秒杀系统中的瓶颈。内存标记方法也可以减少Redis的访问。
把session的id写入cookies,并且把session的id和登录用户对象的信息一起写入Redis。利用登录拦截器来检查Redis中的User信息是否对应。这样在微服务分布式的环境下,实现了登录验证。
秒杀接口加盐动态化生成。接口防刷限流–拦截器加注解。
redis的数量不是库存,他的作用仅仅只是为了阻挡多余的请求透穿到DB,起到一个保护的作用
因为秒杀的商品有限,比如10个,让1万个请求区访问DB是没有意义的,因为最多也就只能10个
请求下单成功,所有这个是一个伪命题,我们是不需要保持强一致。
这一步结合消息队列高可用完成。
exchange持久化、queue持久化(项目使用中)、发送消息设置MessageDeliveryMode.persisent这个也是默认的行为、手动确认。
Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:
分布式锁和本地锁之间。单机,并发的单位是线程,分布式,并发的单位是多进程。并发单位的等级上去了,锁的等级自然也得上去。
Redisson框架下的锁,有可重入锁的功能,封装也比较好。
RabbitMQ的高可用主要体现在消息的发送、传输和接收的过程中,可以保证消息成功发送、不会丢失,以及被确认消费/不重复消费。
Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序。应用程序可以通过 http 的方式,或 Spring Cloud 服务发现机制注册到 SBA 中,然后就可以实现对 Spring Boot 项目的可视化管理和查看了。
Spring Boot Admin 可以监控 Spring Boot 单机或集群项目,它提供详细的健康 (Health)信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存查看和管理等功能。
SM3是杂凑、哈希加密,为单向加密函数,无法解密。SM4为分组密码算法,SM2为非对称加密,即有公钥加密,私钥解密。对称加密为统一公钥加密。
如何设计一个秒杀系统总结
Java项目构建基础:统一结果,统一异常,统一日志
秒杀系统设计
秒杀系统更高级的参考
为什么现在又流行服务端渲染html
页面优化缓存技术+资源静态化+前后端分离?
redis分布式锁与redisson
什么是悲观锁、乐观锁
Jmeter常用的组件
Java RabbitMQ快速入门教程
RabbitMq 入门介绍
一篇文章把RabbitMQ、RocketMQ、Kafka三元归一介绍
高可用架构-消息队列
MyBatis-Plus 高级功能 —— 多数据源配置
Spring Cloud Gateway 自定义过滤器实现降级
前端性能测试工具
Mysql集群实战
Springboot admin监控
SpringBoot admin配置
Springboot admin 配合邮件警告
RocketMQ 知识点和使用
RocketMQ官方文档博客
Hutool 国密使用文档
SpringBoot Docker容器化部署
秒杀方案参考
聊聊电商系统中常见的9大坑
Spring Cloud Gateway 限流实战
常用消息队列 Kafka、RabbitMQ、RocketMQ、ActiveMQ 综合对比
Nginx从安装到高可用,一篇搞定!
36个接口设计锦囊
了解 QPS、TPS、RT、吞吐量 这些高并发性能指标
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。