MySQL和Redis总结
程序员文章站
2024-03-20 22:06:52
...
MySQL数据库
数据库基本理念
- 数据的集散地(仓库)
- 数据的持久化:把数据从内存转移到能够长久存储数据的存储介质中,长久的保存数据
- 数据的持久化不仅仅是为了保存数据,而是为了能够更好的管理数据,当需要的数据的时候能按照我们的需求来获取对 应的数据。
- 大多数的数据库都能够保存数据的一致性、完整性并减少数据的冗余。
分类
-
关系型数据库的产品
- Oracle - 银行、电子政务、大型电商企业
- MySQL - 中小企业 --> MariaDB
- DB2 - IBM的产品
- SQLServer - (Microsoft)微软的产品
- SQLite / PostagreSQL
-
关系型数据库的特点
- 理论基础:关系代数 + 集合论
- 具体表现形式:用二维表来保存数据 ,行 – 记录(record) 列 – 字段(field) 主键列 (primary key)
- 编程语言 :SQL (Structured Query Language ) :结构化查询语言
- DDL:数据定义语言 —— create / drop / alter
- DML:数据操纵语言 CRUD(增查改删) —— insert / delete / update / select
- DCL:数据控制语言 —— grank (授予权限)/ revoke (召回权限)
-
非关系数据库的产品
-
MongoDB
-
Redis
-
ElasticSearch
-
范式理论 - 设计二维表的指导思想
- 第一范式:数据表的每个列的值域都是原子值组成的,不能够在分割。
- 第二范式:数据表里的所有数据都要和该表的键(主键与候选键)有完全依赖关系。
- 第三范式:所有的非键属性都只和候选键有相关性,也就是非键属性之间应该独立。
数据的完整性
- 实体完整性:每个实体都是独一无二的
- 主键(primary key)
- 唯一约束(unique)
- 唯一索引
- 参照完整性(引用完整性):关系中不允许引用不存在的实体
- 外键(foreign key)
- 域完整性:数据是有效的
- 数据类型以及长度
- 非空约束(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. 字符串(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"
上一篇: HCL_ospf_验证 笔记
下一篇: 上传代码到github