数据库 - 数据的仓库(集散地) - database - 实现数据持久化和数据管理
持久化 - 将数据从内存转移到能够长久保存数据的存储介质的过程
保证数据的完整性和一致性
完整性:
- 实体完整性 - 每一个实体都是独一无二的,没有冗余 - 主键/唯一索引
- 参照完整性 - 外键
- 域完整性 - 存储的数据都是有效的数据 - 数据类型/数据长度/非空约束/默认值约束/检查约束
alter table tb_score add constraint ck_score_scmark check (scmark between 0 and 100);
一致性 - 事务 - 要么全成功要么全失败,操作不可分割 - ACID特性
- A - Atomicity - 原子性 - 不可分割
- C - Consistency - 一致性 - 事务前后数据状态要一致
- I - Isolation - 隔离性 - 并发的多个事务不知道彼此的中间状态
- D - Duration - 持久性 - 事务完成后数据要做持久化
数据库的分类:关系型数据库(SQL)和非关系型数据库(NoSQL)
- 文档数据库 - MongoDB / ElasticSearch
- 键值对数据库 - Redis
- 列族数据库
- 图数据库
文件系统 / 层次数据库 / 网状数据库
关系型数据库
- 1970s - E.F.Codd - IBM研究员 - System R
- 理论基础:关系代数和集合论
- 具体表象:用二维表来保存数据 - 学生表
~ 行:一条记录 - 一个学生的信息
~ 列:一个字段 - 学生的某个属性,例如:学号、姓名、出生日期
~ 主键列:能够唯一标识一条记录的列,例如:学生的学号 - 编程语言:SQL - 结构化查询语言
~ DDL - 数据定义语言 - create / drop / alter
~ DML - 数据操作语言 - insert / delete / update / select
~ DCL - 数据控制语言 - grant / revoke
LAMP = Linux + Apache + MySQL + PHP
PHP ---> Java
MySQL ---> Oracle
Linux ---> 小型机
去IOE运动:
- IBM的小型机
- Oracle的数据库
- EMC的存储设备
关系型数据库产品:
- Oracle - 甲骨文
- IBM DB2
- Microsoft SQLServer
- Sybase
- MySQL
- PostgreSQL
- SQLite
连接MySQL的图形化客户端工具:
- Navicat for MySQL - 病猫
- SQLyog - 海豚
- Toad for MySQL - 蛤蟆
设计数据库中的表 - ER图(实体关系图)- 概念模型图
Redis - KV数据库 - 内存 - 单线程+异步I/O(多路I/O复用)
计算密集型应用 - 多进程 + 多线程
I/O密集型应用 - 单线程 + 异步I/O(协程)
2008年 - LLOOGG - log(日志)
MySQL - Redis - REmote DIctionary Server
Github / Twitter / Sina / tencent / baidu / meituan
冷数据(不经常使用)/ 热数据(经常使用)
- 高速缓存服务(用户经常访问的数据从数据库搬到内存)
- 实时排行榜
- 投票点赞
- 消息队列
yum install redis
源代码构建安装 make && make install
启动Redis服务器:
redis-server --port 1234 --requirepass 1qaz2wsx --appendonly yes
redis-server 配置文件 > redis.log &
启动Redis客户端:
redis-cli -h 主机IP地址 -p 端口
主机:端口> auth 密码
主机:端口> ping
哈希存储 - 性能非常好的存储方案 - set
obj --- 哈希函数 ---> 哈希码(散列码)---> 对象在内存中存储的位置
文件 ---> MD5 / SHA1 / SHA256 ---> 哈希码(数字指纹/签名)
Redis的常用数据类型:string / hash / list / set / zset