MySQL和Redis总结

MySQL数据库

数据库基本理念

  1. 数据的集散地(仓库)
  2. 数据的持久化:把数据从内存转移到能够长久存储数据的存储介质中,长久的保存数据
  3. 数据的持久化不仅仅是为了保存数据,而是为了能够更好的管理数据,当需要的数据的时候能按照我们的需求来获取对 应的数据。
  4. 大多数的数据库都能够保存数据的一致性、完整性并减少数据的冗余。

分类

  1. 关系型数据库的产品

    1. Oracle - 银行、电子政务、大型电商企业
    2. MySQL - 中小企业 --> MariaDB
    3. DB2 - IBM的产品
    4. SQLServer - (Microsoft)微软的产品
    5. SQLite / PostagreSQL
  2. 关系型数据库的特点

    1. 理论基础:关系代数 + 集合论
    2. 具体表现形式:用二维表来保存数据 ,行 – 记录(record) 列 – 字段(field) 主键列 (primary key)
    3. 编程语言 :SQL (Structured Query Language ) :结构化查询语言
      • DDL:数据定义语言 —— create / drop / alter
      • DML:数据操纵语言 CRUD(增查改删) —— insert / delete / update / select
      • DCL:数据控制语言 —— grank (授予权限)/ revoke (召回权限)
  3. 非关系数据库的产品

    1. MongoDB

    2. Redis

    3. ElasticSearch

范式理论 - 设计二维表的指导思想

  1. 第一范式:数据表的每个列的值域都是原子值组成的,不能够在分割。
  2. 第二范式:数据表里的所有数据都要和该表的键(主键与候选键)有完全依赖关系。
  3. 第三范式:所有的非键属性都只和候选键有相关性,也就是非键属性之间应该独立。

数据的完整性

  1. 实体完整性:每个实体都是独一无二的
    • 主键(primary key)
    • 唯一约束(unique)
    • 唯一索引
  2. 参照完整性(引用完整性):关系中不允许引用不存在的实体
    • 外键(foreign key)
  3. 域完整性:数据是有效的
    • 数据类型以及长度
    • 非空约束(not null)
    • 默认值约束(default)
    • 检查约束(check)MySQL不支持

数据的一致性

1.事务
  • 事务:一系列对数据库进行的读/写操作,这些操作要么全都成功,要么全都失败。

  • 事务的ACID特性:

    • 原子性(Atomicity):事务作为一个整体被执行,对数据库的操作要么全都执行成功,要么就全都执行失败。
    • 一致性(Consistency):执行完某个事务的时候,数据库的状态应该与操作前后的状态保持数据的一致性。
    • 隔离性(Isolation):多个事务并发执行的时候,每个事务的执行都不会影响另一个事务的执行。
    • 持久性(Duration):已经被提交的事务,应该被永久的保存在数据库中。
  • MySQL中事务的操作

    • begin / start transaction :开启事务坏境
    • commit :提交事务,只有begin到commit之间的所有sql语句都执行成功才会执行commit,否则执行rollback
    • rollback :事务回滚,放弃begin到commit之间执行成功的所有sql语句
     示例:
         begin;
         insert into tb_dept values (1001, '游戏部', '成都');
         insert into tb_dept values (1001, '游戏部2', '成都2');
         commit;
         rollback;
     
    通过例子可以得出,当在执行插入第二条数据的时候发生错误,执行了rollback,尽管第一条语句没有问题但是因为第二条数据出错执行了rollback,所以本次的所有执行将会被退回。
    
2.索引
  • 字段的索引就相当于目录,添加索引可以大大提高查询的效率

  • 两个很大的缺点:1. 会消耗额外的存储空间

    ​ 2.会让增删改数据的效率降低,因为增加了更新索引的时间

  • 索引不能滥用,当项目中的某个字段的查询很频繁时,应考虑添加一个对应的索引。

    创建索引:create index <索引名称> on 表明 (字段名);
    
    删除索引:alter table 表名 drop index <索引名称;
    explain 描述,说明 -- 用来查看SQL语句的执行计划(执行效率),主要看type和rows的值
    
    例如:
    create index index_ename on tb_emp (ename);
    explain select * from tb_emp where ename='张三丰';
    
3.视图
-- 创建视图(查询的快照)
    create view vw_emp_simple as 
    select eno, ename, job, dname 
    from tb_emp t1, tb_dept t2 
    where t1.dno=t2.dno;
    
-- 查询视图
   select * from vw_emp_simple;
    
-- 创建用户并授予查看视图的权限
   create user 'hellokitty'@'%' identified by 'hellokitty.618';
   grant select on hrs.vw_emp_simple to 'hellokitty'@'%';
    
-- 召回用户查看视图的权限
   revoke select on hrs.vw_emp_simple from 'hellokitty'@'%';
    
-- 删除视图
            drop view vw_emp_simple;

Redis数据库

Redis(Remote Dictionary Server)

以键值对的形式存储数据的数据库,放在内存中,读/存数据速度快速,单线程+异步I/O(多路I/O复用)的工作模式

应用场景

  1. 高速缓存服务(用户经常访问的数据从数据库搬到内存中)
  2. 实时排行榜
  3. 投票点赞
  4. 消息队

常用的几种类型

1. 字符串(String)
set key value - 创建一个字符串类型的键值对
set key value ex 30 - 将键的过期时间设置为30seconds后消失
ttl key - 查看该键何是消失(-1永不超时)
get key - 获取key对应的value
mset a 1 b 3 c 4 - 创建多组键值对
mget a b c - 获取多组键值对的值
dbsize - 查看有几组键值对
del key1 key2 - 删除指定键值对
exists key - 查看是否存在该键值对
setnx / sertex
bgsave - 后台保存
select <数字> - 切换数据库(初始在0,共有16个)
flushdb(flushall) - 删除当前数据库(所有数据库)
incr key - 当键值对的值是数字的时候,可以使用incr让值加一,相当于value += 1操作
desr key - 值减1
incrby key <num> - 指定键值对的值增加多少, value += num
strlen key - 获取键值对的长度
2. 哈希表(hash)
hset <字段名> key1 value1 - 一次创建一个键值对
hset <字段名> key2 value2
hmset <字段名> key1 value1 key2 value2... - 一次性创建多个键值对
hget <字段名> key1 - 获取key对应的value
hmget <字段名> key1 key2.. - 获取多个value
hkeys <字段名> - 获取全部的key
hvals <字段名> - 获取全部value
hgetall <字段名> - 获取全部key和value

示例:
127.0.0.1:6379> hset stu stuid 1001
(integer) 1
127.0.0.1:6379> hset stu name huang
(integer) 1
127.0.0.1:6379> hset stu gender male
(integer) 1
127.0.0.1:6379> hmset stu2 stuid 1002 name xiong gender male bitrh 1996-10-28
OK
127.0.0.1:6379> hget stu
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget stu stuid
"1001"
127.0.0.1:6379> hmget stuid name gender
1) (nil)
2) (nil)
127.0.0.1:6379> hmget stu name gender 
1) "huang"
2) "male"
127.0.0.1:6379> hvals stu
1) "1001"
2) "huang"
3) "male"
127.0.0.1:6379> hgetall stu
1) "stuid"
2) "1001"
3) "name"
4) "huang"
5) "gender"
6) "male"
127.0.0.1:6379> 
3. 列表(List)
- lpush key value —— 往列表的左边依次放数据
- rpush key value —— 往列表的右边依次存放数据
- lrange key <开始下标> <结束下标> —— 遍历列表中的值
- lpop key —— 移出列表中左边第一个值
- rpop key —— 移出列表中右边的第一个值

示例:
127.0.0.1:6379> lpush numbers 1 2 3 4 5 6 
(integer) 6
127.0.0.1:6379> lrange numbers 0 6
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lpop numbers 
"6"
127.0.0.1:6379> lpop numbers1
"1"
127.0.0.1:6379> rpop numbers1
"6"
127.0.0.1:6379> 
4. 集合(Set)自动去重
- sadd key value1 value2... —— 往集合(key)中添加元素
- srem key value1—— 删除元素
- smembers key —— 查看集合中的元素
- scard key —— 查看集合中元素的个数
- sismember key value —— 查看指定元素是否在集合中,1在0不在
- spop key <num> —— 随机移除集合中的num个元素
- sinter key1 key2 —— 求交集
- sunion key1 key2 —— 求并集
- sdiff key1 key2 —— 求差集

示例:
127.0.0.1:6379> sadd set1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> scard set1
(integer) 6
127.0.0.1:6379> sismembers set1 7
(error) ERR unknown command `sismembers`, with args beginning with: `set1`, `7`, 
127.0.0.1:6379> sismember set1 7
(integer) 0
127.0.0.1:6379> sismember set1 1
(integer) 1
127.0.0.1:6379>
5. 有序集合(Zset)
- zadd student 100 zhangsan 88 wangwu 98 zhaoliu —— 创建一个有序集合
- zrange student 0 -1—— 根据分数升序,0 -1 表示显示全部的记录
- zrange student 0 -1 wtihtscores —— (withscores)连同结果一并显示
- zrevrange sorce 0 -1 —— 降序
- zincrby student 150 wangwu —— 修改wangwu的分数

示例:
127.0.0.1:6379> zadd student 100 zhangsan 88 wangwu 98 zhaoliu
(integer) 3
127.0.0.1:6379> zrange student 0 -1
1) "san"
2) "zhang"
3) "wangwu"
4) "zhaoliu"
5) "zhangsan"
127.0.0.1:6379> zrange student 0 -1 withscores
1) "san"
2) "34"
3) "zhang"
4) "78"
5) "wangwu"
6) "88"
7) "zhaoliu"
8) "98"
9) "zhangsan"
10) "100" 
127.0.0.1:6379> zadd student 100 zhangsan 88 wangwu 98 zhaoliu
(integer) 3
127.0.0.1:6379> zrange student 0 -1
1) "san"
2) "zhang"
3) "wangwu"
4) "zhaoliu"
5) "zhangsan"
127.0.0.1:6379> zrange student 0 -1 withscores
1) "san"
2) "34"
3) "zhang"
4) "78"
5) "wangwu"
6) "88"
7) "zhaoliu"
8) "98"
9) "zhangsan"
10) "100"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值