-
创建保存点:
SAVEPOINT identifier
-
删除保存点:
RELEASE SAVEPOINT identifier
-
把事务回滚到保存点:
ROLLBACK TO identifier
-
查询事务的隔离级别:
show variables like '%isolation%';
-
设置事务的隔离级别:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
InnoDB 提供的隔离级别有
-
READ
-
UNCOMMITTED
-
READ COMMITTED
-
REPEATABLE READ
-
SERIALIZABLE
4. 示例
create table abc
(
id int unsigned primary key auto_increment,
name varchar(32) unique,
age int unsigned
) charset=utf8;
begin;
insert into abc (name, age) values (‘aa’, 11);
insert into abc (name, age) values (‘bb’, 22);
– 在事务中查看一下数据
– 同时另开一个窗口,连接到 MySQL 查看一下数据是否一样
select * from abc;
commit;
begin;
insert into abc (name, age) values (‘cc’, 33);
insert into abc (name, age) values (‘dd’, 44);
update abc set age=77 where name=‘aa’;
– 在事务中查看一下数据
select * from abc;
rollback;
select * from abc; – 事务结束后在查看一下数据
二、存储过程
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
- 优点
-
存储过程可封装,并隐藏复杂的商业逻辑。
-
存储过程可以回传值,并可以接受参数。
-
存储过程无法使用 SELECT 指令来运行,因为它是子程序,与查看表,数据表或用户定义函数不同。
-
存储过程可以用在数据检验,强制实行商业逻辑等。
- 缺点
-
存储过程,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的存储过程。
-
存储过程的性能调校与撰写,受限于各种数据库系统。
语法
- 声明语句结束符,可以自定义:
存储过程中有很多的SQL语句,SQL语句的后面为了保证语法结构必须要有分号(;),但是默认情况下分号表示客户端代码发送到服务器执行。必须更改结束符
DELIMITER $$
– 或者
DELIMITER //
- 声明存储过程:
CREATE PROCEDURE demo_in_parameter(IN p_in int)
- 存储过程开始和结束符号:
BEGIN … END
- 变量赋值:
SET @p_in=1
- 变量定义:
DECLARE l_int int unsigned default 4000000;
- 创建mysql存储过程、存储函数:
create procedure 存储过程名(参数)
- 存储过程体:
create function 存储函数名(参数)
使用
- 简单用法
– 定义
– 如果存储过程中就一条SQL语句,begin…end两个关键字可以省略
create procedure get_info()
select * from student;
– 调用
call get_info();
- 复杂一点的 (备注:只能在标准 mysql 客户端中执行,mycli 无法识别)
delimiter // – 定义前,将分隔符改成 //
create procedure foo(in uid int)
begin
select * from student where id
=uid;
update student set city
=‘北京’ where id
=uid;
end//
delimiter ; – 定义完以后可以将分隔符改回 分号
call foo(3);
- 查看存储过程
show procedure status like “%foo%”;
show create procedure foo;
- 删除存储过程
drop procedure foo;
三、Python操作
- 安装:
pip install pymysql
- 使用
import pymysql
db = pymysql.connect(host=‘localhost’,
user=‘user’,
password=‘passwd’,
db=‘db’,
charset=‘utf8’)
try:
with db.cursor() as cursor:
插入
sql = “INSERT INTO users
(email
, password
) VALUES (%s, %s)”
cursor.execute(sql, (‘webmaster@python.org’, ‘very-secret’))
需要手动提交才会执行
db.commit()
with db.cursor() as cursor:
读取记录
sql = “SELECT id
, password
FROM users
WHERE email
=%s”
cursor.execute(sql, (‘webmaster@python.org’,))
result = cursor.fetchone()
print(result)
finally:
db.close()
四、sql注入
什么是SQL注入?
SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
思考:下面的代码有没有问题?
import pymysql
db = pymysql.connect(host=‘localhost’,user=‘root’,password=‘abcd1234’,db=‘test’,charset=‘utf8’)
name=input(‘请输入用户名:’)
password=input(‘请输入密码:’)
try:
with db.cursor() as cursor:
sql = ‘select * from user where name=“%s” and password=“%s”’ %(name,password)
print(sql)
cursor.execute(sql)
print(cursor.fetchone())
db.commit()
finally:
db.close()
五、数据备份与恢复
- 备份
mysqldump -h localhost -u root -p dbname > dbname.sql
- 恢复
mysql -h localhost -u root -p123456 dbname < ./dbname.sql
Redis 与 MongoDB
一、NoSQL概述
如今,大多数的计算机系统(包括服务器、PC、移动设备等)都会产生庞大的数据量。其实,早在2012年的时候,全世界每天产生的数据量就达到了2.5EB(艾字节)。这些数据有很大一部分是由关系型数据库来存储和管理的。实践证明,关系型数据库是实现数据持久化最为重要的方式,它也是大多数应用在选择持久化方案时的首选技术。
NoSQL 是一项全新的数据库革命性运动,虽然它的历史可以追溯到1998年,但是NoSQL真正深入人心并得到广泛的应用是在进入大数据时候以后,业界普遍认为NoSQL是更适合大数据存储的技术方案,这才使得NoSQL的发展达到了前所未有的高度。2012年《纽约时报》的一篇专栏中写到,大数据时代已经降临,在商业、经济及其他领域中,决策将不再基于经验和直觉而是基于数据和分析而作出。事实上,在天文学、气象学、基因组学、生物学、社会学、互联网搜索引擎、金融、医疗、社交网络、电子商务等诸多领域,由于数据过于密集和庞大,在数据的分析和处理上也遇到了前所未有的限制和阻碍,这一切都使得对大数据处理技术的研究被提升到了新的高度,也使得各种NoSQL的技术方案进入到了公众的视野。
NoSQL数据库按照其存储类型可以大致分为以下几类:
| 类型 | 部分代表 | 特点 |
| — | — | — |
| 列族数据库 | HBase
Cassandra
Hypertable | 顾名思义是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的I/O优势,适合于批量数据处理和即时查询。 |
| 文档数据库 | MongoDB
CouchDB
ElasticSearch | 文档数据库一般用类JSON格式存储数据,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能,但不提供对参照完整性和分布事务的支持。 |
| KV数据库 | DynamoDB
Redis
LevelDB | 可以通过key快速查询到其value,有基于内存和基于磁盘两种实现方案。 |
| 图数据库 | Neo4J
FlockDB
JanusGraph | 使用图结构进行语义查询的数据库,它使用节点、边和属性来表示和存储数据。图数据库从设计上,就可以简单快速的检索难以在关系系统中建模的复杂层次结构。 |
| 对象数据库 | db4o
Versant | 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。 |
二、Redis 入门
Redis 是一种基于键值对的NoSQL数据库,它提供了对多种数据类型(字符串、哈希、列表、集合、有序集合、位图等)的支持,能够满足很多应用场景的需求。Redis将数据放在内存中,因此读写性能是非常惊人的。与此同时,Redis也提供了持久化机制,能够将内存中的数据保存到硬盘上,在发生意外状况时数据也不会丢掉。此外,Redis还支持键过期、地理信息运算、发布订阅、事务、管道、Lua脚本扩展等功能,总而言之,Redis的功能和性能都非常强大,如果项目中要实现高速缓存和消息队列这样的服务,直接交给Redis就可以了。目前,国内外很多著名的企业和商业项目都使用了Redis,包括:Twitter、Github、StackOverflow、新浪微博、百度、优酷土豆、美团、小米、唯品会等。
1. Redis简介
2008年,一个名为Salvatore Sanfilippo的程序员为他开发的LLOOGG项目定制了专属的数据库(因为之前他无论怎样优化MySQL,系统性能已经无法再提升了),这项工作的成果就是Redis的初始版本。后来他将Redis的代码放到了全球最大的代码托管平台Github,从那以后,Redis引发了大量开发者的好评和关注,继而有数百人参与了Redis的开发和维护,这使得Redis的功能越来越强大和性能越来越好。
Redis是 remote dictionary server 的缩写,它是一个用 ANSI C 编写的高性能的key-value存储系统,与其他的key-value存储系统相比,Redis有以下一些特点(也是优点):
-
Redis的读写性能极高,并且有丰富的特性(发布/订阅、事务、通知等)。
-
Redis支持数据的持久化(RDB和AOF两种方式),可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
-
Redis支持多种数据类型,包括:string、hash、list、set,zset、bitmap、hyperloglog等。
-
Redis支持主从复制(实现读写分离)以及哨兵模式(监控master是否宕机并自动调整配置)。
-
Redis支持分布式集群,可以很容易的通过水平扩展来提升系统的整体性能。
-
Redis基于TCP提供的可靠传输服务进行通信,很多编程语言都提供了Redis客户端支持。
2. Redis的应用场景
-
高速缓存 - 将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。
-
排行榜 - 很多网站都有排行榜功能,利用Redis中的列表和有序集合可以非常方便的构造各种排行榜系统。
-
商品秒杀/投票点赞 - Redis提供了对计数操作的支持,网站上常见的秒杀、点赞等功能都可以利用Redis的计数器通过+1或-1的操作来实现,从而避免了使用关系型数据的
update
操作。 -
分布式锁 - 利用Redis可以跨多台服务器实现分布式锁(类似于线程锁,但是能够被多台机器上的多个线程或进程共享)的功能,用于实现一个阻塞式操作。
-
消息队列 - 消息队列和高速缓存一样,是一个大型网站不可缺少的基础服务,可以实现业务解耦和非实时业务削峰等特性,这些我们都会在后面的项目中为大家展示。
3. Redis的安装和配置
可以通过在Redis的 官方网站 下载 Redis 的源代码,解压缩解归档之后通过 make 工具对源代码进行构建并安装。
wget http://101.44.1.120/files/318700000890F623/download.redis.io/releases/redis-5.0.8.tar.gz
tar -zxvf redis-5.0.8.tar.gz
cd redis-5.0.8
sudo make && sudo make install
4. Redis 的配置
在 redis 源代码目录下有一个名为redis.conf的配置文件,我们可以先查看一下该文件: vim redis.conf
- 配置将 Redis 服务绑定到指定的IP地址和端口。
bind 127.0.0.1
port 6379
- 设置后台运行 (以守护进程方式运行)
daemonize yes
- 设置日志级别, 可选值: (
debug
: 调试,verbose
: 详细,notice
: 通知,warning
: 警告)
loglevel warning
- 配置数据库的数量, 默认为 16 个
databases 16
- 配置数据写入规则
save 900 1 # 900 秒 (15 分钟) 内修改过 1 个 key, , 写入一次数据库
save 300 10 # 300 秒 (5 分钟) 内修改过 10 个 key, 写入一次数据库
save 60 10000 # 60 秒 (1 分钟) 内修改过 10000 个 key, 写入一次数据库
- 配置Redis的持久化机制 - RDB。
rdbcompression yes # 压缩 RDB 文件
rdbchecksum yes # 对 RDB 文件进行校验
dbfilename dump.rdb # RDB 数据库文件的文件名
dir /var/local/redis # RDB 文件保存的目录
- 配置Redis的持久化机制 - AOF。
appendonly no
appendfilename “appendonly.aof”
- 配置Redis的主从复制,通过主从复制可以实现读写分离。
Master-Replica replication. Use replicaof to make a Redis instance a copy of
another Redis server. A few things to understand ASAP about Redis replication.
±-----------------+ ±--------------+
| Master | —> | Replica |
| (receive writes) | | (exact copy) |
±-----------------+ ±--------------+
1) Redis replication is asynchronous, but you can configure a master to
stop accepting writes if it appears to be not connected with at least
a given number of replicas.
2) Redis replicas are able to perform a partial resynchronization with the
master if the replication link is lost for a relatively small amount of
time. You may want to configure the replication backlog size (see the next
sections of this file) with a sensible value depending on your needs.
3) Replication is automatic and does not need user intervention. After a
network partition replicas automatically try to reconnect to masters
and resynchronize with them.
replicaof 主机IP地址 主机端口
- 配置慢查询。
slowlog-log-slower-than 10000 # 一次操作超过 10000 毫秒被视作一次慢查询
slowlog-max-len 128 # 最多纪录 128 次满查询
5. Redis的服务器和客户端
接下来启动 Redis 服务器,下面的方式将以指定的配置文件启动 Redis 服务。
redis-server redis.conf
接下来用 Redis 客户端去连接服务器。
redis-cli -h localhost -p 6379
Redis有着非常丰富的数据类型,也有很多的命令来操作这些数据,具体的内容可以查看Redis命令参考,在这个网站上,除了Redis的命令参考,还有Redis的详细文档,其中包括了通知、事务、主从复制、持久化、哨兵、集群等内容。
127.0.0.1:6379> set username admin
OK
127.0.0.1:6379> get username
“admin”
127.0.0.1:6379> set password “123456” ex 300
OK
127.0.0.1:6379> get password
“123456”
127.0.0.1:6379> ttl username
(integer) -1
127.0.0.1:6379> ttl password
(integer) 286
127.0.0.1:6379> hset stu1 name hao
(integer) 0
127.0.0.1:6379> hset stu1 age 38
(integer) 1
127.0.0.1:6379> hset stu1 gender male
(integer) 1
127.0.0.1:6379> hgetall stu1
-
“name”
-
“hao”
-
“age”
-
“38”
-
“gender”
-
“male”
127.0.0.1:6379> hvals stu1
-
“hao”
-
“38”
-
“male”
127.0.0.1:6379> hmset stu2 name wang age 18 gender female tel 13566778899
OK
127.0.0.1:6379> hgetall stu2
-
“name”
-
“wang”
-
“age”
-
“18”
-
“gender”
-
“female”
-
“tel”
-
“13566778899”
127.0.0.1:6379> lpush nums 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange nums 0 -1
-
“5”
-
“4”
-
“3”
-
“2”
-
“1”
127.0.0.1:6379> lpop nums
“5”
127.0.0.1:6379> lpop nums
“4”
127.0.0.1:6379> rpop nums
“1”
127.0.0.1:6379> rpop nums
“2”
127.0.0.1:6379> sadd fruits apple banana orange apple grape grape
(integer) 4
127.0.0.1:6379> scard fruits
(integer) 4
127.0.0.1:6379> smembers fruits
-
“grape”
-
“orange”
-
“banana”
-
“apple”
127.0.0.1:6379> sismember fruits apple
(integer) 1
127.0.0.1:6379> sismember fruits durian
(integer) 0
127.0.0.1:6379> sadd nums1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd nums2 2 4 6 8
(integer) 4
127.0.0.1:6379> sinter nums1 nums2
-
“2”
-
“4”
127.0.0.1:6379> sunion nums1 nums2
-
“1”
-
“2”
-
“3”
-
“4”
-
“5”
-
“6”
-
“8”
127.0.0.1:6379> sdiff nums1 nums2
-
“1”
-
“3”
-
“5”
127.0.0.1:6379> zadd topsinger 5234 zhangxy 1978 chenyx 2235 zhoujl 3520 xuezq
(integer) 4
127.0.0.1:6379> zrange topsinger 0 -1 withscores
-
“chenyx”
-
“1978”
-
“zhoujl”
-
“2235”
-
“xuezq”
-
“3520”
-
“zhangxy”
-
“5234”
127.0.0.1:6379> zrevrange topsinger 0 -1
-
“zhangxy”
-
“xuezq”
-
“zhoujl”
-
“chenyx”
127.0.0.1:6379> geoadd pois 116.39738549206541 39.90862689286386 tiananmen 116.27172936413572 39.99
135172904494 yiheyuan 117.27766503308104 40.65332064313784 gubeishuizhen
(integer) 3
127.0.0.1:6379> geodist pois tiananmen gubeishuizhen km
“111.5333”
127.0.0.1:6379> geodist pois tiananmen yiheyuan km
“14.1230”
127.0.0.1:6379> georadius pois 116.86499108288572 40.40149669363615 50 km withdist
-
- “gubeishuizhen”
-
“44.7408”
6. Redis持久化
Redis在运行时,所有的数据都保存在内存里,进程结束以后,会将数据写入到硬盘中。启动时,会读取硬盘里的内容,并将内容全部加载到内存中(会大量的占用内存)。
Redis的持久化有两种形式:RDB和AOF
6.1 RDB
默认的持久化方式,是对内存中的数据进行镜像,并以二进制的形式保存到dump.rdb文件中。会根据配置文件的时间节点对文件进行持久化。
save 900 1
save 300 10
save 60 10000
优点:速度快,直接镜像内存里的数据,文件小。
缺点:数据有可能会丢失,在两次保存间隔内的数据,有可能会丢失。
6.2 AOF
AOF(Append only file)持久化,将修改的每一条指令记录进appendonly.aof中,需要修改配置文件,来打开aof功能。
appendfsync always:每次有新命令追加到aof文件时就执行一个持久化,非常慢但是安全
appendfsync everysec:每秒执行一次持久化,足够快(和使用rdb持久化差不多)并且在故障时只会丢失1秒钟的数据
appendfsync no:从不持久化,将数据交给操作系统来处理。redis处理命令速度加快但是不安全。
优点:适合保存增量数据,数据不丢失。
缺点:文件体积大,恢复时间长
7. 在Python程序中使用Redis
可以使用pip安装redis模块。redis模块的核心是名为Redis的类,该类的对象代表一个Redis客户端,通过该客户端可以向Redis服务器发送命令并获取执行的结果。上面我们在Redis客户端中使用的命令基本上就是Redis对象可以接收的消息,所以如果了解了Redis的命令就可以在Python中玩转Redis。
import redis
client = redis.Redis(host=‘1.2.3.4’, port=6379, password=‘1qaz2wsx’)
client.set(‘username’, ‘admin’)
True
client.hset(‘student’, ‘name’, ‘hao’)
1
client.hset(‘student’, ‘age’, 38)
1
client.keys(‘*’)
[b’username’, b’student’]
client.get(‘username’)
b’admin’
client.hgetall(‘student’)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
最后
Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
👉Python所有方向的学习路线👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
👉Python全套学习视频👈
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
👉实战案例👈
学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。
因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。
👉大厂面试真题👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
ip1024c (备注Python)**
[外链图片转存中…(img-1RPkawu5-1711879158555)]
最后
Python崛起并且风靡,因为优点多、应用领域广、被大牛们认可。学习 Python 门槛很低,但它的晋级路线很多,通过它你能进入机器学习、数据挖掘、大数据,CS等更加高级的领域。Python可以做网络应用,可以做科学计算,数据分析,可以做网络爬虫,可以做机器学习、自然语言处理、可以写游戏、可以做桌面应用…Python可以做的很多,你需要学好基础,再选择明确的方向。这里给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
👉Python所有方向的学习路线👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
👉Python全套学习视频👈
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
👉实战案例👈
学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。
因此在学习python的过程中一定要记得多动手写代码,教程只需要看一两遍即可。
👉大厂面试真题👈
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。