Redis也有事务的功能,但是这个事务可能跟MySQL之类的RDBMS不同。官网上的Transactions介绍了Redis中的事务。Redis中使用multi和exec命令设定事务边界,discard在multi命令提交后可丢弃事务。另外watch命令可以实现CAS操作。
Redis中的事务归纳一下有这么几个特点
- 在multi和exec之间的命令作为事务处理,所有命令视为原子性操作,不能打断。
- 在multi和exec之间的命令如果某条命令发生错误不回滚事务,也就是说,除了出错的命令,其他正常执行。
- 如果开启AOF机制,那么multi和exec的之间的命令也会用一条write命令写到硬盘。如果在写时被硬中断(停电或管理员强制kill),Redis重启时会检测到错误,可以用redis-check-aof工具修复。
- 支持CAS(check and set)操作,watch命令可以锁定某个key,unwatch命令取消锁定,在事务执行时如果检测到watch的key被修改,事务失败。事务成功执行后,会unwatch掉所有观察的keys。
这里需要解释的是为什么Redis提供的事务不支持错误回滚?原因是Redis作为缓存系统,命令被编程到程序里一般不会出错(错误如参数个数出错,类型出错等),如果发生出错,说明是程序出现了问题,在生产环境下一般不会这类问题。并且这样的事务在Redis实现非常简单,因为Redis是单线程程序,所以只要存储事务操作最后一起执行就实现了原子性操作,如果增加回滚会影响Redis性能。 CAS操作应用于下面这个场景 watch stringA stringA_r = stringA + “abcd” multi set stringA string_r exec 这类场景很常见,当stringA被watch后如果发生变动,那么下面的事务就会失败。
相关推荐
总结来说,Redis 的事务和 CAS 实现提供了一种高效且并发友好的方式来管理数据。通过使用 Lua 脚本或 `WATCH` 命令,我们可以实现对数据的乐观锁控制,确保在多客户端并发访问时的数据一致性。虽然 Redis 不像传统的...
Redis 事务是数据库系统中的一种特性,允许用户一次性提交...例如,Redis事务不支持回滚操作,如果事务中的某条命令失败,后续命令仍会执行。因此,在设计使用Redis的事务时,需要考虑到这些限制并进行适当的错误处理。
Redis事务通过`MULTI`, `EXEC`, `DISCARD`, 和 `WATCH` 四个命令实现。事务从`MULTI`开始,到`EXEC`结束,这之间的命令会被打包成一个事务,具有原子性,即在事务执行过程中,不会被其他客户端的请求打断。这意味着...
Redis 提供了 `multi`、`exec` 和 `watch` 命令来实现事务。首先,通过 `multi` 开始一个事务,然后在事务块内执行一系列命令,最后用 `exec` 执行整个事务。`watch` 命令用于监视一个或多个键,如果在 `exec` 执行...
主要特点支持 Redis >= 1.2命令流水线使用 CAS 的 Redis 事务 (MULTI/EXEC)用户可定义命令UNIX 域套接字(在 LuaSocket 中可用时)兼容性该库已经过测试,可与Lua 5.1、Lua 5.2(使用兼容版本的 LuaSocket)和LuaJit...
- **MULTI:**开启事务。 - **EXEC:**提交事务中的所有命令。 - **WATCH:**监视某些键的变化,若变化则取消事务。 **应用场景:** - **数据一致性保证:**在多条命令之间保持原子性。 - **并发控制:**通过分布式...
3. **Redis事务**: - 事务处理保证了单个客户端发起的命令序列的连续执行,避免其他客户端命令的插入。使用`multi`命令开始事务,接着放入一系列命令,最后通过`exec`执行所有命令。如果事务期间有`watch`的key被...