欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL和Redis总结

程序员文章站 2024-03-20 22:06:52
...

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"
相关标签: 数据库文档