一、表的设计

关于秒杀这块,一场秒杀活动有好几个场次,一个场次中有多个商品可以被秒杀,从这一句话就可以得出三张表
表1:秒杀活动表:

表2:限购场次表
表3:商品限购场次与商品关联表也就是说一个商品,得知道该商品属于哪次活动的哪个场的秒杀商品~
注:秒杀活动的库存不走SKU库存

二、关于商品详情页

商品详情这块应该是访问QPS最多的业务了,每次查商品详情都走数据库的话,后台受不了所以需要做优化qps

(一)不加缓存直接头铁到DB上查,测一测QPS
先估测一个值 从200开始 慢慢的压 以100为一个梯度。可能500的时候,10秒内处理不完,所以 找到最高水准,大概QPS120左右,每秒能处理120左右的请求,因此走库,非常划不来,此时CPU主要耗在在mysql上

(二)如何优化,加一级缓存:本地localCache 二级缓存:Redis集群

 首先刚开始做的时候,我只考虑了redis做一级缓存,实现起来很简单,先到redis中通过商品ID查redis中是否有,没有则走DB,并将查到的信息缓存到redis中

但是这样搞有问题,因为我们服务器的性能由网卡、CPU、内存以及磁盘I/O决定,每次从redis取,redis毕竟部署到集群上,可能会跟redis会有本地通信,网卡、内存、cpu、磁盘IO影响服务器性能,通过网卡进行连接,一级序列化和反序列化肯定会有性能上的影响。

因此选择再加一个本地缓存,先考虑的ConcurrentHashMap,但是,因为无淘汰机制,所以时间长了必会发生内存泄漏,就GG了。

因此放大招:使用Google 的Guava Cache,其原理和LRU类似,每次可设置其超时时间,就是设置写缓存后多久过期,

把最长时间没有使用的对象淘汰掉。还可以设置时间,如果一个对象在写入之后,
如果超过一定时间没使用,则淘汰
//初始化一个容量
initialCapacity(10)
//设置本地缓存的最大容量
.maximumSize(500)
//设置写缓存后多少秒过期
.expireAfterWrite(60, TimeUnit.SECONDS).build();

三、缓存失效(缓存击穿)的解决策略

秒杀场景是一个浪涌的场景,一不小心在请求最高点,缓存因为超时集体失效了,,,傻眼了。DB受不鸟啊。。。

咋解决:

可以加一把分布式锁,Synchronized只对当前JVM进程有效,微服务并不是所有都运行在一个JVM里面。
Redission实现,

加分布式锁的效果就是,在走查询数据库时,会限制查询该商品的QPS。

所以分布式锁代码加在一级缓存、二级缓存查数据之后,也就是一级缓存、二级缓存没查到,在去查数据库时,加上分布式锁
T1,t2,t3,T1拿到锁,t2 t3 等待,t1会把在数据库中查询到的数据缓存到一级和二级中去。T1释放锁,则t2 t3 可以开始干活了,直接就在缓存中查就行了。

四、缓存穿透问题

问题描述:伪造一个id,db上不存在,因此缓存上也不存在,只能打到DB上去,这样DB直接打挂了。
分布式锁也只能拦住一个产品(id),如果我伪造了1亿个,你分布式锁能顶住?

解决思路:
若能鉴别出来是不是有这样产品,先判断下ID是否存在,
造一个防火墙(特性:足够快,准,狠,压缩数据),先走防火墙判断查询是否合法。

这个防火墙就是
布隆过滤器
这玩意儿的缺点也有啊 :
缺点:有一定误判率,数据删除困难。

每次走请求查询商品时,会有拦截器先解析URL,解析出id,先去布隆过滤器中查看id,找到了直接返回,找不到则做出一种非法响应,不走controller逻辑了,直接从拦截器返回出去。

谷歌的Guava包创建布隆过滤器

private static final BloomFilter<String> bloomFilter =
BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8),1000000,0.01);

其中参数是指:
布隆过滤器在New 出来后,会在底层形成一个比特位(bit) 一字节=8bit数组
10000000初始容量,0.01 容错率。

布隆过滤器原理:
Id—>布隆过滤器有一定量的Hash函数—>计算一个值,作为索引的位置---->对应位置上的值从0改到1---->因为有多个Hash函数计算,因此在取商品时必须保证所有位置上的都为1,才认为该元素在DB中存在,才放行。

每次先match一下ID,是否在布隆过滤器中。

以上是属于单机的布隆过滤器,不适合于微服务

分布式布隆过滤器的咋玩?

布隆过滤器应改成分布式的,集中放在redis里
Key为产品id,value是通过Hash函数计算后的各个索引位置。

那么下次取的时候,首先通过过滤器,判断存在redi中的布隆过滤器中的每个索引位置都必须是1,则存在当前id产品,存在则返回true,达到一种防火墙的作用,可有效抑制缓存穿透。
注:布隆过滤器会根据你的初始化容量,来计算出来(多少个哈希函数、和多大的数组)

但是可能会与redis交互7次,操蛋。。。
可以用远程RPC调用,(不会。。)

五、大厂里都不是一级二级缓存了,真low

那咋玩的? 了解下CDN和Nas盘,真牛。
大厂真正怎么做,秒杀活动,页面静态化(页面全局唯一)+CDN

静态页面资源组成:
1、图片
2、CSS
3、JS
4、Html文件

秒杀活动开始前,图片、css、html、JS(vue\jquery,公共js) 分发到CDN(使用户就近获取所需内容),-----缓存预热
MiaoshaAction.js
1、设置购买按钮的点亮
2、秒杀接口的信息
秒杀活动开始前:

对秒杀商品这块先做一个多级缓存优化相关推荐

  1. 千万级并发!如何设计一个多级缓存系统?

    作者:不清不慎,目前在杭州蘑菇街公司任职,Java大数据开发工程师一枚,热爱研究开源技术! 架构师社区合伙人! 首先我们需要明白,什么是一个多级缓存系统,它有什么用.所谓多级缓存系统,就是指在一个系统 ...

  2. fifo页面置换算法设计思路_千万级并发!如何设计一个多级缓存系统?

    什么是一个多级缓存系统?它有什么用?我们又如何设计一个多级缓存系统? 图片来自 Pexels 所谓多级缓存系统,就是指在一个系统的不同的架构层级进行数据缓存,以提升访问效率. 我们都知道,一个缓存系统 ...

  3. 树莓派做一个dns缓存

    树莓派做一个dns缓存 还是转载的别人的, 搭建树莓派上的dns缓存服务首先安装dnsmasq, sudo apt install dnsmasq 之后修改配置文件 vim /etc/dnsmasq. ...

  4. 新手怎么做一个免费的单页面响应式网站?

    单页面网站近年来受到很多企业青睐,一个干干净净的单页面,不仅能直观地传达企业信息,在展示上也给了企业更多的可能性.部分企业做单页面网站是为了做营销活动,不仅能为主站引流,更能让单页网站的转化更为直观, ...

  5. 设计高并发架构与系统多级缓存架构如何设计?

    高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适合自己 ...

  6. 实现多级缓存的架构设计方案

    来源:segmentfault.com/a/1190000017142556/ -     目录    - 为什么要做 TMC 多级缓存解决方案的痛点 TMC 整体架构 TMC 本地缓存 如何透明 整 ...

  7. vue v-if判断数组元素的值_Vue项目上线做的一些基本优化

    前言 本文主要是做一个Vue性能优化的帖子,做一个参考文档,对以后项目上线做一些集合文档.如果对各位在项目优化时,做一个文档参照. 开发过程 在开发项目的时候,就要注意项目的一些小技巧,下面我就罗列一 ...

  8. vue v-if判断数组元素的值_我对Vue项目上线做的一些基本优化

    前言 大家好啊,我是wangly19,一名前端摸鱼小能手.最近忙着开源项目的东西,还有公司项目的迭代问题,导致更新文章的频率有点低了.也来聊聊我在干嘛吧. 第一个事情就是比较我的阉割版UI Desig ...

  9. 自动seo网站源码_做了利于SEO优化的网站建设,企业的网站就能自动排名靠前?...

    这些年,eGoBest发现很多人做网站建设有个错误的观点,尤其是做了营销型品牌网站的企业,都以为只要做一个利于SEO优化好的网站,,Google和百度等搜索引擎就能自动排名靠前,这都是错误的观点,下面 ...

最新文章

  1. 鱼和熊掌可以兼得! 天昊生物微生物16S扩增子绝对定量测序检测新模式创双赢!...
  2. 【Interfacenavigation】XML中的字体(27)
  3. linux教程 sed命令的用法,Linux文本处理三剑客——sed命令使用教程
  4. .Net DES加密解密(不带向量)
  5. [设计模式] ------ 对比总结:简单工厂模式、工厂方法模式、抽象工厂模式
  6. java中bean对象_JAVA中PO,BO,VO,DTO,POJO,Entity,JavaBean,JavaBeans各个对象的区别,以及lombo、jpa简介及用法...
  7. ios系统脚本服务器加速,提高iOS项目的编译速度
  8. Dynamics CRM2016 Update or Create parentcustomerid in Contact using web api
  9. 实验三:分别用for、while和do-while循环语句以及递归方法计算n!,并输出算式...
  10. 单机实验mysql的主从备份(master slaver)
  11. 老李分享:性能测试过程
  12. 计算机软件工程课程设计感想,软件课程设计心得体会.docx
  13. pcb小分享——PCB板组成部分有哪些?
  14. chromecast 协议_如何删除Chromecast的网络范围内的Android通知
  15. Firefox input 光标丢失
  16. Python3内置函数(41-50)
  17. 如何利用计算机进行数制转换,如何教授计算机基础中的数制转换内容
  18. 全国天气预报api接口
  19. 数据库异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
  20. 浅谈短视频背后的社会道德伦理问题(个人观点,仅供参考)

热门文章

  1. Google Earth Engine——地球科学激光测高系统(GLAS)的空间激光雷达数据(2005年)融合的全球树木高度数据集1000m分辨率下载(墨西哥为例)
  2. 常用的7个公共CDN库
  3. 居家办公,公司内网连接问题
  4. 苹果推送服务(APNs)中文文档
  5. 计算机网络原理历年试题,自考计算机网络原理第一章历年试题汇总
  6. 微信小程序的兼容处理汇总(不定期更新)
  7. 百度网盘和视频网站都在用的P2P技术是什么?
  8. 硬件开发基本知识(一):电容去耦、旁路、滤波的概念
  9. YOLOv5/v7 应用轻量级通用上采样算子CARAFE
  10. pdf加密、找回密码