Redis深入之路(十三)

事务

Redis 通过 WATCH、MULTI、EXEC、DISCARD 命令实现事务功能。使用命令队列(FIFO)保存客户端发送的命令,并一次性、按顺序地执行队列里的命令,知道执行完毕。

例如:

// 开始事务
redis> multi
OK

// 命令入队
redis> set name "傅园慧"
QUEUED

// 命令入队
redis> set age 20
QUEUED

// 命令入队
redis> set task "里约奥运会"
QUEUED

// 执行事务
redis> exec
1) OK
2) OK
3) OK
  • 立即执行命令:WATCH、MULTI、EXEC、DISCARD
  • 入队的命令:除了以上四种命令

MULTI

表示事务的开始,通过设置客户端 flags 属性来完成

伪代码:

client.flags |= REDIS_MULTI

EXEC

执行事务,执行事务队列中的所有命令,并且将所有的结构返回给客户端。

WATCH

监视键的变化,在事务的过程中,如果被监视的一个或者多个键被修改,那么服务拒绝执行事务。

事务队列

每个客户端都有事务状态,保存在客户端的 mstate 属性中。

/** 
 * 命令对象,包括参数,参数数量,需要执行的命令 
 */
typedef struct multiCmd {
    // 参数
    robj **argv;

    // 参数数量
    int argc;

    // 命令指针
    struct redisCommand *cmd;
} multiCmd;

/**
 * 事务队列,用于保存客户端发送来的命令,以待执行
 */
typedef struct multiState {
    // 事务队列,FIFO
    multiCmd *commands;

    // 队列元素数量
    int count;
} multiState;

/**
 * Redis 客户端
 */
typedef struct redisClient {
    // ...

    // 事务状态
    multiState mstate;    

    // ...
} redisClient;

事务原子性

对于 Redis 的原子性,众说纷纭,有的说是原子性,有的说不是原子性。个人觉得两种观点都有道理。

认为是原子性

事务中的命令要么全部执行,要么一个都不执行。
全部执行:命令正确,入队正常,执行事务成功
全不执行:命令错误,无法入队,执行事务失败

认为不是原子性

Redis 不支持事务会滚(rollback),即使在执行过程中出现错误,无法回滚之前执行的命令,而且还会继续执行, 直到所有命令都执行完毕。

Redis 作者的解释:

会滚这种复杂的功能不符合 Redis 追求简单高效的设计理念,并且作者认为,执行时错通常都是编程错误,只会发生在开发环境,在生产环境很少会出现,所以认为没必要实现回滚功能。

redis> set name "acid"
OK

redis> multi
OK

redis> rpush 1 2 3
QUEUED

// 错误命令(给字符串键执行列表键命令),但能正常入队,却执行时报错
redis> rpush name "a" "b" "c"
QUEUED

redis> set k1 "v1"
QUEUED

redis> exec
1) (integer) 2
2) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis是一种开源的高性能键值存储系统,它支持丰富的数据结构,包括字符串、哈希、列表、集合和有序集合。在使用Redis时,我们可能会遇到一些问题,下面是一些常见的Redis问题及其解答。 1. Redis支持哪些数据结构? - Redis主要支持五种数据结构:字符串、哈希、列表、集合和有序集合。每种数据结构都有对应的操作命令,可以灵活地进行数据的存储和操作。 2. Redis如何保证数据的持久化? - Redis提供了两种方式来保证数据的持久化:RDB持久化和AOF持久化。RDB持久化是将数据以快照的方式保存到磁盘,AOF持久化是将写命令追加到文件末尾。可以根据需求选择适合的持久化方式。 3. Redis的主从复制是什么? - 主从复制是指将一个Redis服务器的数据复制到多个从服务器上,以实现数据的备份和读写分离等功能。主服务器将写操作同步到从服务器,从服务器只负责读操作,提高系统的并发性能和可靠性。 4. Redis如何解决并发访问的问题? - Redis采用单线程的方式处理客户端请求,通过使用非阻塞I/O和多路复用技术,实现高并发的处理能力。同时,Redis内部使用队列和锁等机制来保证并发访问的安全性。 5. Redis的数据存储位置在哪里? - Redis的数据存储在内存中,这也是其高性能的主要原因之一。同时,Redis也提供RDB和AOF两种持久化机制,将数据保存到磁盘上,以防止数据丢失。 总之,掌握Redis的基本使用和原理,并了解一些常见问题的解决方法,可以更好地使用Redis来构建高性能和可靠的应用系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值