面试问题

面试问题

面试经常被问到,如何保证redis的读取和mysql的写入的一致性 ,这个问题在网上搜了好多,没有找到一个可靠的, 老师能说下吗? 或者提供一个这方便的课程 。 收费的也可 。

如果单纯是redis进行操作的话,通过分布式锁可以保证数据库的一致性在高并发,但是牵扯到mysql写,redis读,就不知道该怎么办了。 

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小班 2021-06-24 16:48:51

同学你好,1、这也属于一种方式,但是实际操作中,一个操作涉及到的表和数据是很多的,直接放到init方法,可能会需要加载很多数据,所以不建议这样做。

    ​2、实际应用中,遇到高并发的问题,还是要根据具体的场景来具体的决定如何处理,比如:更新某商品的库存,先更新了数据库,再更新缓存,造成数据不一致,这时先删除缓存,然后再更新数据库。

    ​在高并发的情况下,如果当删除完缓存的时候,这时去更新数据库,但还没有更新完,另外一个请求来查询数据,发现缓存里没有,这时的数据不一致,可以尝试使用队列去解决。

所以要看具体的场景来灵活决定使用哪种方式来解决。

祝学习愉快~

  • 提问者 rock221 #1

    所谓的删除缓存 ,就是删除redis中的key吧? 

    2021-06-24 16:58:01
  • 提问者 rock221 #2

    更新的时候,能不能加一把锁(比如添加一个静态的标识), 更新前删除缓存,更新后,添加缓存。 请求b再查询缓存的时候,发现没有缓存,要进入数据库前,我们判断下更新的锁的静态标识,如果锁不存在放行,如果锁存在,说明再更新,返回或者沉睡线程,然后这样是不是可以保证一致性,我思路对吗。 

    2021-06-24 17:11:59
  • 提问者 rock221 #3

    如果针对秒杀项目,或者抢购优惠券的功能, 只需在redis中保存一些简单的数据,比如库存等,是否可考虑init的方法,然后先操作redis的库存,库存没了就返回, 有库存就往下进行。 mysql的订单的生成。可吗。 

    2021-06-24 17:15:59
rock221 提问者 2021-06-24 13:51:40

我个人的理解:

一般针对redis 用于缓存数据, 可以在init中, 获取mysql的数据, 存到redis中,因为init只会执行一次,那么就获取到了最初的数据了。 然后高并发请求进入接口口,先对redis中数据进行更改,更改后进入mysql的操作, 如果mysql的操作出现了异常,导致redis的数据-了,mysql没有-, 可以在异常中还原redis的数据,这样就似的两个库存的一致性了。还可以提高运行效率,因为通过redis先进行数据的操作是很快的, 如果库存不满足需求,可以直接对请求返回。 这属于一种解决双写不一致的实际操作吗?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师