美团实习一面复盘总结
-
BRAC模型实现权限管理怎么做的?
-
项目用redis储存了什么数据?
-
redis5种基本数据类型?
-
储存点赞量用什么数据类型?-String
- String数据类型能自增吗?
- incrby 命令可以实现String自增操作。在自增的时候,因为 Redis 没有专用的整数类型,所以 key 内储存的字符串被解释为十进制 64 位有符号整数来执行 INCR 操作。
- 本操作的值限制在 64 位(bit)有符号数字表示之内。
- 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
- String数据类型能自增吗?
-
多线程在共同更新该数据,怎么保证其原子性?
- 加锁
-
redis持久化方式?
-
Redis缓存一致性问题?
- 为什么使用延时双删策略?这样不会导致数据库流量巨大吗?
- 确实,缓存删两次,更多的请求落到了数据库。一致性要求没那么高的情况下,使用旁路缓存模式即可
- 旁路缓存模式;
- 为什么使用延时双删策略?这样不会导致数据库流量巨大吗?
-
你缓存的数据有强一致性的需求吗?
- 其实不太需要,主要是学习使用
-
Redis分布式锁,释放锁的时候,怎么解决可能释放了不同线程的锁的问题?
- lua脚本,判断、删除两步写成一个lua脚本,原子执行
-
不用lua脚本,用ThreadLocal能不能解决这个问题?
- 这是线程本地私有的变量,跟ThreadLocal什么关系啊?
- 可能是可以用来保存线程的产生的唯一标识,这个标识保存到ThreadLocal防止被其他线程修改。当解锁的时候,比较该标识与锁的标识是否相同,相同才能释放锁,这里还是需要用到lua脚本,保证判断、删除两步的原子性。
-
rabbitMQ怎么保证消息可靠性?
- 生产者:ack、事务、重试、日志保存
- 消费者:ack、重试、日志保存
- rabbitMQ本身:消息持久化、集群Broker做副本
- 如果是kafka,每个分区都有副本
- 如果是RocketMQ,有刷盘机制
-
代码层面,你怎么保证消息不丢失?丢失了怎么处理?
- trycatch捕获异常、重试、日志保存
-
怎么保证消息处理的有序性?
先回答可能造成乱序的场景:多个队列、一个队列多个消费者、一个队列一个消费者但是消费者prefech预取数大于1
- 把队列拆成多个,使得一个队列只能对应一个消费者
- 把队列拆成多个,使得能够一个队列匹配一个消费者。具有顺序的一组消息就根据 哈希法 全都发送到其中一个队列
- 生产者给消息添加序号,使用redis保存当前所需消费的消息序号
- 消费者获取到消息,要检验消息是否为redis中当前需要消费的消息序号
- 可以使用basic.qos方法来设置QoS参数设置 prefetch count 消息预取数 为1
- 把队列拆成多个,使得一个队列只能对应一个消费者
-
消息重复消费的问题怎么解决?
- 面试官:没关系,有想法就好; T_T菜狗落泪
- 幂等性:redis去重、数据库消息日志表ID唯一性
-
OSS服务怎么使用的?
-
反问
- 学习方向? -加强底层原理学习
- 微服务学习的必要?- 可以了解相关知识,搭建微服务框架比较难