每日分享
Go forth and make awesomeness.
去做一件令人敬畏的事。
小闫语录:
今日烦躁,无话可说。
python技术面试题(十三)
1.Linux常用命令
1.远程登录:
ssh 用户名@IP
2.远程拷贝:
scp 用户名@ip:文件路径 本地路径
3.上传到远程:
scp 本地路径 用户名@ip:文件路径
文件远程拷贝和上传如果是对文件夹操作,在scp后加
-r
参数。
查看日志:
tail -f test.log # 日志不断的打印 sed -n '5,10p' test.log # 查看文件的第5行到第10行
2.常用Git命令
1.创建本地仓库(新建一个空目录然后执行):
git init
2.配置个人信息:
git config user.name '张三' git config user.email 'zhangsan@153.com'
3.查看文件状态:
git status
绿色:暂存区
红色:工作区
4.工作区文件添加到暂存区:
git add x # 添加所有文件 git add login.py # 添加指定文件
5.提交暂存区文件到仓库区:
git commit -m '版本描述'
6.查看历史版本:
git log # 或者 git reflog
7.回退版本:
git reset --hard 版本号
8.撤销工作区代码:
git checkout 文件名
9.撤销暂存区代码:
# 第一步:将暂存区代码撤销到工作区 git reset HEAD 文件名 # 第二步:撤销工作区代码 git checkout 文件名
10.对比版本库与工作区:
git diff HEAD -- 文件名
11.对比版本库:
git diff HEAD HEAD^ -- 文件名
HEAD
表示当前最新版本
HEAD^
表示当前最新版本的前一个版本
HEAD^^
表示当前最新版本的前两个版本,以此类推...
HEAD~1
表示当前最新版本的前一个版本
HEAD~10
表示当前最新版本的前10个版本,以此类推...
12.确定删除文件:
# 删除文件 rm 文件名 # git确定删除文件 git rm 文件名 # 记录一下删除操作的版本 git commit -m '删除描述'
13.误删除:
# 删除文件 rm 文件名 # git撤销修改 git checkout -- 文件名
14.克隆项目到本地:
git clone 地址
15.推送项目到远程:
git push
16.拉取项目:
git pull
17.记住密码:
git config --global credential.helper store
18.打标签:
git tag -a 标签名 -m '标签描述'
19.推送标签到远程仓库:
git push origin 标签名
20.删除标签:
# 删除本地标签 git tag -d 标签名 # 删除远程仓库标签 git push origin --delete tag 标签名
21.查看当前分支:
git branch
22.创建并切换到分支dev:
git checkout -b dev
23.将本地分支推送到远程:
git push -u origin dev
24.合并分支:
# 切换到主分支 git checkout master # 将dev分支合并到master git merge dev
25.拉取对应的分支dev:
git fetch origin dev
3.Celery底层原理
celery提供了一个task装饰器,对被修饰的函数添加delay 方法(将原任务方法名和参数保存到redis的list中)。
在celery的redis消息队列中,利用了redis的列表类型的 lpush
和 brpop
操作。任务发出者向列表中通过lpush加入任务。而任务执行者则是通过brpop操作按顺序异步执行任务。因为lpush可以形象的理解为从左向右推入元素,brpop则是从右侧取元素,保证了任务添加的顺序不会乱。
Brpop命令: 1. brpop <list>.... <timeout>
Redis Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
4.FastDFS
FaskDFS是用c语言编写的开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制。使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括 Tracker server(调度服务器) 和 Storage server(存储服务器)。客户端请求 Tracker server 进行文 件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
服务器端两个角色:
- Tracker: 管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
- Storage: 实际保存文件, Storage 分为多个组,每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有 主从的概念。
文件上传流程:浏览器上传连接请求,Tracker Server查询可用的Storage,然后将Storage的IP和端口返回给客户端。客户端上传文件,然后Storage Server生成 file_id
,将上传的内容写入磁盘,并将 file_id
返回给客户端,客户端保存这个 file_id
即可。 file_id
保存的是文件的索引信息(组名,虚拟磁盘路径,数据两级目录,文件名)。
组名:文件上传后所在的 storage 组名称,在文件上传成功后由 storage 服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项 storepath对应。如果配置了 storepath0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。
数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
使用的时候需要自定义Django文件存储系统,然后在Django配置中设置自定义文件存储类。通过 DEFAULT_FILE_STORAGE
配置项设置。
5.Hs + ES
ES是java语言实现的一个开源的搜索引擎,很火,一般我们首选ES搜索。它的原理就是先建立索引结构数据,类似于咱们新华字典的前面索引表。在通过搜索引擎查询的时候,和咱们查字典一样,先通过拆分关键字的方式查一下这个数据在哪,然后直接就找到了。
我们使用haystack全文检索框架,它是python中的全文搜索框架,支持多种搜索引擎,能帮助开发者利用搜索引擎建立数据表的索引数据。能帮助开发者利用搜索引擎进行关键词搜索,获取对应的索引数据。还能利用索引数据查找到对应数据表的数据。也就是它什么都有了,你直接使用就好了。
6.数据库事务
事务 Transaction 是指作为一个基本工作单元执行的一系列SQL语句的操作,要么完全地执行,要么完全地都不执行。事务的四大特性(ACID):原子性、一致性、隔离性、持久性。
一个简单的例子(三个步骤打包为一个事务,任何一个失败,则必须回滚所有):
1. 检查支票账户的余额高于或者等于200美元。 2. 从支票账户余额中减去200美元。 3. 在储蓄帐户余额中增加200美元。
1.原子性(Atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
2.一致性(Consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行语句时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)
3.隔离性(Isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,一个事务未完成,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)
4.持久性(Durability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。)
6.1事务的操作
开启事务(开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中):
begin; 或: start transaction;
提交事务(将缓存中的数据变更维护到物理表中):
commit;
回滚事务(放弃缓存中变更的数据 表示事务执行失败 应该回到开始事务前的状态):
rollback;