Redis—ACID
A 原子性
redis能够提供部分原子性
MULTI 开启事务
命令 1
命令 2
EXEC
直到服务器收到EXEC命令才真正执行命令,此前命令1、2都被暂时存放在队列
1:如果命令1或2发送到服务器 就检测出命令异常 那么所有命令都不会执行 保证了原子性
2:接受命令时没有检查出错误 具体执行时发现错误 此时正常执行的命令还是能成功执行 此时出现了同一事务部分操作成功 部分失败 没有保证原子性
3:执行事务时实例宕机,那么重启时 实例会保存部分事务操作 如果开启了AOF日志 则可以消除这部分操作 没开启则不能保证原子性了
I 一致性
上述三种情况事务都能保证一致性
隔离性
隔离性分两阶段
Exec命令执行后
此时会将命令队列中的命令全部执行,因为redis执行具体的键值对读写是单线程的
所以这时候即视有其它客户端的命令请求 redis也不会执行 保证了隔离性
Exec命令执行之前
此时redis是能够执行其它客户端的命令的所以不能保证隔离性
比如开启事务之后
命令1为将某个key的value加1 可是 此时只是加入命令队列 到Exec命令之后执行
此时其它客户端命令有可能改变了这个value值
如果调用了WATCH命令 会监控键值对是否发生改变
如果改变事务就不会执行 也算是保证了隔离性
持久性
因为redis是基于内存的数据库
宕机时总是会丢失数据的 即视开启了RDB快照或者时AOF日志