秒杀系统设计注意点3 | 青训营笔记

80 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

这篇文章主要是收集了笔者在学习今天的课程,在学习了一些秒杀系统设计与实现课程后并进行实践操作后,总结了一些注意点。

秒杀系统设计注意点3

使用缓存带来的相关问题

缓存穿透

我们都知道,使用缓存可用加快用户进行查询业务的效率,这是因为:当第一个用户在执行查询后,发送sql查询语句到数据库,如果查询到了数据,那么此时就会把这个数据存储到缓存中。这样,以后的用户在查询该数据后,就会击中缓存,从而直接从缓存中得到数据而不用发送查询语句到数据库了。然而,这样的效果需要一个前提:这些用户查询的目标在数据库中是有数据的!

而缓存穿透就是,如果有一大群用户查询在数据库中没有的数据,那么这些请求就都会在访问缓存后,继续访问数据库,无疑会带来巨大压力。

解决方案:

  • 缓存空值:

即当第一个用户在执行查询后,发送sql查询语句到数据库,此时如果查询不到数据,那么就直接生成一个空值到缓存中,标记这个目标是空值,即无数据。这样后面进行查询的用户就可以继续从缓存中得到提示的空值了,而不需要继续访问数据库。

  • 01MAP存储器

我们还可以在查询缓存之后、查询数据库之前,继续在一个01MAP存储器中查询目标是否不存在。

这个存储器主要是存储目标的存在情况,1表示不存在,0表示不知道存不存在,需要访问数据库才知道。其中,key值常常设置为目标id的哈希值。

容易看出,这种方法的瓶颈是哈希方法的冲突率。当冲突率过高时,这个方法也就不适用了。

常被作为01MAP存储器的有:布漏过滤器、各式各样的bitmap,如redis的BitMap。

待补充