• 运维工程师速成


    1、处理问题:

    你处理过的问题

    2、Mysql 索引类型

    Fulltext:针对全文检索,可以设置关键字或者分词,适用于like %%,对中文支持不好

    Hash:将一列或几列hash出一个值,将查询条件也hash,查看hash值相等的,取出硬盘上的地址,一次查找比btree效率高,但是只适用于=,不适用于范围查找,并且因为无法避免全表扫描,所以表大的时候效率不高,在内存数据库数据量小的情况下很好用

    Btree:二叉树,折半查找,默认

    RTree:范围查找比较好,在mysql中使用很少

    http://www.cnblogs.com/yuan-shuai/p/3225417.html

    3、Mysql innodb和myisam区别

    1、InnoDB不支持FULLTEXT类型的索引。

    2、InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

    3、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

    4、DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

    5、LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

    6、两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁

    7、只读不写的数据,myisam强于innodb

    8、Myisam数据和索引分开,innodb绑在一起没有压缩,所以innodb

    9、Innodb非主键查询也锁全表

    4、交换机端口类型

    Access 只属于一个vlan 连接PC

    Trunk 属于多个vlan 服务器之间

    Hybrid 混合

    接收

    端口接收到的报文类型

    报文帧结构中携带VLAN标记

    报文帧结构中不携带VLAN标记

    Access端口

    丢弃该报文

    为该报文打上VLAN标记为本端口的PVID

    Trunk端口

    判断本端口是否允许携带该VLAN标记的报文通过。如果允许则报文携带原有VLAN标记进行转发,否则丢弃该报文

    同上

    Hybrid端口

    同上

    同上

    interface g 1/0/1

    port link-type trunk

    port trunk allow-pass vlan 2 to 4094

    发送

    Access端口

    剥掉报文所携带的VLAN标记,进行转发

    Trunk端口

    首先判断报文所携带的VLAN标记是否和端口的PVID相等。如果相等,则剥掉报文所携带的VLAN标记,进行转发;否则报文将携带原有的VLAN标记进行转发

    Hybrid端口

    首先判断报文所携带的VLAN标记在本端口需要做怎样的处理。如果是untagged方式转发,则处理方式同Access端口;
    如果是tagged方式转发,则处理方式同Trunk端口

    5、Vlan

    隔离二层网络,同一个vlan是同一个二层网络,vlan之间通过三层网络ip连接

    Vlanif vlan的逻辑端口,为vlan下所有用户的网关

    6、华为交换机配置路由

    ip route-static 10.1.200.0 255.255.255.0 10.10.2.2

    7、华为交换机配置OSPF

    同一个网络里不同的ospf自治域,每个area有自己的id,不同area之间通过边缘交换机连接,这里例如area1 area1两个自治域,area0是两个核心交换机连接的地方,在

    配置vlan

    interface g 1/0/1

    port hybrid pvid vlan 10

    设置vlanif接口地址

    interface vlanif 10

    ip address 192.168.0.1 24

    配置area

    router id 1.1.1.1

    ospf

    area 0

    network 192.168.0.0  0.0.0.255反掩码

    quit

    area 1

    network 192.168.1.0  0.0.0.255

    Quit

    对端核心交换机上配置ospf

    配置vlan

    interface g 1/0/1

    port hybrid pvid vlan 10

    设置vlanif接口地址

    interface vlanif 10

    ip address 192.168.0.2.24

    配置area

    router id 2.2.2.2

    ospf

    area 0

    network 192.168.0.0  0.0.0.255反掩码,宣告路由

    quit

    area 2

    network 192.168.2.1  0.0.0.255

    Quit

    其他的边缘交换机

    Routerid 3.3.3.3

    Ospf

    area 2

    network 192.168.0.0  0.0.0.255反掩码

    quit

    https://wenku.baidu.com/view/c55b6a36ccbff121dc368315.html

    验证

    display ospf peer邻居

    display ospf routing路由

    https://wenku.baidu.com/view/c55b6a36ccbff121dc368315.html

    8、TCP滑动窗口

    发送缓冲区中一部分数据(窗口大小),B接收后发送确认,再滑动窗口发送,以此类推

    乱序的问题通过Sequence Number序号来解决

    9、TCP三次握手四次挥手

    10、http请求过程

    1、dns解析

    2、TCP三次握手

    3、发送get或者post请求,包括http请求头

    4、服务器相应http响应头,发送html

    5、浏览器解析

    11、http包请求头

    Accept  就是告诉服务器端,我接受那些MIME类型

    Accept-Encoding  这个看起来是接受那些压缩方式的文件

    Accept-Lanague   告诉服务器能够发送哪些语言

    Connection       告诉服务器支持keep-alive特性

    Cookie           每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端

    Host             用来标识请求服务器上的那个虚拟主机,比如Nginx里面可以定义很多个虚拟主机

                    那这里就是用来标识要访问那个虚拟主机。

    User-Agent       用户代理,一般情况是浏览器,也有其他类型,如:wget curl 搜索引擎的蜘蛛等    

    12、响应头

    Connection            使用keep-alive特性

    Content-Encoding      使用gzip方式对资源压缩

    Content-type          MIME类型为html类型,字符集是 UTF-8

    Date                  响应的日期

    Server                使用的WEB服务器

    Transfer-Encoding:chunked   分块传输编码 是http中的一种数据传输机制,允许HTTP由网页服务器发送给客户端应用(通常是网页浏览器)的数据可以分成多个部分,分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供

    Vary  这个可以参考(http://blog.csdn.NET/tenfyguo/article/details/5939000

    X-Pingback  参考(http://blog.sina.com.cn/s/blog_bb80041c0101fmfz.html

    13、http包结构

    请求

    相应

    14、Python变量

    Pyton变量是内存中一个对象的引用,可以视为是C语言的指针

    String tunple numbers是不可更改的,list dict可以更改

    修改python字符串:

    a = ‘12345’

    b = a[:1]+’3’+a[2:]

    或者

    List转成数组

    15、Python staticmethod和classmethon

    Classmethod参数有cls,是绑定的类,类对象和实例都可以调用,cls代表类对象,可以使用类变量,但是不能访问实例变量

    Staticmethod,类对象和实例对象都可以调用

    16、调用父类的构造函数

    在子类的构造函数中使用 FOO.__init__(self)或者 super(Foo2,self).__init__()

    17、类变量和实例变量

    Class A:

    name = ‘1’

    name_lsit = []

    a = A()

    b = A()

    a.name = ‘2’#只改变他自己

    a.name_list.append(1)#改变所有的

    18、python双下划线与单下划线

    __foo__python内部方法

    _foo_:类私有变量

    __foo:解析器替换为__classname__foo,以区别其他类

    19、Extend与append区别

    Extend只能接受列表,append什么都可以额,二者都只能接受一个参数

    20、Yield

    用在循环语句中,返回一个生成器。这个生成器只能被迭代一次

    比如 for语句中yield i ,就是返回一个由每次的i组成的列表

    21、新式类和旧式类

    新式类在2.2引入,2.*中要显式的继承object3.*中默认继承object。新式类相同父类只执行一次构造函数,旧式类多次,新式类搜索父类广度优先,旧式类深度优先

    22、Select poll 和epoll:

    Select poll差不多,都是先把fd_set或者pollfd从用户态拷贝到内核,然后__epoll_wait注册到内核等待队列中等待唤醒,唤醒后执行回调函数设置maskselect在内核中遍历fd列表,碰见有唤醒的就拷贝回用户空间

    这样主要有三个问题

    1、 fd多次拷贝开销大

    2、 在内核中遍历所有fd开销大

    3、 Select有文件上限

    epoll提供了三个函数:epoll_createepoll_ctlepoll_waitepoll_create创建一个epoll句柄;epoll_ctl注册要监听的事件类型注册要监听的事件类型epoll_wait等待返回。

    1、 epoll_ctl注册时拷贝fd到内核,省的在epoll_wait中来回拷贝

    2、 epoll_ctl时为每个fd注册一个回调函数,如果就绪了,就把自己加入到一个就绪链表,这样内核只要遍历就绪链表就可以了,不需要遍历所有

    3、 没有上限,上限和系统一样

    参考文献

    http://www.cnblogs.com/Anker/p/3265058.html

    23、__new__()实例

    class LxmlDocument(object_ref):

      cache = weakref.WeakKeyDictionary()

      __slots__ = ['__weakref__']

      def __new__(cls, response, parser=etree.HTMLParser):

        cache = cls.cache.setdefault(response, {})

        if parser not in cache:

          obj = object_ref.__new__(cls)

          cache[parser] = _factory(response, parser)

        return cache[parser]

    24、单例模式

    Import天然是单例模式

    New单例

    class Singleton(object):

        _instance = None

        def __new__(cls, *args, **kw):

            if not cls._instance:

                cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  

            return cls._instance  

    class MyClass(Singleton):  

        a = 1

    http://python.jobbole.com/87294/

    装饰器

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    from functools import wraps

    def singleton(cls):

        instances = {}

        @wraps(cls)

        def getinstance(*args, **kw):

            if cls not in instances:

                instances[cls] = cls(*args, **kw)

            return instances[cls]

        return getinstance

    @singleton

    class MyClass(object):

        a = 1

    http://python.jobbole.com/87294/

    25、Awk

    awk ‘BEGIN {awk-commands} /pattern/ {awk-commands} END {awk-commands}’ file

    使用文件awk ‘……’ -f awkfile

    Awk -v variable=value awk变量

    --dump-variables = file 打印全局变量到文件

    --lint treat error as warn

    --profile = file 讲程序输入到文件中

    {print $0}打印所有行

    示例:

    统计行数:

    awk ‘/a/ {++cnt} END {print “Count = “,cnt}’ file

    awk 'BEGIN{FS=" "} /Phys/{print $3 }' marks.txt

    內建变量:

    ARGC 命令行参数个数

    ARGV命令行参数数组

    CONVFMT 数字的约定模式

    ENVIORON 环境变量数组

    FILENAME 当前文件名

    FS 分隔符

    NF 字段数目

    NR 行数

    FNR 处理多文件时相对当前文件的行号

    OFMT 输出格式数字

    OFS 输出字符分隔符

    ORS 输出行分隔符

    RLENGTH 匹配字符串长度

    RS 输入字符分隔符

    RSTART match第一次匹配的位置

    数据结构:

    数组:

    array_name[index] = value

    创建数组的方式非常简单,直接为变量赋值即可

    删除使用delete

    流程控制:

    If(condition)command;else command

    for(initialisation;condition;increment/decrement)action

    while(condition)action

    do action while(condition)

    內建函数:

    数学函数

    atan2(y, x)

    cos(expr)

    exp(expr)

    int(expr)

    log(expr)

    rand

    sin(expr)

    sqrt(expr)

    srand([expr])

    字符串函数

    asort(arr [, d [, how] ])

    asorti(arr [, d [, how] ])

    gsub(regex, sub, string)

    index(str, sub)

    length(str)

    match(str, regex)

    split(str, arr, regex)

    sprintf(format, expr-list)

    strtonum(str)

    sub(regex, sub, string)

    substr(str, start, l)

    tolower(str)

    toupper(str)

    时间函数

    systime

    mktime(datespec)

    strftime([format [, timestamp[, utc-flag]]])

    字节操作函数

    and

    compl

    lshift

    rshift

    or

    Xor

    参考文献:

    http://blog.jobbole.com/109089/

    算法

    1、 判断单链表是否交叉

     

    判断是否交叉:两个链表分别遍历到底,看底部是否相等

    判断是交叉点:长链表减去短链表之后的位置开始同时遍历两边,查看是否有相等的地方,,相等的地方就是交叉点

    2、 二分查找


    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    def binarySearch(l, t):

        low, high = 0, len(l) - 1

        while low < high:

            print low, high

            mid = (low + high) / 2

            if l[mid] > t:

                high = mid

            elif l[mid] < t:

                low = mid + 1

            else:

                return mid

        return low if l[low] == t else False

    if __name__ == '__main__':

        l = [1, 4, 12, 45, 66, 99, 120, 444]

        print binarySearch(l, 12)

        print binarySearch(l, 1)

        print binarySearch(l, 13)

        print binarySearch(l, 444)

    3、 如何判断链表是否有环

    设置两个指针,一个slow,一个fastslow每次前进一,fast每次前进二,如果slow碰上fast就是有环

    环的长度:记录下slowfast的碰撞点P,下次相撞前走过的路程l就是环长

    连接点位置:分别从碰撞点和头指针开始走,相撞的地方就是连接点,因为你碰撞点p到连接点对的距离等于头指针到连接点的距离

    4、 遍历二叉树


    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    ## 14 二叉树节点

    class Node(object):

        def __init__(self, data, left=None, right=None):

            self.data = data

            self.left = left

            self.right = right

    tree = Node(1, Node(3, Node(7, Node(0)), Node(6)), Node(2, Node(5), Node(4)))

    ## 15 层次遍历

    def lookup(root):

        stack = [root]

        while stack:

            current = stack.pop(0)

            print current.data

            if current.left:

                stack.append(current.left)

            if current.right:

                stack.append(current.right)

    ## 16 深度遍历

    def deep(root):

        if not root:

            return

        print root.data

        deep(root.left)

        deep(root.right)

    前序遍历:左子树--右子树

    中序遍历:根-左子树-右子树

    后序遍历:右子树--左子树

  • 相关阅读:
    javascript回调函数笔记
    JavaScript回调函数的实现
    深入理解JS执行细节(写的很精辟)
    javascript中return function与return function()的区别
    windows下dubbo-admin2.6.x之后版本的安装
    shiro经典通俗易懂javase例子
    字符串转数字练习--String to Integer (atoi)
    字符串按照Z旋转90度然后上下翻转的字形按行输出字符串--ZigZag Conversion
    SQL ----post漏洞测试注入
    nginx笔记----解决windows80端口被iis占用
  • 原文地址:https://www.cnblogs.com/wuxie1989/p/7357462.html
Copyright © 2020-2023  润新知