一.redis数据的特点和优势。
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
二redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
三.与其他key-value存储的不同
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
(以上文字取自菜鸟教程,只供自己观看。)
一.mysql数据的基础
(一)DML数据操作语言
1.创建数据库。
create database if not exists 数据库名字 default charset utf8
2.切换使用数据库
use 数据库 切换到指定的数据库。
3.新建表
create table if not exists 表名(字段1 类型1 约束1,字段2 类型2 约束2.......)
其中注意的是每个表都是要有主键的 primary key 。auto_increment自动增加只针对主键有效,并且主键的类型是整型。
4.删除表
drop table if exists 表名
清空表中的数据:truncate table 表名
5.修改表(增加新字段)
alter table 表名 add column 字段名 字段类型 约束
6.删除字段
alter table 表名 drop column 字段名
7.修改字段
alter table 表名 modify 字段名 字段类型 约束 (不重命名)
alter table 表名 change 原字段名 新字段名 字段类型 约束(重命名)
(二)DML数据操作语言
1.增
insert into 表名 values(值1, 值2, 值3,....) - 依次给指定表中的字段赋值
insert into 表名(字段名1,字段名2,...) values(值1, 值2,...) -以指定的顺序给指定的字段赋值
2.删
delete from t_student 删除表中所有的记录
delete from 表名 where 条件语句 - 删除满足条件的记录
3.改
update 表名 set 字段1=新值1, 字段2=新值2,... where 条件语句 -将表中满足条件的行中指定字段的值赋值为新值
UPDATE t_student set birth='2000-01-01' WHERE stuname LIKE '小%'; -- 修改stuname是以'小'开头的行对应的birth的值
4.查(重点)
select from 表名 ---->获取表中的所有的数据。
selcet 字段名1,字段名2 from 表名
selcet 字段1, 字段2 from 表名 where 条件
5.对字段重命名
select 字段1 as 新字段1, 字段2 as 新字段2,... from 表名
6.对查询结果重新赋值
select if(字段名,值1,值2) from 表名; -查询指定字段,并且判断字段对应的值是0还是1,如果是1结果为值1,否则为值2。
7.对列进行合并
select concat(字段1,字段2,...) from 表名
8.模糊查询
SELECT * FROM t_student WHERE stuname like '%飞%' or not stuid < 110
查询的时候时候通过like条件来指定查询对象
9.排序
select * from 表名 order by 字段 asc; - 对查询结果按照指定字段的值进行升序排序
select * from 表名 order by 字段 desc; - 对查询结果按照指定字段的值进行降序排序
10.去重
select distinct 字段名 FROM 表名
11.限制和分页
限制: SELECT * FROM 表名 limit N; - 查询的时候只获取前N条数据
偏移: SELECT * FROM 表名 limit M offset N; - 跳过前N条数据获取M条数据(从第N+1条数据开始,获取M条数据)
SELECT * FROM 表名 limit M,N - 跳过前M条数据取N条数据
12.聚合
select max(score) as max_score FROM tb_record; -- 获取tb_record中最高分
13.分组
select 聚合操作 from 表名 group by (字段); - 按指定字段的值对表进行分组,然后对每个分组进行聚合操作。
注意: 分组后,除了分组字段以外,其他字段只能聚合操作
14.子查询
第一种子查询:
将查询结果作为另一个查询的条件
获取成绩是最高分的所有的学生的id
select max(score) as max_s from tb_record;
select sid from tb_record where score=(select max(score) as max_s from tb_record)
第二种查询:
注意: 如果要将查询结果作为查询对象,那么查询结果对应的查询必须重命名
select * from tb_student limit 4,5;
select stuname from (select * from tb_student limit 4,5) as t1;
-- select stuname as sname, stuaddr as saddr from tb_student WHERE stusex=0;
select sname,saddr from (select stuname as sname, stuaddr as saddr from tb_student WHERE stusex=0) as t1 where saddr like '%成都' 。
15.连表查询(内连接)
(1) select * from 表名1,表名2,表名3 连接条件 查询条件
注意: 如果既有连接条件又有查询条件,查询条件必须放在连接条件的后面
(2)SELECT * FROM 表1 inner join 表2 on 表2的连接条件 inner join 表3 on 表3的连接条件
16.外连接
外连接分为左外连接、右外连接和全连接, 但是在MySQL中支持左外连接和右外连接
表1(左表) left/right/inner join 表2(右表)
左外连接:将左表中对应字段的所有数据取出,然后再对应的右表中字段的值,如果右表对应的值不存在结果就为null
右外连接:将右表中对应字段的所有数据取出,然后再对应的左表中字段的值,如果左表对应的值不存在结果就为null
(三)DCL
1.创建用户
create user 用户名@登录地址
登录地址: (限制用户能够登录MySQL的主机地址), ip地址(指定地址), localhost(数据库本机), %(任何位置)
CREATE USER 'zhangshan'@'%' IDENTIFIED BY 'yuting123456
删除用户: drop user 用户名
DROP USER 'zhangshan
2.授权
grant 权限类型 on 数据库.对象 to 用户名;
GRANT SELECT on school.tb_student TO 'zhangshan';
GRANT UPDATE on school.tb_student TO 'zhangshan';
GRANT all PRIVILEGES ON school.* TO 'zhangshan'; -- 添加所有权限
GRANT all PRIVILEGES ON school.* TO 'zhangshan' WITH GRANT OPTION; -- 添加所有权限,并且能够将自己的权限再授权给其他用户
3.召回授权
REVOKE 权限类型 on 数据库.对象 from 用户名
REVOKE DELETE on school.* FROM 'zhangshan
REVOKE all PRIVILEGES on school.* FROM 'zhangshan
REVOKE all PRIVILEGES on school.* FROM 'zhangshan
REVOKE SELECT on school.tb_student FROM 'zhangshan
REVOKE UPDATE on school.tb_student FROM 'zhangshan
4.事务
完成一个任务需要执行多条sql,但是要求这多个操作中只要有一个操作失败,这个任务就失败,数据全部还原;所有的操作都成功,整个任务才成功的时候就使用事务
开启事务环境
BEGIN;
UPDATE tb_student set stuname='444' WHERE stuname='222
UPDATE tb_student set birth2='1990-1-1' WHERE stuname='222'
提交事务(只有begin到commit之间的所有的sql都执行成功,才会执行commit; 否则执行rollback)
COMMIT
事务回滚(放弃beigin到commit之间执行成功的所有sql语句的结果)
ROLLBACK
(四)mysql连接的操作
1.连接数据库
连接对象 = pymysql.connect(host,port,user,password) - 和指定mysql建立连接并且返回一个连接对象
说明:
host - mysql主机地址(localhost表示当前设备上的mysql, 服务器公网ip)
port - mysql服务端口, 3306
user - mysql用户
password - 用户对应的密码(如果创建用户的时候没有设置密码,这个参数可以不用赋值)
database - 建立连接后默认操作的数据库
charset - 设置连接的数据库文件的编码方式
autocommit - 是否自动提交
"""
con = pymysql.connect(
host='localhost',
port=3306,
user='root',
password='yuting123456',
database='school',
charset='utf8',
autocommit=True
)
2.通过连接获取游标对象
with 连接对象.cursor(查询返回值类型=None) as 游标对象:
数据库操作上下文
说明:
查询返回值类型 - None: 查询结果以元组的形式返回;
pymysql.cursors.DictCursor: 查询结果以字典的形式返回
数据库操作上下文 - 游标对象(数据库操作)只有在数据库操作上下文才有效
with con.cursor() as cursor:
数据库操作上下文
执行sql语句: 游标对象.execute(sql语句)
cursor.execute('create database if not exists pyschool;')
3.关闭连接
con.close()
(五).mysql与redis做缓存的代码
import pickle
import time
import pymysql
import redis
def load_depts_from_db():
conn = pymysql.connect(host='120.77.222.217', port=3306,
user='root', password='123456',
database='hrs', charset='utf8')
depts = ()
try:
with conn.cursor() as cursor:
cursor.execute('select dno, dname, dloc from tb_dept')
depts = cursor.fetchall()
except pymysql.MySQLError as err:
print(err)
finally:
conn.close()
return depts
def main():
client = redis.Redis(host='120.77.222.217', port=6379, password='1qaz2wsx')
start = time.time()
data = client.get('depts')
if data:
depts = pickle.loads(data)
else:
depts = load_depts_from_db()
client.set('depts', pickle.dumps(depts))
end = time.time()
print(depts)
print(f'执行时间: {end - start}秒')
if __name__ == '__main__':
main()
网友评论