mysql
事务
- 事务是数据库并发控制的基本单位
- 事务可以看做是一系列SQL语句的集合
- 事务必须要么全部执行成功,要么全部执行失败
ACID
- 原子性(Atomicity): 一个事务中所有操作全部完成或失败
- 一致性(Consistency): 事务开始和结束之后数据完整性没有被破坏
- 隔离性(Isolation): 允许多个事务同时对数据库修改和读写
- 持久性(Durability): 事务结束之后,修改是永久的不会丢失
乐观锁,悲观锁
- 悲观锁是先获取锁再进行操做。一锁二查三更新。select for update
- 乐观锁先修改,更新的时候发现数据已经变了就回滚。check and set
- 使需要根据响应速度、冲突频率、重试代价来判断使用哪一种
musql常用类型
char/varchar/tinytext/text
tinyint/smallint/mediumint/int/sigint/float/double
date/datetime/timestamp
InnoDB vs MyISAM
- MyISAM不支持事务,InnoDB支持事务
- MyISAM不支持外键,InnoDB支持外键
- MyISAM只支持表锁,InnoDB支持行锁和表锁
mysql索引
为什么需要索引
- 索引是数据表中一个或者多个列进行排序的数据结构
- 索引能够大幅提升检索速度
- 创建、更新索引本身也会耗费空间和时间
B-树,B+树
连接
- 内连接(inner join):两个表都存在匹配时,才会返回匹配行
- 外连接(left join right join):返回一个表的行,即使另一个没有匹配
- 全连接(full join): 只要某一个表存在匹配就返回
内连接
select * from A inner join B on a.id = b.id
外连接
select * from A left join B on a.id = b.id
redis
缓存
- 缓解关系数据库(Mysql)并发访问的压力:热点数据
- 减少响应时间:内存IO速度比磁盘快
- 提升吞吐量:Redis等内存数据库单机就可以支撑很大并发
数据类型
- string:用来实现简单的kv键值对存储,比如计数器
- list:实现双向链表,比如用户的关注,粉丝列表
- hash:用来存储彼此相关信息的键值对
- set:存储不重复元素,比如用户的关注着
- sorted set:实时信息排行榜
持久化方式
- 快照方式:把数据快照放在磁盘二进制文件中,dump,.rdb
- AOF:每一个写命令追加到appendonly.aof中
redis事务
- 将多个请求打包,一次性、按序执行多个命令的机制
- redis通过MULTI,EXEC,WATCH等命令实现事务功能
- python redis-py pipeline=conn.pipeline(transaction=True)
分布式锁
- 使用setnx实现加锁,可以同时通过expire添加超时时间
- 锁的value值可以使用一个随机的uuid或者特定的命名
- 释放锁的时候,通过uuid判断是否是该锁,是则执行释放锁
缓存使用模式
- cache aside:同时更新缓存和数据库
- read/write through:先更新缓存,缓存负责同步更新数据库
- write behind caching:先更新缓存,缓存定期异步更新数据库
网友评论