Продолжайте делиться вопросами, связанными с Python, сегодня, вы готовы!
Сетевое программирование
1. Кратко опишите семиуровневый протокол OSI.
Это протокол сетевой передачи, который искусственно разделяет разные этапы сетевой передачи на разные уровни.
Семь слоев делится на: слой приложений, слой представления, сеансный слой, транспортный слой, сетевой уровень, слой канала данных, физический уровень.
Пять уровней делятся на: прикладной уровень, транспортный уровень, сетевой уровень, уровень канала передачи данных и физический уровень.
Физический уровень: физические устройства, такие как сетевые кабели и кабели. Уровень канала передачи данных: Mac-адрес Сетевой уровень: IP-адрес Транспортный уровень: протоколы TCP, UDP Прикладной уровень: FTP-протокол, электронная почта, WWW и т. д.
2. Процесс трех рукопожатий и четырех волн
происходит на транспортном уровне
Трехстороннее рукопожатие:
Протокол TCP — это протокол управления передачей на уровне хост-хост, который обеспечивает надежное соединение и использует трехстороннее рукопожатие для подтверждения установления соединения.
Бит флага TCP (битовый код), существует 6 видов знаков: SYN (установление синхронного соединения) ACK (подтверждение подтверждения) PSH (push-передача) FIN (завершение завершения) RST (сброс сброса) URG (срочная аварийная ситуация)
Порядковый номер Номер подтверждения
Первое рукопожатие: хост А отправляет битовый код syn=1, случайным образом генерирует пакет данных с порядковым номером=1234567 на сервер и входит в состояние SYN_SEND, хост Б известен как SYN=1, и А запрашивает установление связь;
Второе рукопожатие: хост B должен подтвердить онлайн-информацию после получения запроса и отправляет номер подтверждения = (seq + 1 хоста A), syn = 1, ack = 1, случайным образом генерирует пакет seq = 7654321 и входит в SYN_RECV. государство;
Третье рукопожатие: после того, как хост А получит его, проверьте правильность номера подтверждения, то есть, отправлен ли номер последовательности +1 в первый раз, и является ли битовый код подтверждения равным 1, если он правильный, хост А отправить номер подтверждения = (последовательность узла B + 1), подтверждение = 1, после того как узел B получит его и подтвердит значение последовательности и подтверждение = 1, соединение будет установлено успешно, и оба узла перейдут в состояние ESTABLISHED.
Описанное выше трехстороннее рукопожатие завершено, и хост A и хост B начинают передавать данные.
Четыре волны:
Поскольку соединения TCP являются полнодуплексными, каждое направление должно быть закрыто отдельно. Принцип заключается в том, что когда сторона завершает свою задачу по передаче данных, она может отправить FIN для разрыва соединения в этом направлении. Получение FIN означает только то, что в этом направлении нет потока данных, TCP-соединение все еще может отправлять данные после получения FIN. Сторона, которая выключится первой, выполнит активное выключение, а другая сторона выполнит пассивное выключение.
- Сервер A отправляет FIN, чтобы закрыть передачу данных с сервера A на сервер B.
- Сервер B получает этот FIN и отправляет обратно ACK, подтверждая, что порядковый номер равен полученному порядковому номеру плюс 1. Как и SYN, FIN занимает порядковый номер.
- Сервер B закрывает соединение с сервером A и отправляет FIN на сервер A.
- Сервер A отправляет обратно подтверждение сообщения ACK и устанавливает порядковый номер подтверждения равным полученному порядковому номеру плюс 1.
3. Что такое архитектура C/S и B/S
B/S также известен как режим браузера/сервера. Например, различные веб-сайты, блокноты Jupyter и т. д.
Преимущества: нулевая установка, простое обслуживание, хороший обмен.
Минусы: Плохая безопасность, отсутствие персонализации.
C/S также известен как режим клиент/сервер. Например, клиент WeChat, клиент Oracle и т. д.
Достоинства: хорошая безопасность, быстрая и стабильная передача данных.
Недостатки: Есть требования к операционным системам ПК и т.д. Когда клиентов много, нагрузка на сервер больше.
4. Разница между TCP и UDP
И TCP, и UDP являются протоколами транспортного уровня в модели OSI. TCP обеспечивает надежный коммуникационный транспорт, в то время как UDP часто используется для коммуникационного транспорта для широковещательной рассылки и детального управления приложениями.
UDP не предоставляет сложных механизмов управления и использует IP для предоставления услуг связи без установления соединения.
TCP в полной мере реализует различные контрольные функции при передаче данных, он может контролировать повторную передачу потерянных пакетов, а также может контролировать последовательность пакетов, вышедших из строя.
Приложения TCP: FTP-передача, двухточечное SMS и т. д.
Приложения UDP: потоковая передача мультимедиа и т. д.
5. Локальная и глобальная сеть
Глобальная сеть (WAN, Wide Area Network), также известная как удаленная сеть (сеть дальней связи). Обычно в большом физическом диапазоне, в диапазоне от десятков километров до тысячи километров, он может соединять несколько городов или стран или через несколько континентов и может обеспечивать междугороднюю связь, формирование международной удаленной сети.
LAN (локальная сеть, локальная сеть) относится к взаимосвязанным путем множества компьютеров в определенной области компьютерной группы. Как правило, в радиусе в нескольких километрах. LAN может подать файл управления, совместное использование приложений, совместное использование принтера, планирование в рабочей группе, услуги электронной почты и факсимильной связи и другие функции. Лан закрыта, и может состоять из двух компьютеров в офисной композиции может состоять из тысяч компьютеров в составе компании.
6. арп-протокол
ARP (протокол разрешения адресов) — это протокол разрешения адресов, который используется для реализации сопоставления IP-адреса с MAC-адресом, то есть для запроса MAC-адреса, соответствующего целевому IP-адресу.
7. Что такое сокет? Кратко опишите процесс связи через сокет на основе протокола TCP.
Socket — это инкапсуляция протокола TCP/IP, и его внешний вид просто облегчает программистам использование стека протоколов TCP/IP. Сокет сам по себе не является протоколом, это уровень абстракции промежуточного программного обеспечения для связи между прикладным уровнем и семейством протоколов TCP/IP, а также набор вызывающих интерфейсов (функции API сети TCP/IP).
«TCP/IP — это всего лишь стек протоколов, как и операционный механизм операционной системы, он должен быть специально реализован, а также должен быть обеспечен внешний операционный интерфейс. Это похоже на то, что операционная система предоставит стандартный интерфейс программирования, такой как интерфейс программирования win32. TCP/IP также предоставляет программистам интерфейс для разработки сети, который представляет собой интерфейс программирования Socket. "
Server:
import socket
import threading
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口:
s.bind(('127.0.0.1', 9999))
s.listen(5)
print('Waiting for connection...')
while True:
# 接受一个新连接:
sock, addr = s.accept()
# 创建新线程来处理TCP连接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
Client:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
Примеры от официального сайта liao xuefeng
8. Кратко опишите различия между процессами, потоками, научными и прикладными сценариями.
Процесс — это работающая программа с определенными независимыми функциями на определенном наборе данных, а процесс — это независимая единица, позволяющая системе распределять и планировать ресурсы. Каждый процесс имеет свое собственное независимое пространство памяти, и различные процессы взаимодействуют посредством межпроцессного взаимодействия.
Поток является сущностью процесса и является базовой единицей планирования и диспетчеризации ЦП.Это базовая единица, меньшая, чем процесс, который может выполняться независимо. Сам поток в принципе не владеет системными ресурсами, а имеет только некоторые ресурсы, которые необходимы в работе (такие как счетчик программ, набор регистров и стеков), но он может разделять все ресурсы, которыми владеет процесс, с другими принадлежащими ему потоками. к тому же процессу.
Сопрограмма — это облегченный поток в пользовательском режиме, и планирование сопрограммы полностью контролируется пользователем. Сопрограмма имеет свой собственный регистровый контекст и стек.
Многопроцессорность: используйте многопроцессорность, когда задачи с интенсивным использованием ЦП требуют полного использования ресурсов многоядерного ЦП (сервер, массивные параллельные вычисления).
Недостатки: стоимость связи между несколькими процессами высока, а затраты на переключение велики.
Многопоточность. Многопоточность подходит для интенсивных задач ввода-вывода (сетевой ввод-вывод, дисковый ввод-вывод, ввод-вывод базы данных).
Недостаток: только один поток может выполняться в одном временном интервале, что не может обеспечить высокий уровень параллелизма, но может обеспечить высокий уровень параллелизма.
Сопрограмма: также известная как микропоток, она выполняет несколько задач в одном потоке и использует переключение функций с минимальными накладными расходами. Операционная система не планирует его выполнение, и нет дополнительных затрат на переключение процессов и потоков.
Дефект: однопоточное выполнение, низкая производительность при работе с интенсивным процессором и локальным дисковым вводом-выводом. Производительность сетевого ввода-вывода по-прежнему относительно высока.
Возврат многопоточных запросов неупорядочен, в зависимости от того, какой поток имеет данные для возврата и какой поток обрабатывается, а данные, возвращаемые сопрограммой, упорядочены.
9. Как использовать пул потоков и пул процессов
Функция пула заключается в ограничении количества запускаемых процессов или потоков. Когда количество одновременных задач намного превышает возможности компьютера, он не может открыть слишком много однократных процессов или потоков, вы должны использовать концепцию открытого пула, ограничивающего количество процессов или потоков на компьютере. доступный ассортимент.
мультипрогресс
from multiprocessing import Pool
import os
import time
import random
def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start)))
def test_pool():
print('Parent process %s.' % os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')
if __name__ == '__main__':
test_pool()
output
Parent process 32432.
Waiting for all subprocesses done...
Run task 0 (15588)...
Run task 1 (32372)...
Run task 2 (12440)...
Run task 3 (18956)...
Task 2 runs 0.72 seconds.
Run task 4 (12440)...
Task 3 runs 0.82 seconds.
Task 1 runs 1.21 seconds.
Task 0 runs 3.00 seconds.
Task 4 runs 2.95 seconds.
All subprocesses done.
apply_async(func[ args[ kwds]]): использовать неблокирующий метод для вызова func (параллельное выполнение, блокирующий метод должен дождаться завершения предыдущего процесса перед выполнением следующего процесса), args — это список параметров, переданный в func , kwds передается список аргументов ключевого слова в func; close(): закрыть пул, чтобы он больше не принимал новые задачи; terminate(): завершается немедленно, независимо от того, завершена ли задача; join(): блокирует основной процесс, ожидая выхода дочернего процесса, который необходимо использовать после закрытия или завершения;
Его также можно реализовать с помощью функций, предоставляемых модулем concurrent.futures.
def test_future_process():
print('Parent process %s.' % os.getpid())
p = ProcessPoolExecutor(4)
for i in range(5):
p.submit(long_time_task, i)
p.shutdown(wait=True)
print('Finish')
if __name__ == '__main__':
# test_pool()
test_future_process()
output
Parent process 29368.
Run task 0 (32148)...
Run task 1 (31552)...
Run task 2 (24012)...
Run task 3 (29408)...
Task 2 runs 0.52 seconds.
Run task 4 (24012)...
Task 3 runs 0.86 seconds.
Task 1 runs 1.81 seconds.
Task 0 runs 1.83 seconds.
Task 4 runs 1.69 seconds.
Finish
Многопоточность
def sayhello(a):
print("hello: " + a)
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (a, (end - start)))
def test_future_thread():
seed = ["a", "b", "c", "d"]
start = time.time()
with ThreadPoolExecutor(3) as executor:
for i in seed:
executor.submit(sayhello, i)
end = time.time()
print("Thread Run Time: " + str(end - start))
output
hello: a
hello: b
hello: c
Task a runs 0.40 seconds.
hello: d
Task b runs 0.56 seconds.
Task d runs 1.70 seconds.
Task c runs 2.92 seconds.
Thread Run Time: 2.9195945262908936
Видно, что поскольку создается пул потоков с ограничением в 3, одновременно выполняются только три задачи.
10. Как общаться между процессами
def write(q):
print("write(%s), 父进程为(%s)" % (os.getpid(), os.getppid()))
for i in "Python":
print("Put %s to Queue" % i)
q.put(i)
def read(q):
print("read(%s), 父进程为(%s)" % (os.getpid(), os.getppid()))
for i in range(q.qsize()):
print("read 从 Queue 获取到消息: %s" % q.get(True))
def test_commun():
print("(%s) start" % os.getpid())
q = Manager().Queue()
pw = Process(target=write, args=(q, ))
pr = Process(target=read, args=(q, ))
pw.start()
pr.start()
pw.join()
pr.terminate()
output
(23544) start
write(29856), 父进程为(23544)
Put P to Queue
Put y to Queue
Put t to Queue
Put h to Queue
Put o to Queue
Put n to Queue
read(25016), 父进程为(23544)
read 从 Queue 获取到消息: P
read 从 Queue 获取到消息: y
read 从 Queue 获取到消息: t
read 从 Queue 获取到消息: h
read 从 Queue 获取到消息: o
read 从 Queue 获取到消息: n
Многопроцессорный модуль Python является оберткой для базового механизма, предоставляя Queue, Pipes и другие способы обмена данными.
11. Блокировки процессов и блокировки потоков
Блокировка процесса: это контроль доступа нескольких процессов в одной и той же операционной системе к общему ресурсу, но из-за независимости программы каждый процесс не может контролировать доступ других процессов к ресурсу, но может использовать управление семафором. местной системы.
Семафор, иногда называемый семафором, — это средство, используемое в многопоточной среде для предотвращения одновременного вызова двух или более критических секций кода.
Блокировка потока: Когда несколько потоков изменяют общие данные почти одновременно, требуется управление синхронизацией. Синхронизация потоков может гарантировать, что несколько потоков могут безопасно получать доступ к конкурирующим ресурсам (глобальному содержимому). Простейший механизм синхронизации — использование блокировок мьютексов.
Когда поток хочет изменить общие данные, он сначала блокирует их.В это время состояние ресурса заблокировано, и другие потоки могут его изменить.Пока поток не изменит состояние ресурса на незаблокированное состояние, т.е. , освобождает ресурс, другие потоки могут снова заблокировать ресурс. Мьютексы гарантируют, что только один поток одновременно выполняет операцию записи. Это обеспечивает безопасность данных при многопоточности.
12. Что такое параллелизм и параллелизм
Параллелизм: при наличии нескольких ядер ЦП разные программы назначаются для выполнения разным ЦП. Несколько программ могут выполняться одновременно.
Параллелизм: одно ядро процессора, только одна программа может запускаться один раз за квант времени, если вам нужно запустить несколько программ, последовательное выполнение.
13. Роль threading.local
ThreadLocal называется локальной переменной потока. ThreadLocal создает копию в каждой переменной. Каждый поток может получить доступ к своей собственной внутренней переменной копии, которая невидима для других потоков и не повлияет на другие потоки после модификации.
14. Что такое разрешение доменного имени
Разрешение доменных имен относится к разрешению доменных имен в IP-адреса. Существует также обратное «обратное разрешение», которое ищет IP-адрес по соответствующему адресу доменного имени через DNS-сервер.
DNS — это система доменных имен, которая назначает доменные имена и IP-адреса хостам в Интернете. Когда пользователь использует адрес доменного имени, система автоматически преобразует адрес доменного имени в IP-адрес.
15. Какова роль LVS?
LVS — это аббревиатура от Linux Virtual Server, что означает виртуальный сервер Linux, представляет собой кластерную систему виртуальных серверов, то есть сервер балансировки нагрузки.
Рабочий режим LVS делится на режим NAT, режим TUN и режим DR.
16. Роль Nginx
Основные функции Nginx: 1. Обратный прокси 2. Балансировка нагрузки 3. HTTP-сервер (включая динамическое и статическое разделение) 4. Прямой прокси
Прямой прокси-сервер: в некоторых случаях пользователям прокси-сервера необходимо вручную установить IP-адрес и номер порта прокси-сервера для доступа к серверу.
Обратный прокси: он используется для прокси-сервера и целевого сервера, к которому прокси-сервер получает доступ. Прокси-сервер принимает запрос, затем пересылает запрос на сервер во внутренней сети (кластеризация) и возвращает результат, полученный от сервера, клиенту, в это время прокси-сервер действует как сервер для внешнего мира.
Сервер балансировки нагрузки похож на LVS HTTP-сервер похож на Tomcat и т. д.
17. Keepalived и HAProxy
HAProxy обеспечивает высокую доступность, балансировку нагрузки и проксирование приложений через TCP и HTTP.
Keepalived — это сервисное программное обеспечение, которое обеспечивает высокую доступность кластера при управлении кластером, его функция аналогична пульсу и используется для предотвращения единой точки отказа.
18. Что такое rpc
RPC относится к удаленному вызову процедуры, то есть к двум серверам A и B, и одно приложение развернуто на сервере A. Если вы хотите вызвать функцию/метод, предоставленный приложением на сервере B, поскольку он не одно и то же пространство памяти, он не может быть вызван напрямую в сеть для выражения семантики вызова и передачи данных вызова.
19. Процесс ввода URL из браузера на страницу URL-адреса дисплея
- Браузер находит IP-адрес, соответствующий доменному имени через DNS-сервер
- Браузер отправляет HTTP-запрос на веб-сервер, соответствующий IP-адресу.
- После того, как веб-сервер получает HTTP-запрос, он возвращает ответ браузеру.
- Браузер отображает страницу после получения ответа
20. Что такое КДН
Полное название CDN — Content Delivery Network, то есть Content Delivery Network. CDN — это сеть распространения контента, построенная в сети, опирающаяся на пограничные серверы, развернутые в разных местах, с помощью балансировки нагрузки, распределения контента, планирования и других функциональных модулей центральной платформы, чтобы пользователи могли получать желаемый контент поблизости, уменьшать сеть. перегрузки и улучшить доступ пользователей Скорость отклика и частота попаданий. Ключевые технологии CDN в основном включают технологии хранения и распространения контента.
Базы данных и фреймворки
21. Список общих баз данных
Реляционные базы данных: MySQL, Oracle, SQLServer, SQLite, DB2.
Нереляционные базы данных: MongoDB, Redis, HBase, Neo4j.
22. Три парадигмы проектирования баз данных
Создание научных стандартизированных баз данных должно соответствовать некоторым спецификациям, чтобы оптимизировать режим хранения данных, который можно назвать парадигмой в реляционных базах данных.
Первая парадигма: когда все атрибуты реляционного режима R не могут быть разложены в более базовый блок данных, R называется 1nf.
Все свойства реляционной схемы R больше не могут быть разложены
Вторая нормальная форма: если реляционная схема R удовлетворяет первой нормальной форме, и все непервичные атрибуты R полностью зависят от каждого потенциального ключевого атрибута R, говорят, что R удовлетворяет второй нормальной форме, сокращенно 2NF.
Неосновные атрибуты должны зависеть от каждого ключевого атрибута.
Три нормальные формы: пусть R — реляционная схема, удовлетворяющая первому условию нормальной формы, X — любой набор атрибутов R, если X нетранзитивно зависит от любого ключевого слова-кандидата R, говорят, что R удовлетворяет третьей нормальной форме, сокращенно 3NF.
Данные не могут иметь транзитивную связь, то есть каждый атрибут имеет прямую связь с первичным ключом, а не косвенную связь.
23. Что такое транзакция базы данных
Транзакция (Transaction) является базовой единицей управления параллелизмом. Так называемая транзакция, это последовательность операций, эти операции либо выполняются, либо не выполняются, это неделимая единица работы.
В реляционных базах данных транзакцией может быть один оператор SQL, группа операторов SQL или целая программа.
Четыре свойства: атомарность, непротиворечивость, изолированность и долговечность.
24. Типы индексов MySQL
MySQL в настоящее время в основном имеет следующие типы индексов:
- нормальный индекс
- уникальный индекс
- индекс первичного ключа
- составной индекс
- полный текстовый указатель
25. Сценарии применения «один ко многим» и «многие ко многим» в проектировании баз данных
Пример отношения один к одному: Один учащийся соответствует одному материалу студенческого файла, или у каждого человека есть уникальный идентификационный номер.
Пример отношения «один ко многим»: Ученик принадлежит только к одному классу, но в классе несколько учеников.
Пример отношения «многие ко многим»: Студент может выбрать несколько курсов, а в курсе может быть несколько студентов.
26. Описание триггеров, функций, представлений, хранимых процедур
Триггер: триггер — это специальная хранимая процедура, представляющая собой блок кода, который автоматически выполняется базой данных во время вставки, обновления и удаления.
Функции: в базе данных предусмотрено множество встроенных функций, и вы также можете настроить функции для реализации логики sql.
Представление: представление — это виртуальная таблица, сформированная из результатов запроса, которая представляет собой проекцию, полученную в результате определенной операции.
Хранимая процедура: инкапсулировать фрагмент кода.Когда этот фрагмент кода должен быть выполнен, его можно реализовать, вызвав хранимую процедуру (после первой компиляции повторный вызов не требует перекомпиляции, что более эффективно, чем выполнение операторов sql по одному)
27. Общие операторы SQL
DML (язык манипуляции данных)
- SELECT - получить данные из таблицы базы данных
- UPDATE - обновить данные в таблице базы данных
- DELETE - удалить данные из таблицы базы данных
- INSERT INTO - вставить данные в таблицу базы данных
DDL (язык определения данных)
- CREATE DATABASE - Создать новую базу данных
- ALTER DATABASE - изменить базу данных
- CREATE TABLE - создать новую таблицу
- ALTER TABLE - изменить (изменить) таблицу базы данных
- DROP TABLE - бросить стол
- CREATE INDEX - создать индекс (ключ поиска)
- DROP INDEX - удалить индекс
28. Разница между первичным ключом и внешним ключом
Первичный ключ и внешний ключ определяются главным образом для поддержания целостности реляционной базы данных.
Первичный ключ — это уникальный идентификатор, который может идентифицировать запись. Не может быть повторен, не может быть пустым.
Внешние ключи используются для связи с другой таблицей. Это поле, которое может определять другую запись таблицы и используется для обеспечения согласованности данных.
| первичный ключ | иностранный ключ | показатель | |
|---|---|---|---|
| определение | Уникально идентифицирует запись, не может повторяться и не может быть пустым | Внешний ключ таблицы является первичным ключом другой таблицы, а внешний ключ может дублироваться и может быть нулевым. | Поле не имеет повторяющихся значений, но может иметь нулевые значения. |
| эффект | используется для обеспечения целостности данных | Используется для соединения с другими таблицами | Улучшить скорость сортировки запросов |
| номер | только один | может иметь несколько | может иметь несколько |
29. Как включить медленный запрос журнала MySQL
- Измените файл конфигурации и перезапустите службу, чтобы изменения вступили в силу. В Linux, vim /etc/my.cnf, добавьте в элемент содержимого [mysqld]: slow_query_log = ВКЛ. long_query_time = 2 # Если запрос превышает 2 секунды, он будет записан
- командная строка, но после перезапуска службы произойдет сбой УСТАНОВИТЬ ГЛОБАЛЬНЫЙ slow_query_log = 'ВКЛ'; УСТАНОВИТЬ ГЛОБАЛЬНОЕ long_query_time = 2;
30. Команда резервного копирования базы данных MySQL
mysqldump -u имя пользователя -p имя базы данных > имя экспортированного файла
31. Разница между char и varchar
char: очень удобно хранить данные фиксированной длины. Индекс в поле CHAR очень эффективен. Длина должна быть определена в круглых скобках, и может быть значение по умолчанию, например, определение char (10).
varchar: хранит данные переменной длины, но эффективность хранения не так высока, как у CHAR.Длина должна быть определена в круглых скобках, и она может иметь значение по умолчанию.
32. Принцип самого левого префикса
MySQL устанавливает многостолбцовый индекс (совместный индекс) по принципу самого левого префикса, то есть самого левого первым, например:
Если имеется двухколоночный индекс (col1,col2), индекс был установлен на (col1), (col1,col2);
Если имеется трехколоночный индекс (col1,col2,col3), индекс был установлен на (col1), (col1,col2), (col1,col2,col3);
33. Не удалось попасть в индекс
- Использование ключевого слова or приведет к тому, что индекс не попадет
- Левый ведущий запрос приведет к тому, что индекс не попадет, например, '%a' или '%a%'.
- Когда индексный столбец одностолбцового индекса имеет значение null, полное совпадение значений сделает индекс недействительным, а когда все комбинированные индексы равны нулю, индекс будет недействительным.
- Столбцы, составной индекс которых не соответствует принципу левого префикса, не могут попасть в индекс.Например, если у нас есть 4 столбца a, b, c и d, мы создаем составной индекс INDEX(
a,b,c,d), Тогда запрос может попасть в A, AB, ABC, ABCD и не может попасть в индекс в дополнение к этому. - Приведения могут привести к сбою индекса
- Отрицательные условия запроса приведут к тому, что индекс не будет использоваться, например, NOT IN, NOT LIKE, != и т. д.
- Не используйте индекс, если mysql считает, что использование полного сканирования таблицы быстрее, чем использование индекса.
34. Разделение чтения и записи базы данных
Разделение чтения и записи состоит в том, чтобы разделить базу данных на главную и подчиненную библиотеки.Одна главная библиотека используется для записи данных, а несколько подчиненных библиотек завершают операцию чтения данных.Общепринято синхронизировать данные между главной и подчиненной библиотеками через определенный механизм Схема базы данных.
35. Подтаблица базы данных
Горизонтальная сегментация базы данных — это общая архитектура базы данных, которая представляет собой архитектуру, которая разделяет базу данных с помощью алгоритма. Каждая база данных в горизонтально сегментированном кластере обычно называется «сегментом». Данные в каждом осколке не перекрываются, и объединение данных во всех осколках составляет полные данные.
Горизонтальная сегментация делится на подзуты базы данных и подзатурирование подзазревших баз данных. Согласно присущему логическому взаимосвязку данных в таблице, одна и та же таблица распространяется на несколько баз данных или несколько таблиц в соответствии с различными условиями, и только каждая таблица только Содержит часть данных, так что объем данных в одной таблице становится меньше и достигает распределенного эффекта.
36. Сравнение redis и memcached
- И redis, и memcached хранят данные в памяти, обе являются базами данных в памяти. Но memcached также можно использовать для кэширования других вещей, таких как изображения, видео и т. д.
- Redis не только поддерживает простые данные типа k/v, но также обеспечивает хранение таких структур данных, как список, набор и хэш.
- В распределенных настройках можно использовать один ведущий и несколько ведомых или один ведущий и один ведомый.
- Сохраняемые данные в безопасности, после зависания memcached данные полностью теряются, redis можно регулярно сохранять на диск (persistence).
- Для аварийного восстановления после нависания Memcached данные не могут быть восстановлены; после того, как данные Redis потерян, его можно восстановить через AOF.
37. Сколько бд в базе по умолчанию в redis и их функции
По умолчанию Redis имеет 16 баз данных, и данные в каждой базе данных изолированы.Таким образом, при сохранении данных вы можете указать хранить разные данные в разных базах данных. И она есть только у одной машины, если это кластер, то понятия базы данных нет.
38. Какие стратегии сохраняемости есть в Redis?
Постоянство RDB: это постоянство, которое периодически выгружает записи базы данных Reids в памяти на диск.
Сохранение AOF (добавлять только файл): запись журнала операций Reids в файл в режиме добавления
39. Политика срока годности, поддерживаемых Redis
GM три стратегии экспирации
- Регулярно удалять При установке времени истечения срока действия ключа создайте таймер для ключа и позвольте таймеру удалить ключ, когда наступит время истечения срока действия ключа.
- ленивое удаление Ключ не удаляется по истечении срока его действия.Каждый раз, когда ключ получается из базы данных, она проверяет, не истек ли срок его действия.Если он истекает, удаляет его и возвращает null.
- регулярно удалять Выполнять операцию удаления просроченного ключа через равные промежутки времени
Redis использует стратегию ленивого удаления + периодического удаления
40. Как убедиться, что данные в Redis являются горячими данными
Ограничьте память, занимаемую Redis, и Redis будет загружать горячие данные в память в соответствии со своей собственной стратегией удаления данных. Поэтому вычислите примерный объем памяти, занимаемый всеми данными хотспота, а затем установите лимит памяти Redis.
41. Операция Python redis
Используйте стороннюю библиотеку Redis для работы
import redis
# 创建一个 redis 连接池
def redis_conn_pool():
pool = redis.ConnectionPool(host='redis-host', port=redis-port,
decode_responses=True, password='redis-pwd')
r = redis.Redis(connection_pool=pool)
return r
42. Публикация и подписка на основе Redis
подписчик
if __name__ == "__main__":
conn = redis.Redis(host='',
port=12143, password='')
ps = conn.pubsub()
ps.subscribe('chat') # 从 chat 订阅消息
for item in ps.listen(): # 监听状态:有消息发布了就拿过来
if item['type'] == 'message':
print(item)
print(item['channel'])
print(item['data'])
диктор
if __name__ == "__main__":
number_list = ['300033', '300032', '300031', '300030']
signal = ['1', '-1', '1', '-1']
pool = redis.ConnectionPool(host='redis-12143.c8.us-east-1-3.ec2.cloud.redislabs.com', port=12143,
decode_responses=True, password='pkAWNdYWfbLLfNOfxTJinm9SO16eSJFx')
r = redis.Redis(connection_pool=pool)
for i in range(len(number_list)):
value_new = str(number_list[i]) + ' ' + str(signal[i])
print(value_new)
r.publish("chat", value_new)
43. Как эффективно найти KEY в Redis
import redis
con = redis.Redis()
con.keys(pattern='key*') # *代表通配符
44. Внедрить FIFO, LIFO и приоритетную очередь на основе redis
class Zhan:
def __init__(self,conn):
self.conn = conn
def push(self,val):
self.conn.rpush('aaa',val)
def pop(self):
return self.conn.rpop('aaa')
class Dui:
def __init__(self,conn):
self.conn = conn
def push(self,val):
self.conn.rpush('bbb',val)
def get(self):
return self.conn.lpop('bbb')
class Xu:
def __init__(self,conn):
self.conn = conn
def push(self,val,count):
self.conn.zadd('ccc',val,count)
def get(self):
a = self.conn.zrange('ccc', 0, 0)[0]
self.conn.zrem('ccc', a)
return a
45. Как Redis реализует репликацию master-slave
Настройте SLAVEOF 127.0.0.1 6380 на подчиненном сервере # IP-адрес главного сервера, порт
46. Цикл для получения очень большого списка данных в Redis
def list_iter(name):
"""
自定义redis列表增量迭代
:param name: redis中的name,即:迭代name对应的列表
:return: yield 返回 列表元素
"""
list_count = r.llen(name)
for index in xrange(list_count):
yield r.lindex(name, index)
47. Роль команды watch в Redis
watch используется для наблюдения за ключом на последнем шаге операции транзакции, то есть перед выполнением exec.Если отслеживаемый ключ изменен, транзакция будет отменена, в противном случае транзакция будет выполняться в обычном режиме.
48. Распределенная блокировка redis
Замок, разработанный для кластера Redis, предотвращает несколько задач из модификации базы данных одновременно. Его сущность состоит в том, чтобы установить строку тайм-аута для каждого хоста в кластере. Когда более половины машин в кластере успешно установлены, замок считается успешным. Ни одна вторая задача не будет успешно заблокирована, пока замок не истечет или не разблокирован.
49. http-протокол
Протокол передачи гипертекста (HTTP) является наиболее широко используемым сетевым протоколом в Интернете. HTTP — это стандарт запросов и ответов на стороне клиента и сервера. Клиент — это конечный пользователь, а сервер — это веб-сайт. Как правило, HTTP-клиент инициирует запрос на установление TCP-соединения с указанным портом сервера (по умолчанию используется порт 80), а HTTP-сервер прослушивает запрос, отправленный клиентом на этот порт, и отвечает.
50. Разница между uwsgi, uWSGI и WSGI
WSGI: полное название — интерфейс шлюза веб-сервера, который представляет собой спецификацию, описывающую, как веб-сервер взаимодействует с веб-приложением. django, flask и т. д. следуют этому протоколу.
uwsgi: это протокол для сервера и серверных приложений, который указывает, как пересылать запросы приложениям и возвращать; uwsgi — это проводной протокол, а не протокол связи, который часто используется здесь для передачи данных между серверами uWSGI и другими сетевыми серверами.
uWSGI: это веб-сервер, реализующий протокол WSGI, uwsgi, http и другие протоколы. Роль HttpUwsgiModule в Nginx заключается в обмене с сервером uWSGI.
51. Коды состояния HTTP
1хх: Информация
2xx: успех
3xx: перенаправление
4xx: ошибка клиента
5xx: ошибка сервера
52. Общие методы HTTP-запросов
ПОЛУЧИТЬ, ПОСТАВИТЬ, ПОСТАВИТЬ, УДАЛИТЬ, ИСПРАВИТЬ и т. д.
53. Адаптивный макет
Адаптивный макет — это концепция, представленная Итаном Маркоттом в мае 2010 года. Короче говоря, веб-сайт совместим с несколькими терминалами, а не создает отдельную версию для каждого терминала.
54. Реализуйте простой запрос AJAX
AJAX — это технология, позволяющая обновлять части веб-страницы без перезагрузки всей веб-страницы.
AJAX = асинхронный JavaScript и XML
$(function(){
$('#send').click(function(){
$.ajax({
type: "GET",
url: "test.json",
data: {username:$("#username").val(), content:$("#content").val()},
dataType: "json",
success: function(data){
$('#resText').empty(); //清空resText里面的所有内容
var html = '';
$.each(data, function(commentIndex, comment){
html += '<div class="comment"><h6>' + comment['username']
+ ':</h6><p class="para"' + comment['content']
+ '</p></div>';
});
$('#resText').html(html);
}
});
});
});
55. Политика одинакового происхождения
Политика того же источника ограничивает взаимодействие документов или сценариев, загруженных из одного источника, с ресурсами из другого источника. Это важный механизм безопасности для изоляции потенциально вредоносных файлов.
Если протоколы двух страниц, порты (если они указаны) и хосты одинаковы, две страницы имеют один и тот же источник. Мы также можем назвать это "кортеж протокол/хост/порт" или просто "кортеж" ("Кортеж", "юань" означает, что некоторые вещи объединены в единое целое, например, (1, 2) Вызов двоичного кода, ( 1, 2, 3) называется три юаня)
56. Что такое КОРС
Полное название CORS — Cross-Origin Resource Sharing (Обмен ресурсами между источниками).
57. Что такое CSRF
CSRF (подделка межсайтовых запросов), китайское название: подделка межсайтовых запросов, также известная как атака/сеанс в один клик, сокращенно: CSRF/XSRF.
58. Внешний интерфейс реализует опрос и длинный опрос
голосование
var xhr = new XMLHttpRequest();
setInterval(function(){
xhr.open('GET','/user');
xhr.onreadystatechange = function(){
};
xhr.send();
},1000)
Длинный опрос
function ajax(){
var xhr = new XMLHttpRequest();
xhr.open('GET','/user');
xhr.onreadystatechange = function(){
ajax();
};
xhr.send();
}
59. Кратко опишите MVC и MTV
Так называемый MVC предназначен для разделения веб-приложения на три уровня: модель (M), контроллер (C) и представление (V), которые связаны друг с другом в виде подключаемых модулей и слабо связанным образом. Модель отвечает за бизнес-объект и объект базы данных (ORM), представление отвечает за взаимодействие с пользователем (страницей), а контроллер (C) принимает ввод пользователя и вызывает модель и представление для завершения пользовательского ввода. запрос.
Режим MTV в Django: Model (модель): отвечает за бизнес-объекты и объекты базы данных (ORM), Template (шаблон): отвечает за то, как отображать страницу пользователю, View (представление): отвечает за бизнес-логику и ее вызов когда соответствующие модель и шаблон по существу такие же, как MVC.
60. Идемпотентность интерфейсов
Идемпотентность интерфейса означает, что результаты одного или нескольких запросов, инициированных пользователем для одной и той же операции, согласованы, и не будет побочных эффектов из-за нескольких кликов.
61. Преимущества фреймворка Flask
Простой, легкий, хорошо масштабируемый и с высокой степенью свободы.
62. Что такое ОРМ
Полное название ORM — Object Relational Mapping, то есть объектно-реляционное сопоставление. Идея его реализации состоит в том, чтобы отображать данные таблицы в реляционной базе данных в объекты и отображать их в виде объектов, чтобы разработчики могли преобразовывать операции над базой данных в операции над этими объектами.
63. Значение ФВ и УФ
PV: трафик (просмотр страницы), просмотры страниц или клики, мера количества страниц, посещенных пользователями веб-сайта. В определенный статистический период каждый раз, когда пользователь открывает или обновляет страницу, это регистрируется один раз, а просмотры страниц накапливаются, когда одна и та же страница открывается или обновляется несколько раз. UV: это (уникальный посетитель) независимый посетитель, который подсчитывает количество пользователей, посетивших сайт в течение определенного периода времени (на основе файлов cookie).
64. Роль супервайзера
Процесс управления руководителем, посредством способа вилки / EXEC. Эти процессы управляются как руководитель дочерних процессов, чтобы начать, поэтому нам нужно только управлять путь исполняемого файла для руководителя файла конфигурации.
65. Плюсы и минусы использования ORM и собственного SQL
преимущество:
- Простая в использовании объектно-ориентированная, четкая формулировка;
- Эффективно предотвращать инъекции SQL;
- Удобно динамически конструировать операторы, а элегантнее использовать полиморфизм для одной и той же операции с разными таблицами;
- В определенной степени удобно реконструировать слой данных
- Удобные настройки функции хука
недостаток:
- Нелегко обрабатывать сложные операторы запроса
- Производительность хуже, чем при непосредственном использовании SQL
66. Перечислите некоторые встроенные компоненты django.
- Компонент администратора: это компонент, предназначенный для добавления, удаления, изменения и запроса соответствующей таблицы данных в модели.
- компонент модели: отвечает за работу с базой данных
- Компонент формы: генерируется HTML-код, проверяется достоверность данных, возвращается проверочная информация и
- Компонент Modelform: Используется для операций с базой данных, а также можно использовать для проверки запросов пользователей
67. Перечислите методы выполнения нативного sql в Django.
- Используйте execute для выполнения пользовательского SQL Выполнять операторы SQL напрямую (аналогично использованию pymysql)
from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT DATE_FORMAT(create_time, '%Y-%m') FROM blog_article;")
ret = cursor.fetchall()
print(ret)
- Используйте дополнительный метод: queryset.extra(select={"key": "Собственный оператор SQL"})
- Используйте сырой метод
- Выполнить RAW SQL и вернуть модель
- Зависит от модели модели, в основном используется для операций запроса
68. Разница между файлами cookie и сессиями
Файл cookie — это пара «ключ-значение», которая хранится в браузере и может использоваться для аутентификации пользователя.
Сеанс предназначен для сохранения информации о сеансе пользователя на сервере, значение ключа представляет собой случайно сгенерированную строку, а значение значения представляет собой содержимое сеанса, полагаясь на файл cookie для сохранения случайной строки каждого пользователя в браузере пользователя.
69. Роль модуля BeautifulSoup
Библиотека BeautifulSoup — это библиотека для синтаксического анализа, обхода и поддержки «дерева тегов».
url = "http://www.baidu.com/"
request = requests.get(url)
html = request.content
soup = BeautifulSoup(html, "html.parser", from_encoding="utf-8")
70. Краткое введение в модули Selenium
Selenium — это библиотека, имитирующая работу браузера, согласно нашей инструкции, браузер может автоматически загрузить страницу, получить необходимые данные, даже сделать скриншоты страницы или определить, произошли ли те или иные действия на сайте.
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source) # browser.page_source 是获取网页的全部 html
browser.close()
Добро пожаловать, чтобы обратить внимание на мой публичный аккаунт WeChat - солянка из редьки, или отсканируйте QR-код ниже, давайте общаться, учиться и прогрессировать вместе!