应对memcache缓存失效,导致高并发查询db

DxinSir      2022-02-12     603

关键词:

当Memcached缓存失效时,容易出现高并发的查询DB,导致DB压力骤然上升。

这篇blog主要是探讨如何在缓存将要失效时,及时地更新缓存,而不是如何在缓存失效之后,如何防止高并发的DB查询。

解决这个问题有四种思路:

比如一个key是aaa,失效时间是30s。

 

1.定期从DB里查询数据,再刷到memcached里

这种方法有个缺点是,有些业务的key可能是变化的,不确定的。

而且不好界定哪些数据是应该查询出来放到缓存中的,难以区分冷热数据。

 

2.当缓存取到为null时,加锁去查询DB,只允许一个线程去查询DB

这种方式不太靠谱,不多讨论。而且如果是多个web服务器的话,还是有可能有并发的操作。

 

3.在向memcached写入value时,同时写入当前机器在时间作为过期时间

当get得到数据时,如果当前时间 - 过期时间 > 5s,则后台启动一个任务去查询DB,更新缓存。

当然,这里的后台任务必须保证同一个key,只有一个线程在执行查询DB的任务,不然这个还是高并发查询DB。

缺点是要把过期时间和value合在一起序列化,取出数据后,还要反序列化。很不方便。

 

网上大部分文章提到的都是前面两种方式,有少数文章提到第3种方式。下面提出一种基于两个key的方法:

4.两个key,一个key用来存放数据,另一个用来标记失效时间

比如key是aaa,设置失效时间为30s,则另一个key为expire_aaa,失效时间为25s。

在取数据时,用multiget,同时取出aaa和expire_aaa,如果expire_aaa的value == null,则后台启动一个任务去查询DB,更新缓存。和上面类似。

 

对于后台启动一个任务去查询DB,更新缓存,要保证一个key只有一个线程在执行,这个如何实现?

对于同一个进程,简单加锁即可。拿到锁的就去更新DB,没拿到锁的直接返回。

 

对于集群式的部署的,如何实现只允许一个任务执行?

这里就要用到memcached的add命令了。

add命令是如果不存在key,则设置成功,返回true,如果已存在key,则不存储,返回false。

当get expired_aaa是null时,则add expired_aaa 过期时间由自己灵活处理。比如设置为3秒。

如果成功了,再去查询DB,查到数据后,再set expired_aaa为25秒。set aaa 为30秒。

综上所述,来梳理下流程:

比如一个key是aaa,失效时间是30s。查询DB在1s内。

 

  • put数据时,设置aaa过期时间30s,设置expire_aaa过期时间25s;
  • get数据时,multiget  aaa 和 expire_aaa,如果expired_aaa对应的value != null,则直接返回aaa对应的数据给用户。如果expire_aaa返回value == null,则后台启动一个任务,尝试add expire_aaa,并设置超时过间为3s。这里设置为3s是为了防止后台任务失败或者阻塞,如果这个任务执行失败,那么3秒后,如果有另外的用户访问,那么可以再次尝试查询DB。如果add执行成功,则查询DB,再更新aaa的缓存,并设置expire_aaa的超时时间为25s。

 

总结:

我个人是倾向于第4种方式的,因为很简单,直观。

这种两个key的方式,还有一个好处,就是数据是自然冷热适应的。如果是冷数据,30秒都没有人访问,那么数据会过期。

如果是热门数据,一直有大流量访问,那么数据就是一直热的,而且数据一直不会过期。

原文地址:http://lixiangfeng.com/blog/article/content/12

memcached集群/分布式/高可用及magent缓存代理搭建过程详解(代码片段)

当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题。有这么一段文字来描述“Memcached集群”Memcached如何处理容错的?不处理!:)在memcached节点失效的情况下,集群没有必... 查看详情

解决缓存失效后并发问题:双key方案(代码片段)

我们在使用缓存的时候,不管Redis或者是Memcached,基本上都会遇到以下3个问题:缓存穿透、缓存并发、缓存集中失效。这篇文章主要针对「缓存并发」问题展开讨论,并给出具体的解决方案。1.什么是缓存并发ÿ... 查看详情

memcached集群/分布式/高可用及magent缓存代理搭建过程详解(代码片段)

当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题。有这么一段文字来描述“Memcached集群”Memcached如何处理容错的?不处理!:)在memcached节点失效的情况下,集群没有必... 查看详情

高并发下缓存失效问题及解决方案

缓存穿透介绍:当查询一个不存在的数据,此时缓存是不命中的,就会去查询db,这将导致每次查询这个不存在的数据都要去访问db,缓存就没有意义了。如果不怀好意的人利用不存在的数据进行攻击,可能导致数据库崩溃解决... 查看详情

缓存问题

1、缓存穿透多次访问一个不存在的key,会导致每次都去请求数据库,增加数据库负担解决方法:1、对于请求数据库后仍然不存在的key设置为缓存,value中放null值,并设置一个缓存的失效时间,缓存有效时间可以设置短点,这样... 查看详情

缓存三大问题

1.缓存穿透:  查询一个一定不存在的数据。因为缓存中无该数据数据,所以要查询数据库。如果频繁请求不存在的数据,因请求都会到达数据库层而导致db瘫痪。  解决方案:  缓存查询的空值,但设定比较短的失效时... 查看详情

如何应对雪崩式的请求

如何应对雪崩式请求?雪崩式请求:当服务提供方由于某种原因挂掉导致服务调用方阻塞,最终引发系统的雪崩式崩溃称为雪崩。通常可分为两种:缓存雪崩和应用雪崩缓存雪崩:缓存服务器挂掉、突发流量导致局部缓存失效、... 查看详情

缓存击穿、穿透、雪崩及redis分布式锁

...术A分布式锁:setnx,redisson并发问题幂等问题:落表状态,Redis缓存击穿:指缓存中无,db中有原因:一个key高并发恰好失效导致大量请求到db方案:加锁,自旋锁,或一个线程查db,一个线程监控(直接用Redisson分布式锁)缓存穿透:指缓存和db中均... 查看详情

redis缓存雪崩缓存击穿缓存穿透原因,解决方案?(代码片段)

缓存雪崩、缓存击穿、缓存穿透原因,解决方案?缓存雪崩由于设置缓存时,key都采用了相同expire,导致缓存在某刻同时失效,请求全部直到DB,DB瞬时负载过重而雪崩解决方案在原有失效时间基础上增加一个随机值,比如1~5分钟... 查看详情

高并发架构基石——缓存概述

...存都具有良好的水平扩展能力,对较大数据量的场景也能应对自如,但需要进行远程请求,性能不如本地缓存。多级缓存多级缓存用于平衡本地缓存和分布式缓存,实际业务中也一般采用多级缓存,访问频率最高的部分热点数据... 查看详情

一线大厂高并发redis缓存架构(代码片段)

文章目录高并发缓存架构设计架构设计思路完整代码开发规范与优化建议键值设计命令使用客户端的使用扩展布隆过滤器redis的过期键的清除策略高并发缓存架构设计架构设计思路首先是一个基础的缓存架构,对于新增、修... 查看详情

华为技术架构师分享:高并发场景下缓存处理的一些思路

...候对数据库进行查找,因此系统的大致结构如下所示:1.缓存和数据库之间数据一致性问题常用于缓存处理的机制我总结为了以下几种:首先来简单说说Cacheaside的这种方式:CacheAside模式这种模式处理缓存通常都是先从数据库缓... 查看详情

高并发场景下使用缓存需要注意那些问题?

一、缓存一致性问题当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策略。一般会在数据发生更... 查看详情

弹性负载均衡服务助力企业应对高并发流量冲击

摘要:弹性负载均衡(ElasticLoadBalance简称ELB)将访问流量均衡分发到多台弹性云服务器,扩展应用系统对外的服务能力,实现更高水平的应用程序容错性能。如今,随着互联网规模和消费者规模的不断扩大,企业面对着高并发请... 查看详情

高并发的常见应对方案

一、关于并发我们说的高并发是什么?在互联网时代,高并发,通常是指,在某个时间点,有很多个访问同时到来。 高并发,通常关心的系统指标与业务指标?QPS:每秒钟查询量,广义的,通常指指每秒请求数响应时间:从... 查看详情

高并发架构基石——缓存综述

引言作一些综合记录,待补充。缓存的使用场景,不同类型缓存的使用方式对DB热点数据进行缓存减少DB压力。对依赖的服务进行缓存,提高并发性能。单纯K-V缓存的场景可以使用MC,而需要缓存list、set等特殊数据格式,可以使... 查看详情

redis持久化机制及缓存失效解决方案(代码片段)

...用功能,包括数据结构,主从复制结构,以及应对高并发海量数据场景下的分片rediscluster集群;本篇文章继续学习redis框架应对缓存失效,以及持久化机制及内存管理出现的问题,以及提供的解 查看详情

消息队列

...,本地缓存+分布式缓存,DB读写分离分库分表。3.浏览器应对高并发  3.1浏览器缓存,减少请求  3.2多个子域名部署,突破浏览器连接4.服务器端  4 查看详情