概述
任何技术的产生都是为了解决某些问题。
随着IO的不断增加,使用关系型数据库的网站多多少少都遇到了瓶颈,而这瓶颈大多数都是在物理磁盘的I/O上。随着互联网的不断发展,业务需求的多样化,Web的考验急剧增大,对技术的要求是越来越高。为了解决问题,MySQL不断优化,但仍旧遇到新的问题。
Redis(remote directory service)远程字典服务。
场景
首先这是一个数据库,那数据库必须提供读写能力,和读写同步机制。首先分析他是如何进行写操作的,内存是如何组织的,接着分析如何提供读写同步机制。
数据结构
redis
高级数据结构
底层数据结构
读写同步
事务支持
事务是解决数据安全性
还是用经典的银行转帐来做说明,用户a要给用户b转一笔款,正确的执行流程是a账户减少指定金额,b账户增加指定金额。这两个动作要么同时执行,要么都不执行才能保证数据的准确性,以保证数据一致。 标准数据库有的特性,Redis自然要有的。 一般来说事务包括begin(), commit(), rollback(),
begin();
try:
command1();
command2();
commit()
catch Exception:
rollback()
redis的实现, MULTI即使将后面的任务放到一个队列,原子顺序执行的
127.0.0.1:6379> set user:a:quota 100
OK
127.0.0.1:6379> set user:b:quota 100
OK
#执行转帐事务:a减掉20 b增加20
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> DECRBY user:a:quota 20
QUEUED
127.0.0.1:6379> INCRBY user:b:quota 20
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 80
2) (integer) 120
出现失败场景主要有两类
- EXEC之前的错误,命令会入队后失败,如果成功会返回QUEUED,对于入队失败的,EXEC会自动拒绝这些任务
- EXEC之后的错误,命令会继续执行
也就是说Redis不支持事务回滚。
网络模型
既然是一个KV存储数据库服务器,那到底层网络模型和线程模型是如何组织的
出现
1、纯内存数据库
2、存储数据类型、方式
3、持久化
3、大规模数据插入优化
4、性能,如何优化
5、分片
6、二级索引
7、分布式锁
8、事务
9、客户端
10、LRU