Celery介绍和基本使用

https://zhuanlan.zhihu.com/p/64595171#Celery%E6%9C%89%E4%BB%A5%E4%B8%8B%E4%BC%98%E7%82%B9
Celery 是一个 基于python开发的分布式异步消息任务队列

如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可用的例子:

异步任务:将耗时的操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音频处理等等
做一个定时任务,比如每天定时执行爬虫爬取指定内容
还可以使用celery实现简单的分布式爬虫系统等等
Celery 在执行任务时需要通过一个消息中间件(Broker)来接收和发送任务消息,以及存储任务结果,

Celery有以下优点

简单:
Celery 易于使用和维护,并且它 不需要配置文件 ,并且配置和使用还是比较简单的(后面会讲到配置文件可以有)
高可用:
当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务
快速:单个 Celery 进程每分钟可处理数以百万计的任务,而保持往返延迟在亚毫秒级
灵活:
Celery 几乎所有部分都可以扩展或单独使用,各个部分可以自定义。

1711070527737

对接口压力过大怎么优化

-加缓存
-优化sql
-加硬件
-加异步

mysql如何做读写分离

MySQL读写分离是通过将读操作和写操作分别分配到不同的数据库服务器上来提高数据库系统的性能和可靠性。通常情况下,写操作比读操作更耗费系统资源,因此将读操作分配到只读数据库服务器上可以减轻主数据库服务器的负载,提高整个系统的吞吐量。
以下是实现MySQL读写分离的一般步骤:

1.设置主从复制:


 .在MySQL中,可以通过主从复制(Master-Slave Replication)来实现读写分离。在这种架构下,主数据库服务器(Master)负责处理写操作,而从数据库服务器(Slave)则负责处理读操作。
 .首先,需要确保主数据库服务器上的数据能够同步到从数据库服务器上。可以通过配置主服务器和从服务器的配置文件(如my.cnf)来启用主从复制。


2.配置读写分离规则:


 .在应用程序中,配置读写分离规则,使得写操作发送到主数据库服务器,而读操作发送到从数据库服务器。
 .可以通过在应用程序中设置数据库连接池或使用中间件来实现读写分离的规则。


3.读写分离中间件:


 .使用读写分离中间件可以更方便地实现读写分离,例如,使用MySQL Proxy、MaxScale、ProxySQL等。
 .这些中间件可以拦截数据库请求,并根据配置规则将请求转发到不同的数据库服务器上,从而实现读写分离。


4.负载均衡:


  .在读操作较多的情况下,可以使用负载均衡器(如Nginx、HAProxy等)来均衡不同从数据库服务器的负载,从而进一步提高系统的性能和可靠性。


5.监控和维护:


 .定期监控数据库服务器的运行状态和复制延迟,确保主从复制正常运行。
 .及时处理数据库服务器的故障或延迟问题,保证读写分离系统的稳定性和可用性。

通过以上步骤,可以实现MySQL的读写分离,提高数据库系统的性能和可靠性,同时降低主数据库服务器的负载。

char和varchar的区别

CHAR 和 VARCHAR 是两种用于存储字符数据的数据类型。它们之间的主要区别在于存储方式和使用的存储空间
在数据库中,CHAR 和 VARCHAR 是两种用于存储字符数据的数据类型。它们之间的主要区别在于存储方式和使用的存储空间。

1.存储方式:


2.CHAR 是一种固定长度的数据类型,它会在存储数据时使用固定的空间。如果存储的字符数少于定义的长度,会使用填充字符来占满剩余空间。
3.VARCHAR 是一种可变长度的数据类型,它会根据存储的实际数据长度来动态分配空间。它不会使用填充字符,只占用实际存储的字符数所需的空间。


4.存储空间:


5.对于 CHAR 类型,无论存储的实际数据长度如何,它都会占用定义的固定空间。例如,如果定义一个长度为 10 的 CHAR 列,即使存储的实际数据只有 5 个字符,它也会占用 10 个字符的存储空间。
6.对于 VARCHAR 类型,它只会占用实际存储数据的空间,而不会浪费额外的空间。例如,如果存储的实际数据是 5 个字符长度,它只会占用 5 个字符的存储空间。

总结:

7.使用 CHAR 类型适合存储固定长度的字符串,例如存储国家代码、性别等固定长度的数据。
8.使用 VARCHAR 类型适合存储可变长度的字符串,例如存储姓名、地址等长度不固定的数据。
9.CHAR 类型适合存储频繁进行查询的数据,因为它的存储空间是固定的,查询速度可能会更快。
10.VARCHAR 类型适合存储长度不固定的数据,因为它的存储空间是根据实际数据长度动态分配的,节省存储空间。

需要根据实际需求和数据特性来选择适当的 CHAR 或 VARCHAR 类型来存储字符数据。

utf-8和utf-8mb4

UTF-8 和 UTF-8mb4 都是用于表示 Unicode 字符集的编码方式,在存储和处理字符数据时有一些区别。

1.UTF-8 编码:


2.UTF-8 是一种变长的编码方式,可以表示 Unicode 字符集中的所有字符。
3.对于常见的拉丁字母和一些常见的符号,UTF-8 使用一个字节表示。
4.对于其他较少使用的字符,UTF-8 使用多个字节表示,最多可以使用 4 个字节来编码一个字符。


5.UTF-8mb4 编码:


6.UTF-8mb4 是基于 UTF-8 编码方式的一种扩展,可以支持包含 Emoji 等较为特殊的字符。
7.UTF-8mb4 使用固定的 4 个字节来编码所有字符,不像 UTF-8 可能使用较少的字节表示常见字符。
8.通过使用 UTF-8mb4 编码,可以在存储和处理字符数据时避免一些兼容性问题,特别是在处理特殊字符时。

在数据库中,UTF-8mb4 编码适用于需要存储和处理特殊字符,如表情符号(Emoji)、一些较为生僻的字符等的场景。如果使用较旧的 MySQL 版本,可能默认使用 UTF-8 编码,无法存储和处理特殊字符。因此,需要将数据库的字符集编码设置为 UTF-8mb4 以支持这些特殊字符。
需要注意的是,UTF-8mb4 在存储和处理字符数据时会占用更多的存储空间和内存。在设计数据库和应用程序时,要考虑到存储空间和性能的因素。如果不需要存储特殊字符,使用 UTF-8 编码可能更加合适。

char varchar 数字表示什么

# 1 mysql char 的数字表示什么意思
在 MySQL 中,CHAR 是一种用于存储固定长度字符串的数据类型。当你声明一个列为 CHAR 类型时,你需要指定该列的长度。例如,CHAR(10) 表示该列可以存储最多 10 个字符的字符串,不论实际存储的字符串长度是多少,都会用空格填充到指定的长度。

CHAR 类型的数字表示其字符的最大长度。例如,CHAR(10) 表示该列可以存储最多 10 个字符的字符串。



# 2 mysql varchar的数字表示什么意思
在 MySQL 中,VARCHAR 是一种用于存储可变长度字符串的数据类型。与 CHAR 类型不同,VARCHAR 类型允许存储的字符串长度是可变的,但仍然受到指定的最大长度限制。

当你声明一个列为 VARCHAR 类型时,你需要指定该列可以存储的最大字符数。例如,VARCHAR(255) 表示该列可以存储最多 255 个字符的字符串。

这个数字表示的是该列能够容纳的最大字符数,并且这个数字会影响到数据库中存储数据所占用的空间。请注意,实际存储在 VARCHAR 列中的字符串长度可以少于指定的最大长度,但不能超过它


mysql中utf8和utf8mb4有什么区别

# 4 mysql中utf8和utf8mb4有什么区别

在 MySQL 中,utf8 和 utf8mb4 是用于设置字符集和校对规则的关键字,它们之间有一些重要的区别。
# 存储能力:
utf8:在 MySQL 5.5.3 之前的版本中,utf8 只支持最多 3 字节的 UTF-8 编码,因此无法存储一些特殊字符(如 Emoji 表情等)
utf8mb4:从 MySQL 5.5.3 版本开始引入了 utf8mb4 字符集,支持最多 4 字节的 UTF-8 编码,可以存储更广泛的 Unicode 字符,包括 Emoji 表情等
# 存储空间:
由于 utf8 仅支持最多 3 字节的编码,因此某些字符如果使用 utf8 存储会被截断,而 utf8mb4 可以完整存储这些字符。
使用 utf8mb4 字符集存储文本可能会占用更多的存储空间,因为它支持更广泛的字符集。

# 兼容性:
utf8 是 MySQL 的默认字符集,但在处理一些特殊字符时可能会出现问题,尤其是 Emoji 表情等。
utf8mb4 能够更好地支持现代应用中的多语言字符和特殊字符,因此在实际应用中更为常见。
因此,如果你的应用需要存储包含 Emoji 表情等特殊字符的文本,建议使用 utf8mb4 字符集。在创建数据库或表时,可以通过设置字符集和校对规则来指定所需的字符集,例如:

CREATE DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


CREATE TABLE my_table (
    my_column VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);

这样就可以确保你的数据库和表能够正确地存储和处理各种特殊字符。

int(1)数字表示什么

在 MySQL 中,INT 是一种用于存储整数的数据类型。当你声明一个列为 INT 类型时,后面的数字表示该列能够存储的整数范围。

具体来说,数字代表了整数的存储范围。在 MySQL 中,INT 类型通常指的是带符号的整数,其范围取决于指定的数字大小。以下是一些常见的 INT 类型及其范围:

INT(1) 至 INT(4):分别表示 4 个字节的整数,能够存储的范围约为 -2^31 (-2147483648) 至 2^31-1 (2147483647)。
INT(5) 至 INT(9):同样是 4 个字节的整数,范围也是约为 -2^31 至 2^31-1。
INT(10) 至 INT(24):8 个字节的整数,能够存储的范围约为 -2^63 (-9223372036854775808) 至 2^63-1 (9223372036854775807)。
INT(25) 至 INT(53):8 个字节的整数,范围也是约为 -2^63 至 2^63-1。
请注意,这些范围是以有符号整数的形式给出的。如果你使用无符号整数 (UNSIGNED INT),则范围将从 0 开始,而不是从负数开始

mysql中varchar最大能存多长字符串

在 MySQL 中,VARCHAR 类型可以存储可变长度的字符串,其最大长度取决于数据库的版本和配置。

在 MySQL 5.0.3 之前的版本中,VARCHAR 列的最大长度为 255 个字符。然而,从 MySQL 5.0.3 版本开始,这个限制被改为 65,535 个字符。不过,这个最大长度仍受到行大小限制的影响,因为一个行的最大大小是 65,535 字节。此外,索引和其他列也会占用部分行大小。

需要注意的是,如果你使用的是 utf8mb4 字符集,每个字符可能会占用多个字节,这会进一步降低实际存储的字符串长度。通常来说,VARCHAR 列的最大长度是 65,535 个字节,而不是字符。因此,如果你的字符集是 utf8mb4,那么实际能够存储的字符数将取决于存储的字符所占用的字节数。

如果你需要存储超过 65,535 个字符的字符串,可以考虑使用 TEXT 或 LONGTEXT 类型,这些类型可以存储更大的文本数据,但需要额外的存储空间和处理成本

单例模式

单例模式是一种创建型设计模式,它确保一个类只能有一个实例,并提供一个访问该实例的全局访问点。使用单例模式可以方便地控制对象的创建和访问,以确保在整个应用程序中只存在一个实例。
在Python中,有多种实现单例模式的方式。下面介绍两种常用的方式:

1.使用模块级别的变量实现:

# singleton.py
class Singleton:
    def __init__(self):
        # 初始化操作
        pass

# 创建一个模块级别的变量,用于保存单例实例
singleton_instance = Singleton()

在其他模块中,可以通过导入该模块并使用singleton_instance来获取单例实例。由于模块级别的变量只会被创建一次,因此每次导入模块时,都会返回同一个实例。

2.使用装饰器实现:

def singleton(cls):
    instances = {}

    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper

@singleton
class Singleton:
    def __init__(self):
        # 初始化操作
        pass

通过将@singleton装饰器应用到类上,可以将该类变为单例类。装饰器使用一个字典instances来保存各个类的实例,当需要创建实例时,先检查instances字典中是否已经存在该类的实例,如果存在则直接返回,如果不存在则创建新实例并保存到字典中。
请注意,在单线程环境下,上述两种方式都可以正常工作。但在多线程环境下,需要对实现进行进一步的线程安全处理,以确保只有一个实例被创建。 

线程,进程,协程

线程(Thread)、进程(Process)、协程(Coroutine)是计算机程序执行过程中的三个重要概念,它们都与程序执行的并发性和并行性有关,但在实现上有所不同。

1.线程(Thread):


2.线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
3.一个进程可以包含多个线程,这些线程共享进程的内存空间和系统资源。
4.线程之间可以通过共享内存空间来进行通信。
5.多线程的优势在于可以提高程序的响应速度和并发性,但需要注意线程安全问题。


6.进程(Process):


7.进程是计算机中已运行程序的实例。它拥有独立的内存空间和系统资源。
8.每个进程都是独立运行的,并且进程之间通常通过进程间通信(IPC)来进行通信。
9.进程之间的切换开销较大,但是进程可以更好地利用多核处理器,实现真正意义上的并行计算。


10.协程(Coroutine):


11.协程是一种用户态的轻量级线程,由程序员自己控制调度。
12.协程可以在同一个线程内实现多个任务的切换执行,而不需要进行线程切换,因此可以提高程序的执行效率。
13.协程通常用于实现高效的并发编程,如异步编程框架中的事件循环。

总的来说,线程和进程是操作系统提供的执行单位,而协程是由程序员控制的执行单位。线程适用于需要实现并发的场景,进程适用于需要实现并行的场景,而协程适用于需要高效利用计算资源的场景。

项目开发流程

项目开发流程可以根据具体项目的规模、需求和团队情况而有所不同,但通常包括以下几个主要阶段:

1.需求分析阶段:


2.定义项目的业务需求和功能需求,明确项目的目标和范围。
3.与客户、利益相关者进行沟通,收集用户需求,明确项目的功能和特性。
4.编写需求文档或用户故事,对需求进行详细描述和分析。


5.设计阶段:


6.根据需求分析阶段的结果,进行系统架构设计和技术选型。
7.设计数据库结构、界面设计、系统模块设计等。
8.编写技术文档和设计文档,对系统的设计进行详细说明。


9.开发阶段:


10.根据设计文档和需求文档,进行编码实现。
11.可以采用敏捷开发、迭代开发等开发模式,将项目拆分为多个阶段或迭代周期进行开发。
12.进行单元测试、集成测试和系统测试,确保代码质量和功能的正确性。


13.测试阶段:


14.进行软件测试,包括功能测试、性能测试、安全测试等。
15.发现和修复软件中的缺陷和问题。
16.进行用户验收测试,确保软件符合用户的期望和需求。


17.部署和发布阶段:


18.部署软件到生产环境或测试环境。
19.进行系统的配置和调优。
20.发布软件版本,将软件交付给用户或客户使用。


21.运维和维护阶段:


22.监控系统运行情况,及时发现和解决问题。
23.进行系统的更新和维护,保证系统的稳定性和安全性。
24.收集用户反馈,不断改进和优化系统。

在整个项目开发流程中,沟通和协作是非常重要的,团队成员需要密切合作,及时交流和解决问题,以确保项目能够按时交付并满足用户需求。同时,持续集成、持续交付和持续部署等DevOps实践也可以帮助提高项目开发效率和质量。

什么情况下会用到悲观锁

悲观锁通常在以下情况下会被使用:

1.并发写入场景: 当多个线程或进程需要同时对共享资源进行写操作时,为了避免数据竞争和数据不一致的问题,可以使用悲观锁来确保在任意时刻只有一个线程或进程能够对资源进行写操作,其他线程或进程则需要等待。
2.事务处理: 在数据库系统中,悲观锁通常用于事务处理中。当一个事务需要对数据库中的某些数据进行修改时,为了防止其他事务对同一数据进行修改,可以在事务中使用悲观锁来锁定相应的数据,确保在事务完成前其他事务无法对数据进行修改。
3.资源竞争较为频繁: 当资源的竞争较为频繁,且需要保证数据的一致性和完整性时,悲观锁可以提供一种简单而有效的方式来管理资源的访问顺序,避免竞争导致的问题。
4.数据操作频率较低: 在数据操作频率较低的情况下,使用悲观锁可以较为简单地确保数据的一致性,而不需要引入复杂的并发控制机制。

总的来说,悲观锁适用于对并发写入进行频繁且需要保证数据一致性的场景,但需要注意悲观锁可能会引入额外的性能开销和系统复杂度。在选择是否使用悲观锁时,需要根据具体情况权衡利弊,并考虑其他并发控制机制的适用性。

项目什么情况下会用到乐观锁

乐观锁通常在以下情况下会被使用:

1.读操作较多: 当一个数据项被频繁读取而很少被修改时,使用乐观锁可以避免对读操作的性能影响。乐观锁假设数据在大多数情况下不会被修改,因此不会对读操作进行任何阻塞或加锁。
2.数据冲突较少: 当并发写入数据的冲突较少时,即同时修改同一数据的概率较低时,乐观锁的性能通常优于悲观锁。因为乐观锁只在提交时检查数据版本,而不会在读取时进行加锁操作,因此在数据冲突较少的情况下,可以降低锁的竞争和开销。
3.数据更新频率较低: 当数据项的更新频率较低,即不会频繁发生写操作时,使用乐观锁可以减少锁的竞争和开销,提高系统的并发性能。
4.数据一致性要求相对较低: 在一些场景下,对数据的一致性要求相对较低,允许部分并发修改的情况发生,可以选择使用乐观锁来处理并发更新操作,而不是采用悲观锁进行严格的串行化处理。

总的来说,乐观锁适用于读操作频繁、数据更新较少、数据冲突较少且对数据一致性要求相对较低的场景。在选择是否使用乐观锁时,需要根据具体情况权衡性能、并发性和数据一致性等因素。

python反射机制

在Python中,反射机制是指通过一系列内置函数和特殊方法来动态地获取对象的信息、调用对象的方法以及访问对象的属性。Python的反射机制主要基于对象的特殊方法和内置函数,包括以下几个主要部分:

1.getattr() 函数: getattr(object, name[, default])函数用于获取对象的属性或方法。如果对象有指定名称的属性或方法,则返回该属性或方法;如果没有找到,则返回默认值(如果提供了)。可以利用getattr()函数实现反射机制中的属性访问。
2.setattr() 函数: setattr(object, name, value)函数用于设置对象的属性值。可以利用setattr()函数实现反射机制中的属性设置。
3.hasattr() 函数: hasattr(object, name)函数用于检查对象是否具有指定的属性或方法。如果对象有指定名称的属性或方法,则返回True,否则返回False。
4.delattr() 函数: delattr(object, name)函数用于删除对象的指定属性。可以利用delattr()函数实现反射机制中的属性删除。
5.__getattr__() 特殊方法: 当试图访问一个对象中不存在的属性时,Python会调用对象的__getattr__()方法。可以重写__getattr__()方法来自定义对象的属性访问行为。
6.__setattr__() 和 __delattr__() 特殊方法: 分别用于自定义对象的属性设置和属性删除行为。
7.内置函数 vars(): vars(object)函数返回对象的__dict__属性,即对象的命名空间(包含对象的所有属性和方法)的字典形式。可以利用vars()函数实现对对象属性的反射操作。
8.内置函数 dir(): dir([object])函数用于列出对象的所有属性和方法,返回一个包含字符串列表的列表。可以用于查看对象的所有可用属性和方法。

这些函数和特殊方法为Python提供了灵活的反射机制,使得在运行时可以动态地操作对象的属性和方法,从而实现更灵活的编程和功能扩展。

怎么是装饰器

装饰器是Python中一种强大的语法特性,它允许在不修改原函数代码的情况下,动态地扩展或修改函数的行为。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数或可调用对象。装饰器通常用于添加额外的功能、修改函数的行为或对函数进行包装。
下面是一个简单的装饰器示例:
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

# 调用被装饰的函数
say_hello()

在这个示例中,my_decorator 是一个装饰器函数,它接受一个函数作为参数 func,并定义了一个内部函数 wrapper,在 wrapper 中对被装饰的函数进行了包装。wrapper 函数在调用被装饰的函数 func 前后添加了额外的功能。最后,使用 @my_decorator 语法将 say_hello 函数装饰起来,使得 say_hello 函数被 my_decorator 装饰器修饰。
当调用 say_hello() 函数时,实际上是调用了经过装饰器修饰后的 wrapper 函数,从而在输出 "Hello!" 之前和之后分别打印了额外的信息。
装饰器的应用场景包括但不限于:

1.记录日志
2.计时器
3.缓存数据
4.输入验证
5.权限控制
6.错误处理等

通过装饰器,可以有效地将这些功能与原函数解耦,使得代码更加清晰、易读和易维护。

csrf的原理

CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击方式,攻击者通过欺骗用户在当前已登录的网站上执行恶意操作,利用用户身份发起未经用户授权的请求,从而执行恶意操作,可能导致用户账户被盗用、数据泄露等安全问题。
CSRF攻击的原理是利用了网站对用户的认证信息的信任,攻击者通过各种方式诱使用户访问包含恶意请求的页面,当用户访问这些页面时,浏览器会自动发送之前在当前网站登录过的身份认证信息(如cookie),导致恶意请求被发送到目标网站,从而实现攻击者的恶意目的。
以下是CSRF攻击的一般原理步骤:

1.用户登录网站: 用户在目标网站登录,并获得了有效的身份认证信息(如session cookie)。
2.攻击者构造恶意页面: 攻击者构造一个包含恶意请求的页面,可能是一个图片、一个链接、一个表单等形式。
3.用户访问恶意页面: 攻击者诱使用户访问包含恶意请求的页面,可以通过各种途径,如诱导用户点击链接、发送钓鱼邮件等。
4.浏览器发送请求: 用户在浏览器中访问了恶意页面后,浏览器会自动发送之前在当前网站登录过的身份认证信息(如cookie),导致恶意请求被发送到目标网站。
5.目标网站处理请求: 目标网站接收到了包含恶意请求的请求,由于是在用户的身份下发送的请求,网站会认为是合法请求,并执行相应的操作。

为了防止CSRF攻击,通常采取以下措施:

为了防止CSRF攻击,通常采取以下措施:

6.CSRF Token: 在每个表单或请求中添加一个CSRF Token,该Token与用户会话相关联,用于验证请求的合法性。
7.SameSite Cookie属性: 使用SameSite Cookie属性限制第三方网站对cookie的访问,可以减少CSRF攻击的风险。
8.Referer检查: 在服务器端对请求的Referer进行检查,确保请求是从合法的来源发起的。
9.双重确认: 对于敏感操作,用户在执行前需要进行二次确认,以防止恶意操作。
10.使用验证码: 对于一些重要的操作,引入验证码机制,确保用户操作的真实性。

通过以上措施,可以有效地降低CSRF攻击的风险,保护用户和网站的安全。

mysql的DDL,DCL,DML是什么意思

在数据库中,DDL、DML和DCL是不同类型的SQL语句,用于执行不同的操作:

1.DDL(Data Definition Language): 数据定义语言,用于定义数据库结构和模式,包括创建、修改和删除数据库对象(如表、索引、视图、存储过程等)。常见的DDL语句包括:


	.CREATE:用于创建数据库对象,如表、索引、视图等。
	.ALTER:用于修改数据库对象的结构,如修改表结构、添加或删除列等。
	.DROP:用于删除数据库对象,如删除表、索引等。
	.TRUNCATE:用于删除表中的所有数据,但保留表的结构。


2.DML(Data Manipulation Language): 数据操纵语言,用于对数据库中的数据进行操作,包括查询、插入、更新和删除数据等。常见的DML语句包括:


	.SELECT:用于查询数据库中的数据。
	.INSERT:用于向数据库表中插入新的数据。
	.UPDATE:用于更新数据库表中的现有数据。
	.DELETE:用于从数据库表中删除数据。


3.DCL(Data Control Language): 数据控制语言,用于控制数据库用户的访问权限和安全性,包括授予和撤销用户权限等。常见的DCL语句包括:


	.GRANT:用于授予用户对数据库对象的特定权限。grant
	.REVOKE:用于撤销用户对数据库对象的权限。revoke

通过组合使用DDL、DML和DCL语句,可以实现对数据库的结构和数据进行管理、操作和控制。

docker网络管理

Docker的网络管理允许在容器之间以及容器与外部世界之间进行通信。Docker提供了多种网络模式和插件来管理容器之间的通信和连接外部网络的方式。以下是一些常见的Docker网络管理方面的内容:

1.桥接网络(Bridge Network):
	这是Docker默认的网络模式。在桥接网络中,每个容器分配一个IP地址,并且容器可以通过容器名称相互通信。此外,可以通过端口映射将容器的端口映射到主机上,以允许外部网络访问容器中的服务。
    
2.主机网络(Host Network): 
	在主机网络模式下,容器与宿主机共享网络命名空间。这意味着容器使用宿主机的网络堆栈,不会进行网络地址转换。主机网络模式提供了最佳的网络性能,但可能会导致网络端口冲突。
    
3.无桥接网络(None Network): 
	在无桥接网络模式下,Docker不为容器创建网络命名空间。这意味着容器将不会拥有网络接口,也不会有网络配置。通常用于完全隔离容器。
    
4.覆盖网络(Overlay Network): 
	覆盖网络允许在多个Docker宿主机之间创建跨主机的虚拟网络,使得容器可以在不同宿主机上进行通信。这种网络模式通常用于构建分布式应用程序或集群。
    
5.MacVLAN和IPvLAN网络:
	这两种网络模式允许容器直接连接到物理网络,并分配一个真实的MAC地址和IP地址。这些网络模式通常用于需要与物理网络集成的场景,如基于容器的网络功能虚拟化。
    
6.自定义网络:
Docker允许用户创建自定义网络,并指定网络的子网、网关等参数。自定义网络可以帮助管理容器之间的通信,并提供更灵活的网络配置选项。

7.第三方网络插件: Docker还支持第三方网络插件,如Calico、Weave等,这些插件提供了更多高级的网络功能和管理特性,如安全性、性能优化、故障转移等。

通过合理选择和配置这些网络模式和插件,可以满足不同应用场景下的网络需求,并实现容器之间的可靠通信和连接外部网络的能力。

docker数据卷管理

Docker数据卷管理允许在容器之间共享和持久化数据,以及与宿主机进行数据交换。数据卷可以存储在宿主机上,也可以由Docker管理,具有持久性和独立于容器的特性。以下是关于Docker数据卷管理的一些重要内容:

1.创建数据卷: 可以使用docker volume create命令手动创建数据卷,也可以在启动容器时使用-v或--mount参数自动创建数据卷。
2.挂载数据卷: 将数据卷挂载到容器的特定路径上,使容器可以访问数据卷中的数据。可以在容器启动时通过-v或--mount参数指定挂载数据卷的方式。
3.共享数据卷: 多个容器可以共享同一个数据卷,实现容器之间的数据共享。这对于需要多个容器之间共享数据的场景非常有用,例如数据库容器与应用程序容器之间的数据共享。
4.数据卷容器: 可以创建一个专门用于存储数据的数据卷容器,其他容器可以通过挂载数据卷容器来共享其中的数据。这种方式可以更好地管理数据卷,并且使数据卷的生命周期与容器的生命周期解耦。
5.管理数据卷: 使用docker volume ls和docker volume rm等命令可以列出和删除数据卷。可以使用docker volume inspect命令查看数据卷的详细信息。
6.绑定挂载: 除了挂载数据卷外,还可以将宿主机上的目录或文件直接绑定到容器中,使容器可以访问宿主机上的文件系统。这种方式称为绑定挂载。
7.匿名卷和具名卷: Docker数据卷可以是匿名的(由Docker自动生成名称)或具名的(由用户指定名称)。具名卷可以更好地管理和识别数据卷,而匿名卷更适用于临时或一次性使用的场景。

通过合理使用数据卷管理功能,可以实现容器中数据的持久化存储、共享和管理,提高应用程序的灵活性和可靠性。

sql注入

利用现有程序,将恶意的sql语句命令注入到后台的数据库引擎执行的能力,闲符号一会注释掉之后的sql,根本原理就是字符串的拼接name="%s",django的orm就不会出现这种问题