关于面试时面试官提出的一些疑问,求解答

2021-08-03 22:04:47 +08:00
 MrGoooo
问题 1:mysql 给表中的 a,b,c 三个列建立联合索引,select * from t where a=1 and b > 2 order by c,面试官问会不会走这个联合索引,我说:会,因为满足了最左前缀匹配。面试说让我下去好好了解了解。

问题 2:面试官问 redis 缓存和数据库一致性问题,我说:增删改的时候先删 redis 缓存再操作数据库。面试官问如果 redis 删除失败了怎么办?我说:redis 操作失败了就抛出异常,不会再对数据库操作。面试官问:如果需要 redis 操作失败的情况下也需要对数据库增删改成功,并且避免读出脏数据,改怎么做?我没想出来。
6558 次点击
所在节点    程序员
48 条回复
cmai
2021-08-04 16:02:36 +08:00
@yidinghe
1. 排序是在我拿到结果集后在内存 /磁盘中做的排序,会先走我的筛选条件筛选结果集
2.筛选条件按照最左前缀的来的,是可以用到索引的, 用不到索引的情况楼上楼下讲的很多了,就不举例了
yangyaofei
2021-08-04 16:50:52 +08:00
我觉得,要求事务性数据库和 redis 一致性本身就是不对的, 就像非要自行车跑高速一样,在怎么优化也有出问题的地方,因为他就不是设计干这个的.

就像你说的解决方案, 万一消息队列也异常了呢?

应该是在认为这两个库必然会出现不一致的前提下去设计业务逻辑,从使用场景上避免因为不一致导致的问题,或者让他不是问题就行了吧. 然后一致性做到尽可能做到的很好的情况,不影响上层业务逻辑就可以了.
BBCCBB
2021-08-04 16:59:36 +08:00
2. 这个一致性只要不能保证 redis 操作和数据库操作有事务, 就一定会有不一致的可能! 所以基本无解. 只能尽力去降低不一致的概率.
NoDocCat
2021-08-04 17:01:44 +08:00
计算机科学只存在两个问题:1. 变量命名 2. 缓存失效
blackboom
2021-08-04 18:19:30 +08:00
2. 通过先删某个再存某个,然后出现脏数据或者脏读无解,最终都要通过消息队列,或者订阅 binlog 完成缓存刷新。
Actrace
2021-08-04 18:22:00 +08:00
问这种其实一点用都没有。
如果是我,我一般会去问如何分析 SQL 中的性能问题。
waitingChou
2021-08-05 11:42:30 +08:00
第一个问题面试官问法有问题,他应该继续追问一下,那具体用到了索引的哪些字段? 三个字段都用上索引了吗? 笼统地回答用上了理论上没错的。

第二个问题是老生常谈的问题了,只是减少缓存不一致的的概率和影响,不可能保持完全一致。可用的办法很多,但都不能完美解决,延迟双删你入消息队列就失败的情况怎么办。binlog 也有这个问题,你也不能完全保证他运作,更何况 binlog 到缓存 key 的映射也是个问题。 你在这行数据上建了多少缓存,相当于又做了个小型系统出来。
我觉得一般控制下缓存时间不太长,比如不超过五分钟。然后采用 先操作数据库再删缓存的方案就足够。
morty0
2021-08-05 12:12:09 +08:00
2. 一定会存在不一致的情况, 如果要求完美的一致性就不应该用缓存

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/793477

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX