-
- A-原子性
-
- Redis中的事务为什么不会滚
-
C-一致性
-
I-隔离性
-
D-持久性
-
WATCH命令
-
- watch命令的作用
-
watch原理分析
-
内存回收
-
- 过期策略
-
淘汰策略
-
LRU算法
-
- Redis改进后的LRU算法
-
Redis如何管理热度数据
-
LFU算法
-
- 访问频次递增
-
访问频次递减
-
Redis持久化机制
-
- RDB机制
-
- RDB机制触发条件
-
- 自动触发
-
手动触发
-
RDB机制相关配置文件
-
RDB机制优点
-
RDB机制缺点
-
AOF机制
-
- AOF机制如何开启
-
AOF机制数据是否实时写入磁盘
-
AOF重写
-
- 重写原理分析
-
AOF机制触发条件
-
AOF机制机制优点
-
AOF机制机制缺点
-
总结
===============================================================
经过前面相关文章的介绍,我们已经了解了Redis当中数据类型的底层存储结构,对于Redis也可以算是有了基本的认识,那么从这一篇开始,后面的文章会相继介绍Redis当中的一些高级特性,比如事务,持久化,发布/订阅/事件等等,本文主要会介绍以下两大特性:
1、Redis当中的事务及其ACID特性
2、Redis的两种持久化机制:RDB和AOF
===============================================================
提到事务,我想大多数人的第一感觉就是这是关系型数据库的特性,NoSQL数据库一般都不具有事务,那么Redis作为一款NoSQL数据库有事务吗?
答案是肯定的。Redis当中的单个命令都是原子操作,但是如果我们需要把多个命令组合操作的时候就需要用到事务。
Redis当中,通过下面4个命令来实现事务:
-
1、
multi
:开启事务 -
2、
exec
:执行事务 -
3、
discard
:取消事务 -
4、
watch
:监视
下图就是一个完整的事务执行流程:
从上图中,我们可以总结出Redis的事务主要分为以下3步:
-
1、执行命令
multi
开启一个事务 -
2、开启事务之后执行的命令都会被放入一个队列,并且固定返回"QUEUED"
-
3、执行命令
exec
提交事务之后,会依次执行队列里面的命令,并依次返回所有命令结果(如果想要放弃事务,可以执行discard
命令)。
Redis中每个客户端都有自己的事务状态multiState
,下面就是一个客户端client
的数据结构定义:
typedef struct client {
uint64_t id;//客户端唯一id
multiState mstate; //MULTI和EXEC状态(即事务状态)
//…省略其他属性
} client;
multiState
数据结构定义如下:
typedef struct multiState {
multiCmd *commands;//存储命令的FIFO队列
int count;//命令总数
//…省略了其他属性
} multiState;
multiCmd
是一个队列用来接收并存储开启事务之后发送的命令,其数据结构定义如下:
typedef struct multiCmd {
robj **argv;//用来存储参数的数组
int argc;//参数的数量
struct redisCommand *cmd;//命令指针
} multiCmd;
我们以上面事务的示例截图中事务为例,可以得到如下所示的一个简图:
传统的关系型数据库中,一个事务一般都具有ACID特性,想要详细了解事务特性的可以点击这里。那么现在就让我们来分析一下Redis是否也满足这ACID四大特性。
A-原子性
在讨论原子性之前,我们先来看2个例子:
例子一