缓存,并发更新的大坑?

开发 开发工具 前端
《缓存,究竟是淘汰,还是修改?》发出后,有朋友提到,高并发的情况下,缓存的更新可能存在问题,今天简单聊聊这个话题。

缓存,究竟是淘汰,还是修改?》发出后,有朋友提到,高并发的情况下,缓存的更新可能存在问题,今天简单聊聊这个话题。

[[235679]]

业务场景:

  • 调用第三方服务,例如微信,一般会分配一个token,每次访问接口需要带上这个token;
  • 这个token是有有效期的,当token过期时,需要去重新认证申请;
  • 也可以在token过期前重新申请,但此时旧token会失效。

常见实现方式,如图:

缓存,并发更新的大坑?

  • 把token放在缓存中,每次带上token去调用接口;
  • 如果token过期,需要去申请新token;
  • 申请完新token,需要把新token更新到缓存里。

高并发下可能存在的问题,如图:

 

  • 取旧token,访问接口,发现token过期;
  • 并发请求,取旧token,访问接口,也发现token过期;
  • 去申请新token1;
  • 并发申请新token2(此时token1会过期);
  • 把token1放入缓存,同时使用token1访问接口(此时token1已经过期),发现token1过期,可能会递归申请新token3(此时token2过期);
  • 把token2放入缓存,同时使用token2访问接口(此时token2已经过期),发现token2过期,可能会递归申请新token4(此时token3过期);

额,高并发请求导致相互失效。

常见解决方案,如图:

  • 线上s1和s2只从缓存读取token
  • 更新token异步,asy-Master定期更新token,避免并发更新
  • 使用shadow-master保证token更新高可用,asy-Master挂了,asy-Backup顶上

潜在缺点:

  • s1/s2/asy-master直接调用同一个缓存实例,如果缓存实例变更,可能需要同步变更,导致耦合。

潜在优化:

  • asy-Master利用多线程,实现在s1/s2里,保证高可用;
  • redis里用一个时间戳表示token的更新时间,更新token时,查看token的时间戳,如果token刚更新过,并发的请求便不再更新。

文字虽短,希望问题描述清楚了,希望大家有收获。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2024-03-14 08:57:04

高并发缓存更新

2021-01-13 05:23:27

缓存数据库高并发

2017-12-27 12:01:39

2019-03-18 10:02:16

缓存更新数据

2019-11-11 15:33:34

高并发缓存数据

2019-08-14 15:08:51

缓存存储数据

2018-10-24 14:30:30

缓存服务更新

2016-11-28 09:00:10

浏览器浏览器缓存服务端

2013-09-09 09:36:34

AzureAWS云服务

2018-07-27 10:56:10

2019-12-20 14:56:50

批量删除数据数据删除

2018-12-13 12:43:07

Redis缓存穿透

2019-10-17 10:12:02

Go语言Java函数

2024-04-29 08:05:34

NacosJava数据结构

2017-02-20 07:47:04

缓存HASH高并发

2017-12-12 14:51:15

分布式缓存设计

2020-08-27 08:17:05

缓存高并发系统

2022-10-19 12:23:50

缓存CDN外部缓存

2019-10-17 16:02:44

高并发缓存浏览器

2021-03-19 07:40:22

缓存数据库日志
点赞
收藏

51CTO技术栈公众号