88.redis数据和mysql数据缓存机制。

一.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 条件语句 -将表中满足条件的行中指定字段的值赋值为新值

\color{red}{通配符\%可以匹配任意个数的字符包括0个}

UPDATE t_student set birth='2000-01-01' WHERE stuname LIKE '小%'; -- 修改stuname是以'小'开头的行对应的birth的值


4.查(重点)
\color{yellow}{查在我们平时的应用中用的十分的广泛}

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 表名

\color{red}{注意:数字和字符窜数据可以合并,bit类型的数据是不可以合并的}

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.聚合
\color{red}{max(),min(),sum(),avg(),count()}

select max(score) as max_score FROM tb_record; -- 获取tb_record中最高分

13.分组

select 聚合操作 from 表名 group by (字段); - 按指定字段的值对表进行分组,然后对每个分组进行聚合操作。
注意: 分组后,除了分组字段以外,其他字段只能聚合操作

\color{red}{在分组后如果加条件需要用having代替where}

14.子查询

\color{red}{将一个的结果作为另一个查询条件或者查询对象。}

第一种子查询:

将查询结果作为另一个查询的条件

获取成绩是最高分的所有的学生的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)

第二种查询:

\color{red}{将一个的结果作为另一个查询的对象。}

注意: 如果要将查询结果作为查询对象,那么查询结果对应的查询必须重命名

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()






最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Redis是啥 Redis是一个开源的key-value存储系统,由于拥有丰富的数据结构,又被其作者戏称为数据结构...
    一凡呀阅读 1,173评论 0 5
  • 本文为笔者对在学习Redis过程中所收集资料的一个总结,目的是为了以后方便回顾相关的知识,大部分为非原创内容。特此...
    EakonZhao阅读 14,425评论 0 9
  • Redis是一个 Key-Value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更...
    vivi_wong阅读 13,344评论 2 4
  • 欢迎大家关注我的其他 Github博客 和 Csdn ,互相交流! 1. Redis 简介 •Redis是一款开源...
    程序员祝融阅读 574评论 2 9
  • 原文:第十一章 有以为利,无以为用三十辐[1]共一毂[2],当其无[3],有车之用。埏埴[4]以为器,当其无,有器...
    九五自尊阅读 389评论 0 1