针对读多写少的高并发场景,我们可以使用缓存来提升查询速度。
• 如果数据在Redis存在,应用就可以直接从Redis拿到数据,不用访问数据库。
• 如果Redis里面没有,先到数据库查询,然后写入到Redis,再返回给应用。
问题一:
• 先操作Redis的数据再操作数据库的数据
• 先操作数据库的数据再操作Redis的数据
只要有一方失败就会导致数据不一致
这种情况需要更具的我们的业务场景而定,数据库的实时性一致性要求不是特别高的场合,
可以采用定时任务查询数据库数据定时同步到Redis的方案。由于我们是以数据库的数据为准的,所以给缓存设置一个过期时间,是保证最终一致性的解决方案。
问题二:
当存储的数据发生变化,Redis的数据也要更新的时候,我们有两种方案,一种就是直接更新,调用set;还有一种是直接删除缓存,让应用在下次查询的时候重新写入。
判断是不是要经过其他表的查询、接口调用、经过复杂的计算才能得到最新的数据,而不是直接从数据库拿到的值,如果是的话,建议直接删除缓存,这种方案更加简单,一般情况下也推荐删除缓存方案。
异常情况:
如果删除缓存失败,我们捕获这个异常,把需要删除的key发送到消息队列。然后自己创建一个消费者消费,尝试再次删除这个key,进行消息重试
如果有程序并发操作的情况下:
•线程A需要更新数据,首先删除了Redis缓存
•线程B查询数据,发现缓存不存在,到数据库查询旧值,写入Redis,返回
•线程A更新了数据库
例如,我们产品库缓存,可以通过建刷新缓存的任务,来进行缓存刷新,不管线程A还是线程B都是建刷新缓存的任务,在业务上可以对同一个刷新缓存的id进行去重
具体得结合自己的业务场景,面试官基本会问你项目中的缓存时怎么使用的,怎么保证一致性的