虾皮后端一面-日常实习

1.项目里的Redis的旁路缓存模式,流程如何?能解决什么问题?
追问:
有了解延时双删除吗?(勉强答上来了)缓存和数据库已经不一致了,如何补救?
2.Redis和CAS如何解决超卖?
追问:CAS主要用了Redis哪些基础命令?(没答上来3.Redis set怎么做一人一单?怎么做错误回滚?
4.秒杀系统来了一万个用户,怎么扛住压力?(没讲出来)
5.了解HTTPS吗?
追问:客户端从验证数字证书到建立安全连接到流程?(没讲好)
6.MySOL索引数据结构?
追问:几种数据结构的优劣?B树和B+树的对比?(都讲出来了)
7.SQL题:
对于 select*fromtwhere a>2 and b=1;你会怎么建立索引?
(一开始讲联合索引最左匹配,但是顶头就是范围查询直接失效了)
追问:哪些场景索引会失效?(都讲出来了)
算法题:力扣#146LRU缓存,不要直接用Java的LinkedHashMap
这里手撕的不太好,虽然搓出来个能用的双向链表
反问:
1.部门业务(广告投放相关)
全部评论
Redis旁路缓存流程?
点赞 回复 分享
发布于 2025-12-21 14:41 云南

相关推荐

01-10 21:01
门头沟学院 Java
比较经典的题目,如果之前没写过的可能需要想一番,首先实现缓存最先想到的就是hashmap,O1级别的查找速度很适合做缓存,然后就是要实现lru,参考redis的zset底层实现,zset也是使用了两个数据结构跳表+hashmap,使用跳表实现排序,我们这里也是使用双向链表实现lru功能,每次查询对应数据的时候就将数据移除重新加到头部,也就是更新使用频率,附上代码如下比较经典的题目,如果之前没写过的可能需要想一番,首先实现缓存最先想到的就是hashmap,O1级别的查找速度很适合做缓存,然后就是要实现lru,参考redis的zset底层实现,zset也是使用了两个数据结构跳表+hashmap,使用跳表实现排序,我们这里也是使用双向链表实现lru功能,每次查询对应数据的时候就将数据移除重新加到头部,也就是更新使用频率//通过自定义节点,hashmap,哨兵节点//删除时通过pre和next指针快速删除节点//添加时只操作头尾,通过哨兵节点快速添加节点class LRUCache {private class Node{//保留key,不然在删除尾结点的时候不能返回key让map也删除//而map又不知道尾结点是哪个int key,value;Node pre,next;Node(int key,int value){this.key=key;this.value=value;}Node(int key,int value,Node pre,Node next){this.key=key;this.value=value;this.pre=pre;this.next=next;}}private int capacity;//通过哨兵节点可以快速找到头结点和尾节点private Node dummy;//通过hashmap快速找到节点,通过节点pre指针和next指针快速实现删除private Map<Integer,Node> map=new HashMap();public LRUCache(int capacity) {this.capacity=capacity;//不能dummy=new Node(-1,-1,dummy,dummy)//这样会导致dummy的pre和next为nulldummy=new Node(-1,-1);dummy.pre=dummy;dummy.next=dummy;}public int get(int key) {if(!map.containsKey(key)) return -1;//如果存在,更新使用频率(加到头部)Node node=map.get(key);remove(node);addFirst(node);return node.value;}public void put(int key, int value) {Node node;if(!map.containsKey(key)){while(map.size()>=capacity){int removeKey=removeLast();map.remove(removeKey);}node=new Node(key,value);addFirst(node);}else{//否则更新数值重新加入node=map.get(key);node.value=value;remove(node);addFirst(node);}map.put(key,node);}public void remove(Node node){Node pre=node.pre;Node next=node.next;pre.next=next;next.pre=pre;}public int removeLast(){Node tail=dummy.pre;remove(tail);return tail.key;}public void addFirst(Node node){//通过哨兵结点快速找到头结点Node head=dummy.next;head.pre=node;node.next=head;dummy.next=node;node.pre=dummy;}}
查看1道真题和解析
点赞 评论 收藏
分享
01-12 22:27
武汉大学 Java
点赞 评论 收藏
分享
评论
2
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务