Redis的key大小设置应该根据实际需求来定。一般来说,建议使用有意义及统一格式的key,而不是过长的key,因为过长的key会影响内存占用及数据查性能。
16、URL请求到响应的流程
一次性补全网络基础知识。
17、栈和队列的区别?举一个只能使用队列不能使用栈的业务场景
栈和队列是两种常见的数据结构,它们的区别如下:
栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,即最后放入栈中的元素会最先被弹出;而队列是一种先进先出(First-In-First-Out,FIFO)的数据结构,即最先放入队列中的元素会最先被取出。
栈只能从表尾插入和删除元素,而队列只能在表头插入和在表尾删除元素。
一个只能使用队列不能使用栈的业务场景是:假设你有一个火车站,你需要让乘客上车。你可以使用队列来实现这个场景。首先,你需要在车站入口处放置一个队列。然后,每当有新的乘客到来时,他们必须站在队列的末尾。当火车到达时,车站工作人员会从队列的头部移除第一个乘客并将其带上火车。这样,我们就可以确保每个乘客都能够按照他们到达的顺序上车。
18、线性表和链表区别
线性表和链表是两种常见的数据结构。线性表是一种具有相同数据类型的n (n>0)个数据元素的有限序列,它的顺序存储结构就是顺序表,链式存储结构就是链表。链表又包括单向链表、双向链表、循环链表、静态链表等。顺序表可以实现随机访问,随机存取,占用连续的存储空间,空间利用率较高,但是顺序表的插删,需要移动多个元素。而链表则可以实现任意插入和删除操作,不需要移动元素,但是只能从头节点开始遍历,访问某个节点时需要从头节点开始遍历整个链表 。
19、JAVA线程安全
Java中的线程安全是指在多线程环境下,保证程序的正确性。Java语言中各种操作共享的数据有5种类型:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。其中,不可变的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。只要能正确构建一个不可变对象,该对象永远不会在多个线程之间出现不一致的状态。
如果您想要确保Java程序是线程安全的,可以考虑以下几个方面:使用synchronized关键字、ReentrantLock类、Semaphore类等同步机制;使用volatile关键字;使用原子类;使用ThreadLocal类等 。
20、锁的类型,你用过哪些锁?
锁的类型有很多种,其中包括公平锁和非公平锁。Java ReetrantLock中的公平锁和非公平锁可以通过构造函数指定。此外,还有乐观锁和悲观锁等类型。
21、乐观锁和悲观锁
乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据 。
22、git常见命令?合分支、回滚版本
以下是一些常用的git命令:
git init:初始化一个新的git仓库。
git clone:克隆一个已有的git仓库。
git add:将文件添加到暂存区。
git commit:提交暂存区中的文件到本地仓库。
git status:查看当前仓库的状态。
git diff:查看工作区与暂存区之间的差异。
git log:查看提交历史记录。
git branch:创建、列出、删除分支。
git checkout:切换分支或恢复工作区文件。
git merge:合并分支。
git rebase:变基操作,将一个分支的修改应用到另一个分支上。
git reset:重置当前分支到指定状态。
23、淘宝买东西页面白屏?说一下你的排查思路?
首先可以抓包看前端or后端问题:
- 接口返回成功前端没展示;
- 接口请求失败or受阻【这里比较暴力的办法是可以开启远程debug端口,打断点执行即可】。
24、出现过的线上问题?排查思路?
线上问题的排查思路因问题而异,但是一般可以从以下几个方面入手:
- 确认问题的范围和影响;
- 收集相关信息,如日志、监控数据等;
- 分析问题的原因,如程序错误、硬件故障等;
- 制定解决方案并验证。
25、扫码支付case
以下是扫码支付测试用例的设计:
- 测试正常扫码支付流程,包括输入金额、选择支付方式、确认支付等步骤。
- 测试扫码支付过程中可能出现的异常情况,如网络连接中断、支付失败等。
- 测试扫码支付的安全性,包括防止恶意攻击、保护用户隐私等方面。
- 测试扫码支付的速度和稳定性,包括响应时间、并发处理能力等方面。
- 测试扫码支付在不同设备上的兼容性,包括不同操作系统、不同浏览器等方面。
26、性能测试指标?常用性能测试工具?
性能测试指标包括:
- 响应时间:即请求从发送到接收到响应的时间;
- 吞吐量:即单位时间内系统处理的请求数;
- 并发用户数:即同时访问系统的用户数;
- 资源利用率:即系统在处理请求时所占用的资源比例。
常用的性能测试工具有:
- JMeter:Apache JMeter是一个开源的Java应用程序,用于测试Web应用程序的性能和负载能力;
- LoadRunner:LoadRunner是一种商业性能测试工具,用于模拟负载和性能测试;
- Gatling:Gatling是一个快速的开源负载测试工具。
27、算法题:求最长公共子串(写的有点问题,面试官说不用写了┭┮﹏┭┮)
def longest_common_substring(s1, s2): m = len(s1) n = len(s2) # 初始化二维数组 dp = [[0] * (n + 1) for i in range(m + 1)] max_len = 0 end = 0 # 动态规划求解 for i in range(1, m + 1): for j in range(1, n + 1): if s1[i - 1] == s2[j - 1]: dp[i][j] = dp[i - 1][j - 1] + 1 if dp[i][j] > max_len: max_len = dp[i][j] end = i return s1[end - max_len:end]
其中,s1和s2为两个字符串,返回它们的最长公共子串。该算法的时间复杂度为O(mn),空间复杂度为O(mn)。