得物二面-线上(为长沙公司招)

1、eureka宕机会发生什么?
分为俩种情况。
1,如果其他的微服务没有注册,那么这种情况下,微服务调用会有问题。
2,如果所有的服务器都启动起来了,然后eureka突然挂掉,由于消费者服务器会缓冲生产者服务器的相关信息(服务名,ip等)到本地,所以微服务会正常调用。
2、Dubbo是一种基于RPC(远程过程调用)的协议。
OpenFeign是一个基于Http协议(的RPC组件)。
3、redis与数据库更新怎么保证一致性

1、最终一致性:容忍数据短时不一致,最终达到一致即可
可以采用先删除Redis,后更新MySQL的方式来保证最终一致性。
步骤:
	删除Redis
	在这时有请求到达,读取MySQL内容并写入Redis(此时写入的数据是旧的)
	更新MySQL
	删除Redis(再执行一次删除Redis,就可以确保Redis中的内容为最新数据)

但是上述的保证事务提交完以后再进行删除缓存还有一个问题,就是如果你使用的是 Mysql 的读写分离的架构的话,那么其实主从同步之间也会有时间差。
在这里插入图片描述

此时来了两个请求,请求 A(更新操作) 和请求 B(查询操作)
	请求 A 更新操作,删除了 Redis
	请求主库进行更新操作,主库与从库进行同步数据的操作
	请 B 查询操作,发现 Redis 中没有数据
	去从库中拿去数据
   此时同步数据还未完成,拿到的数据是旧数据

此时的解决办法就是如果是对 Redis 进行填充数据的查询数据库操作,那么就强制将其指向主库进行查询。
在这里插入图片描述
2、强一致性:数据实时保持一致

先更新数据库,后删除缓存
问题:更新数据库成功了,但是在删除缓存的阶段出错了没有删除成功,那么此时再读取缓存的时候每次都是错误的数据了。

此时解决方案就是利用消息队列进行删除的补偿。
在这里插入图片描述
具体的业务逻辑用语言描述如下:

请求 A 先对数据库进行更新操作
在对 Redis 进行删除操作的时候发现报错,删除失败
此时将Redis 的 key 作为消息体发送到消息队列中
系统接收到消息队列发送的消息后再次对 Redis 进行删除操作

但是这个方案会有一个缺点就是会对业务代码造成大量的侵入,深深的耦合在一起。
所以这时会有一个优化的方案,引入第三方服务,订阅(监听)MySQL master节点的binlog,当binlog产生时,按binlog顺序更新Redis数据即可。比如阿里开源的canal组件。
在这里插入图片描述

个人认为这里实现的【强一致性】也并不是真的【实时一致】,而是【近实时】,因为读取binlog并在Redis上执行更新,依然需要时间,只是这个时间会比较短而已。

PS: 于哥你好,最近面试被问到:redis 与数据库怎样保证数据的一致性,代码怎么处理?
如果你只回答先更新缓存,再更新数据库; 先更新数据库,再更新缓存; 先删除缓存,再更新数据库; 先更新数据库,再删除缓存,
这样的话你基本上是GG了。

今天有时间给大家总结一下这个问题。

可以使用两个 redis 集群,这两个集群数据保持一致一主一备。
1.每次删除数据,先删除主 redis 集群,再删数据库,如果数据库正常删除,则删除备份的 redis,如果数据库删除报错,
则使用备份的 redis 恢复主 redis。
2.查询时,先查主 redis,没查到则查备份 redis,如果都没有,则使用布隆过滤器判断数据是否存在,如果也不存在则返回 null。
3.新增数据时,先新增数据库,新增成功,则保存到主 redis 集群,再成功,则保存到备份 redis,
同时,使用一个定时任务定时更新两个 redis 集群,使数据保持一致。

如果 redis 宕机了,
1.首先要看有没有做数据持久化,redis 默认是使用内存快照来保存的,这个可能会丢一部分数据,所以需要同时开始 RDB 和 AOF,redis 宕机后马上重启,则可尽量减少数据丢失。
2.如果使用主备两个集群,这时就可以使用备份的 redis,然后及时修复主 redis 集群。

参考:https://zhuanlan.zhihu.com/p/612460266?utm_id=0

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值