先说下背景:用户学习平台,单个课程有80课节左右,不同的用户分配不同的营期,不同的营期有不同的课节;为了提升用户响应速度对课节列表和单个课节的学习进度数据进行了缓存。当课程进行了更新时,会同步把课程对应用户学习数据也更新。
上述方案一段时间运行良好,相安无事。突然有一天运营小伙伴要调整课程相关信息,多人同时更新不同的课程信息,需要清除用户学习缓存。
因为使用了Redis keys模糊查询,导致阻塞I/O,导致无响应,对比三种方案如下:
方案1:Scan VS Keys:Scan相当于分页查询,解决了长时间阻塞IO,但是CPU一直高位运作,系统响应依旧很慢。
方案2:记录所有Keys,指定删除:可以解决长时间阻塞IO和CPU高位运作,但是侵入业务代码,维护难度增加
方案3:通过课程版本号(时间戳等):引入版本号概念,随机初始一个版本号,每次更新增加1,作为Key的前缀,以空间换取时间。