python常见面试问题(二)
八. cookie和session的差别优势
-
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 ,考虑到安全应当使用session
-
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE -
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
-
session 中保存的是对象,cookie 中保存的是字符串
-
session 会在一定时间内保存在服务器上。当访问增多,会占用你服务器的性能。考虑到减轻服务器性能方面,应该 使用 COOKIE。单个 cookie 保存的数据不能超过 4k ,很多浏览器都限制一个站点最多保存 20 个 cookie
总而言之,两者之间应用场景不一样,安全性不一样,存储地址不一样。
九. 敏捷开发和瀑布开发的区别
(一) 瀑布模型
-
瀑布模型有以下优点
(1)为项目提供了按阶段划分的检查点。
(2)当前一阶段完成后,您只需要去关注后续阶段。
(3)可在迭代模型中应用瀑布模型。 -
瀑布模型有以下缺点
(1)在项目各个阶段之间极少有反馈。
(2)只有在项目生命周期的后期才能看到结果。
(3)通过过多的强制完成日期和里程碑来跟踪各个项目阶段。
(4)瀑布模型的突出缺点是不适应用户需求的变化。
(5)许多企业和业务人员确实不容易在前期定义清楚需求,早期计划中所依据的假设需求可能存在很大风险;
(二)敏捷开发
-
优点
(1)人和交互 重于过程和工具。
(2)可以工作的软件 重于求全而完备的文档。
(3)客户协作重于合同谈判。
(4)随时应对变化重于循规蹈矩。
项目的敏捷开发,敏捷开发小组主要的工作方式可以归纳为:作为一个整体工作; 按短迭代周期工作;
每次迭代交付一些成果:关注业务优先级; 检查与调整。最重要的因素恐怕是项目的规模。规模增长,
面对面的沟通就愈加困难,因此敏捷方法更适用于较小的队伍,40、30、20、10人或者更少。 -
敏捷开发劣势:
(1)敏捷的概念接受度还不算太高,初次尝试可能不会非常成功;
(2)最终交付的内容无法预测,预期和实际完成的内容经常会有很大差异;
(3)敏捷需要高水平的协作以及开发人员和用户之间的定期沟通。 业务和IT人员在沟通前需要做大量的准备工作
但很多情况下业务的沟通时间无法保证;
(4)当存在乙方供应商的情况,敏捷会面临更大的挑战性。 客户通常希望尽早了解他们的项目投入。 预估项目时间和成本难度较高;
(5)在敏捷项目中,最大的问题可能是业务部门永远不希望有最终的截止时间
十. 为什么Mysql数据库底层使用B+树而不使用B树
一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级。
所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数
B/B+树是为了磁盘或其它存储设备而设计的一种平衡多路查找树(相对于二叉,B树每个内节点有多个分支),与红黑树相比,在相同的的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度(在下面B/B+树的性能分析中会提到)。B/B+树上操作的时间通常由存取磁盘的时间和CPU计算时间这两部分构成,而CPU的速度非常快,所以B树的操作效率取决于访问磁盘的次数,关键字总数相同的情况下B树的高度越小,磁盘I/O所花的时间越少.
为什么说B+树比B树更适合数据库索引?
-
B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
-
B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。
所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。 -
由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引
十一. 常见的中间件
kafka 百万级分母量
zeromq
redis 缓存 存储热点数据
rabbitmq 并发式 分布式很慢
activemq 没有人维护了
rocketmq 每个月要升级四次 但是很稳定
十二. Websocket
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
十三. TCP三次握手
为了准确无误地把数据送达目标处,TCP协议采用了三次握手策略
第三次握手是可以携带数据的。
十四. 进程,线程和协程
进程和线程
- 独立地址空间
- 通信
- 资源共享
- 结束
互斥锁(同步锁)
信号量
aquire/release
死锁
递归锁(解决死锁)#RLock本身有一个计数器,如果碰到acquire,那么计数器+1
#如果计数器大于0,那么其他线程无法查收,如果碰到release,计数器-1
协程
协程是被包含进线程的,一个线程就是执行一个子程序(子程序是通过栈实现的,调用
顺序是明确的),协程在执行过程中,在子程序内部可中断,转而执行别的子程序。
协程的 优点
-
协程有很高的执行效率,因为子程序切换而不是线程切换,而是由程序自身控制,
因此, 没有线程切换的开销 -
不需要多线程的锁机制,因为只有一个线程,不存在同时协变量的冲突,在协程
中控制共享资源不加锁,只需要判断状态就好了。
十五. cookie, session 的区别
- 应用场景不一样
- 安全性不一样
- 存储地址不一样
十六. http和https的区别
- http的默认端口是80, https的默认端口是443
- https比http请求更安全。 http的请求的内容是明文的,但是https请求的时候内容是加密的,属于对称加密。
对称非对称加密的不同
http请求方式