需求:在测一个页面,老版本就存在的一个页面(多个模块,一个接口分成三次请求返回),但是新版本要新增一个模块。老的页面的实现方式是页面直接读取redis数据(还有其他逻辑,方便解释暂时这样说),截取模块的方式来分接口返回,新增的一个模块是要放在中间。
方案:方案是沿用老的redis缓存,在老得缓存中加入这个新的模块的缓存,接口处理就做版本判断新版本在part1模块返回,老的接口不返回这个模块。(来自测试的认同:听起来好像没有问题)
测试过程:测试准备测一下客户端覆盖安装的场景,步骤一:安装的老版本没有返回这个模块,很棒!步骤二:覆盖安装并进入这个页面,咦?这个模块怎么不见了,一定是我瞎了,啊~再试一次,好像恢复了,模块出来了。什么情况?还好我连了Charles,抓到证据了,part1确实是没有返回这个模块,但是原本这个模块的位置被下面一个模块占了。哦~!我有思路了,首先怀疑缓存问题:1、redis缓存,难道测试环境redis缓存被覆盖了?我赶紧去查看下,发现没有,页面的缓存好好的,模块缓存也在对应位置。2、于是我开始怀疑gocache的问题,我跟开发说了下我的想法,怀疑是否是新老版本共用gochache的问题。
排查:我的想法得到了证实,新老版本确实共用一个gocache,其实共用也没有问题,后面做好处理就行了,但是开发做了一个骚操作,他把老版本访问的gocache剔除了新的模块(版本判断做在了这块了)。黑人问号脸.jpg!!!因为新老版本共用缓存,所以如果老版本触发了gocache,新版本再去访问读取这个gocache时候就会缺少这个模块。同样的,如果新版本触发了gocache,老版本再去访问读取这个gocache就会出现接口返回多这个新模块的情况。
修复bug:不在生成gocache里面做版本判断,不修改gocache,在读取gocache之后,拿到整个页面的数据结构体时,做版本判断,新版本返回这个模块,老版本屏蔽这个模块,再做数据的输出。
经验:如果涉及到新老版本共用一套缓存时,不能随意更改缓存数据。如果数据输出有区别的话,要在读缓存之后再做逻辑判断或者版本判断。
标签:缓存,模块,app,新老,版本,共用,页面,gocache From: https://www.cnblogs.com/douzi1119/p/17703291.html