热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于redis:redis学习之事务

事务是通过MULTI命令开始的,在非事务状态下客户端发送的命令会被立刻执行,而在事务状态下,除了EXECWATCHDISCARD这几个命令外,redis会将命令保留在事务队列里。

事务的实现

事务是通过MULTI命令开始的,在非事务状态下客户端发送的命令会被立刻执行,而在事务状态下,除了EXEC/WATCH/DISCARD这几个命令外,redis会将命令保留在事务队列里。

typedef strcut redisClient{
    //事务状态
    multiState mstate;
    ...
}redisClient;

typedef struct multiState{
    //事务队列 FIFO
    multiCmd *commands;
    //已入队命令计数
    int counts;
}multiState;

typedef struct multiCmd{
    //参数
    robj *args;
    //参数数量
    int argc;
    //命令指针
    struct redisCommand *cmd;
}multiCmd;

当一个处于事务状态的客户端向服务器发送EXEC命令时,服务器会遍历这个客户端的事务队列并执行队列里的所有命令,最初将执行命令后的所有后果返回给客户端。

redis事务的ACID

redis是具备原子性、一致性、隔离性的,不过不具备性情的持久性。

  • 对于redis的事务性来说,事务队列中的命令要么全副执行要么一个都不执行,不过redis并不反对事务的回滚,这是它与关系性数据库很大的一个区别。
  • redis是应用单线程的形式来执行事务,且事务在执行的过程中不会被中断,也就是说redis的事务总是以串行的形式运行的,这样其事务也就具备了隔离性。
  • 事务的持久性是指一个事务执行结束时,执行这个事务所得的后果曾经被保留到了永恒存储介质里,即便服务器在事务执行后停机,执行所得的后果也不会失落。redis将数据写入内存后,会依据长久化配置将数据同步到磁盘里,这其实是有一个滞后过程的,显然redis并不具备这一个性

本文参考的有:
黄健宏的《Redis设计与实现》一书


推荐阅读
author-avatar
sddfdffwfefe_863
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有