当前位置: 首页 > 科技观察

服务器解压你不得不知道的缓存技巧

时间:2023-03-20 22:13:02 科技观察

为什么要用缓存一般情况下,访问量达到一定规模后,数据库的读写就会成为瓶颈,我们会通过一些手段对数据库进行解压,让它可以正常工作。可以考虑的手段有读写分离,增加缓存服务器等。读写分离就是把数据库的读写动作尽可能的分开,减少相互影响;加入缓存是为了减少读取数据库时直接读取数据库的动作,将查询结果存储在缓存中,用户的请求与数据库隔离,从而减轻数据库的压力。这是缓存工作的理想方式,但它只是一种理想的缓存穿透。所谓缓存穿透,就是当用户请求在缓存系统中查找结果时,会失败,然后去后端存储系统中查找数据。这时候,如果数据不存在,而且访问量比较大,大量的访问会直接攻击数据库。这时候负责存储的服务器就惨了(如左图),所以我们需要做一些努力,让当前的数据不存在,写入一个flag到缓存中或者存储空查询导致缓存减少这种无用请求频繁打到数据库的情况(如右图)。您还可以确认查询结果为空或空存储在单独的缓存区中。缓存雪崩是另一个问题。当系统使用的缓存发生意外(网络故障、宕机、服务挂起、缓存集体丢失等)时,缓存集体失效,导致所有请求在短时间内到达数据库(数据存储层)一段的时间。),使数据库受压而崩溃。为了防止这种情况,我们采用以下方法:1.我们使用多实例来保证缓存的高可用,尽量避免个别实例出现问题时全局缓存出现问题。这样的解决方案有很多,比如memcache的一致性hash,redis的集群机制避免单点故障。此类信息可以搜索redis或memcache的高可用方案。2.降级机制。在许多高可用性设计中也可能描述这种方法。简单来说,我们把用户和用户隔离,资源和资源隔离。当某部分数据出现问题或者某部分的请求达到阈值时,根据预设的机制,只将热点数据返回给请求,保证客户端不会出现天窗问题或无法一直回应。3.锁定。对于到达的请求,我们使用锁机制尝试将它们排队,以减少对数据库的并发。有两种锁方案可以参考。一种是使用全局锁或字符串锁。当一个请求被操作时,其他请求处于等待状态。请求处理完成后,进行下一步的业务处理。但是在这种情况下,如果一个请求挂掉了,会影响后面排队的请求,短时间内可能无法处理完该请求,会造成请求阻塞时间过长等问题。方案二是操作这个时候其他请求进来的时候判断是否有锁。如果有则直接跳过处理,返回热点数据。需要说的是,降级机制不一定非要放在图中这个位置,也可以放在缓存前面或者其他位置。其主要目的是在出现问题时隔离有问题的资源,同时不影响客户端的内容或使某些用户的请求无法到达真正的业务逻辑,从而减轻业务处理的压力。