短链接跳转

短链接跳转业务

大多短链接系统短链接跳转逻辑应该是这样的:用户通过浏览器输入短链接访问,通过短链接获取到原始链接并进行跳转。

问题

缓存击穿

缓存击穿指在高并发的系统中,一个热点数据缓存过期或者在缓存中不存在,导致大量并发请求直接访问数据库,从而给数据库造成巨大压力,甚至可能引起宕机。

具体来说,当某个热点数据在缓存中过期时,如果此时有大量并发请求同时访问这个数据,由于缓存中不存在,所有请求都会直接访问数据库,导致数据库负载急剧增加。

image-20240731165620852

一般来说,解决缓存击穿的主要方法分为三种:热点数据永不过期、热点数据预加载以及加分布式锁

缓存穿透

缓存穿透是指在缓存中查询一个一定不存在的数据,由于缓存不命中,导致请求直接访问数据库,这将导致大量的请求打到数据库上,可能会导致数据库压力过大。

通常情况下,缓存是为了提高数据访问速度,避免频繁查询数据库。但如果攻击者故意请求缓存中不存在的数据,就会导致缓存不命中,请求直接访问数据库。

image-20240731165708539

缓存穿透一般有几种解决方案:1. 空对象值缓存。2.使用锁。3.布隆过滤器

我们的方案

如果说缓存不存在,那么就通过布隆过滤器进行初步筛选,然后判断是否存在缓存空值,如果存在直接返回失败。如果不存在缓存空值,使用锁机制避免多个相同请求同时访问数据库。最后,如果请求数据库为空,那么将为空的 Key 进行空对象值缓存

image-20240731165820956

HTTP重定向

一般以 3xx 开头的代表重定向,表示网页发生了转移,需要重定向到对应的地址中去,两者区别是:

  • 301:表示永久性转移。会导致搜索引擎将旧的URL替换为新的 URL,并且浏览器会缓存新的 URL。对于后续的请求,浏览器会直接使用新的 URL 进行访问,而不会再发送请求到旧的 URL。
  • 302:表示临时性转移。不会导致搜索引擎更新索引,它只是暂时重定向到新的 URL。浏览器会缓存新的 URL,但对于后续的请求,浏览器会继续发送请求到原始的 URL,而不是直接使用新的 URL。

简单来说,通过 301 跳转,只会在访问一次后端请求,然后就被缓存到浏览器,后续就直接从浏览器拿,不需要再访问短链接服务了。

302 跳转,每次都需要去短链接服务获取最新的链接,再进行重定向,浏览器不缓存相关信息。

两者优缺点:

  • 301:优点对短链接后端服务压力比较小。缺点是后续短链接变更了原始链接,无法感知;以及无法记录详细的统计信息。
  • 302:上边的缺点就是优点。缺点是每次访问后端服务器,可能压力会大一些,但是相对于获取到用户的行为,这种小缺点都是能接受的。

因为我们需要统计访问信息,所以选择302

缓存预热

缓存预热是指在应用程序启动或系统负载低峰期,提前将应用程序需要访问缓存的数据加载到缓存中,以便在实际的请求到来时能够快速响应。

缓存预热的目的是避免在实际请求到来时由于缓存冷启动而导致的延迟或性能下降。缓存冷启动是指在缓存中没有预先加载数据的情况下,第一次请求到达时需要从后端系统或数据库获取数据,并将其存储到缓存中。这个过程可能需要花费较长的时间,延迟了实际请求的响应时间。

如何进行缓存预热?

缓存预热有很多种方式,比如定时任务从数据库中查询进行预热等。我们这里在创建完短链接后就将短链接记录新增到缓存中。

设置缓存的过期时间,设置多少合适?

因为咱们短链接创建时是可以设置过期时间的,所以对于设置了过期时间的短链接,我们在缓存中也设置对应的时间即可。

那对于永久有效的短链接难道就不设置过期时间么?大家知道,短链接一般来说具有时效性,很多时候只会在一定时间内使用,过了这个时间后,用的人就很少了。所以,即使短链接永久有效,我们也得设置过期时间。不然,大量不使用的短链接放在缓存中,存储压力会比较大。

如果短链接设置的永久有效,我们默认一个月的过期时间。如果一个月后还有人访问,再去数据库加载数据,再设置一个月的过期时间即可。


短链接跳转
http://example.com/2024/02/10/短链接/短链接跳转/
作者
sxswldy
发布于
2024年2月10日
许可协议