1.redis事务的概念
redis事务可以一次性执行多个命令,有两个重要的特性:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
2.redis事务的用法
redis实现事务控制有5个命令。这5个命令是事务的基础。
A.discard:取消事务,放弃执行事务块内的所有命令。
B.exec:执行所有事务块内的命令。
C.multi:标记一个事务块的开始。
D.unwatch:取消 WATCH 命令对所有 key 的监视。
E.watch:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
3.redis事务样例:
实例一:下面是一个最简单的事务方式
redis 127.0.0.1:6379> multi //开启事务 OK redis 127.0.0.1:6379> incr a //事务中的命令 QUEUED redis 127.0.0.1:6379> incr b QUEUED redis 127.0.0.1:6379> incr a QUEUED redis 127.0.0.1:6379> exec //执行事务 1) (integer) 1 //返回的结果 2) (integer) 1 3) (integer) 2 redis 127.0.0.1:6379>
说明:当客户端处于事务状态时, 所有传入的命令都会返回一个内容为 QUEUED 的状态回复(status reply), 这些被入队的命令将在 EXEC 命令被调用时执行。这些命令在客户端中以队列的形式排好队。
实例二:开启两个客户端,在两个事务中同时访问一个变量
redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> incr a QUEUED redis 127.0.0.1:6379> incr b QUEUED redis 127.0.0.1:6379> exec 1) (integer) 4 2) (integer) 3 redis 127.0.0.1:6379>
redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> incr a QUEUED redis 127.0.0.1:6379> incr b QUEUED redis 127.0.0.1:6379> exec 1) (integer) 3 2) (integer) 2 redis 127.0.0.1:6379>
说明:事务2优先与实务1,但是两个事务相互没有影响。这说明,我们开启事务后,所有要执行的命令都是在客户端的队列中。只有提交时,才在服务器端一次性,有顺序的执行。
4.redis事务中的错误
- 事务在执行 EXEC 之前,入队的命令可能会出错。比如说,命令可能会产生语法错误(参数数量错误,参数名错误,等等),或者其他更严重的错误,比如内存不足(如果服务器使用 maxmemory 设置了最大内存限制的话)。
- 命令可能在 EXEC 调用之后失败。举个例子,事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面,诸如此类。
说明:对于exec之前的错误,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务。
在 EXEC 命令执行之后所产生的错误,并没有对它们进行特别处理:即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行。
下面举两个例子:
redis 127.0.0.1:6379> get a //首先查看a的值:4 "4" redis 127.0.0.1:6379> multi //开启事务 OK redis 127.0.0.1:6379> incr a //将a递增1 QUEUED redis 127.0.0.1:6379> incr c i k //错误的语法,在exec之前的错误 (error) ERR wrong number of arguments for 'incr' command redis 127.0.0.1:6379> exec //提交事务 (error) EXECABORT Transaction discarded because of previous errors. redis 127.0.0.1:6379> get a //继续查看a的值:4 "4" //结论说明,事务没有被执行 redis 127.0.0.1:6379>
redis 127.0.0.1:6379> multi //开启事务 OK redis 127.0.0.1:6379> set aa abc //设置aa的值为:abc QUEUED redis 127.0.0.1:6379> lpop aa //没有语法错误 QUEUED redis 127.0.0.1:6379> exec //执行事务 1) OK 2) (error) ERR Operation against a key holding the wrong kind of value redis 127.0.0.1:6379> get aa //aa的值仍然存在 "abc" //结果说明,exec之后的错误,redis是不作处理的,即:没有回滚事务 redis 127.0.0.1:6379>
5.redis为什么没有回滚事务
在redis官方文档中描述两点:
- Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
- 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
6.redis放弃事务
redis 127.0.0.1:6379> set aa hadoop OK redis 127.0.0.1:6379> get aa "hadoop" redis 127.0.0.1:6379> multi OK redis 127.0.0.1:6379> set aa hive QUEUED redis 127.0.0.1:6379> DISCARD OK redis 127.0.0.1:6379> get aa "hadoop" redis 127.0.0.1:6379>
7.锁watch
WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回空多条批量回复(null multi-bulk reply)来表示事务已经失败。
//客户端1 redis 127.0.0.1:6379> get aa //首先查看aa的值 "hadoop" redis 127.0.0.1:6379> WATCH aa //添加乐观锁 OK redis 127.0.0.1:6379> multi //开启事务 OK redis 127.0.0.1:6379> set aa hive //重新设置aa的值 QUEUED redis 127.0.0.1:6379> exec //在提交之前先在客户端2中重新设置aa的值 (nil) //提交完后,返回nil redis 127.0.0.1:6379> get aa //重新查看,说明事务被取消了 "hbase" //客户端2 redis 127.0.0.1:6379> set aa hbase //在客户端2中设置aa的值为hbase OK redis 127.0.0.1:6379> get aa //查看aa的值 "hbase"
相关推荐
"php_redis"扩展允许PHP应用程序通过PHP代码与Redis服务器进行交互,执行命令、管理数据、利用Redis的高级功能,如发布/订阅、事务、持久化等。 在压缩包内的文件 "php_igbinary.dll" 是另一个PHP扩展,名为...
标题中的"php_redis-2.2.7-5.6-nts-vc11-x86"和"php_redis-2.2.5-5.6-ts-vc11-x86"指的是PHP的Redis扩展...在开发过程中,合理利用Redis的特性,如事务、发布/订阅、主从复制等,可以极大地提高应用的效率和可扩展性。
通过php_redis,开发者可以轻松地在PHP代码中执行Redis命令,如设置和获取键值、执行事务、订阅发布等操作。这个扩展特别适用于那些需要快速访问和处理大量数据的Web应用。`php_redis-2.2.7-5.6-ts-vc11-x64.zip`...
这个扩展允许开发者充分利用Redis的功能,如数据结构(字符串、哈希、列表、集合和有序集合)、事务处理、发布/订阅模式以及更多高级特性。PHP Redis扩展使得在PHP应用程序中实现高效、低延迟的数据存储和检索成为...
其特点是数据结构丰富,支持字符串、哈希、列表、集合、有序集合等多种数据类型,同时提供事务、发布/订阅等高级功能。 2. **php_redis扩展**:此扩展是PHP与Redis交互的桥梁,它允许PHP代码直接调用Redis的各种...
它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,以及事务、持久化、Lua脚本、发布/订阅、主从复制等功能。 3. **php_redis** 扩展:这是PHP与Redis通信的官方客户端库,允许开发者在PHP中直接操作...
此外,还有高级特性如发布/订阅(pub/sub)、事务(transactions)、Lua脚本执行等功能。 总之,`php5.2+php_redis.dll`是针对PHP 5.2版本的Redis客户端扩展,配合`php_igbinary.dll`可以提升性能,使得PHP应用能够...
通过这个扩展,开发者可以使用各种 Redis 命令,如 SET(设置键值)、GET(获取键值)、INCR(递增数值)、LPUSH/RPOP(列表操作)等,以及事务、发布/订阅、哈希、集合和有序集合等功能。 安装 PHP Redis 扩展通常...
- 事务处理:`multi()`开始一个事务,`exec()`执行所有事务中的命令,`discard()`取消当前事务。 - 发布订阅:`subscribe()`和`unsubscribe()`用于实现发布/订阅模式,实时传递消息。 - Lua脚本支持:`eval()`和`...
此外,它还支持Redis的高级特性,如发布/订阅(pub/sub)、事务、持久化、Lua脚本等。通过这些接口,开发者可以轻松地实现数据缓存、消息队列、分布式锁等功能。 总结,"php_redis-5.2.1-7.2-ts-vc15-x86.zip"是一...
5. **事务(Transactions)**:Redis支持原子事务,通过`multi()`开始一个事务,`exec()`执行所有命令。在PHP中,你可以将一系列操作放入`multi()`和`exec()`之间。 6. **持久化与复制**:Redis提供了RDB和AOF两种...
这个扩展支持多种Redis操作,包括字符串、哈希、集合、有序集合、发布/订阅、事务、HyperLogLog等。 在Windows环境下安装`php_redis`扩展时,首要的关键点就是确保`php_redis.dll`文件与你的PHP版本兼容。本例中...
6. **事务操作**:使用`watch`、`multi`、`exec`等方法实现事务处理。 ```python def transaction(self, func, *args, **kwargs): pipe = self.redis_client.pipeline() pipe.watch(*args) func(pipe, *args, **...
尽管版本较旧,但依旧稳定可靠,包含了许多基础和进阶特性,如事务、发布/订阅、持久化等。 3. **Redis 安装与配置**:在 Windows 上安装 Redis,需要解压并运行服务安装脚本,设置端口、目录路径等配置。通过 `...
在实际开发中,PHP Redis扩展不仅可以用于简单的数据存储,还可以利用Redis的高级功能,如发布/订阅、事务、lua脚本执行等,极大地丰富了PHP应用的可能。因此,熟悉并掌握PHP Redis扩展的使用,对于提升Web应用的...
通过这个工具包,用户可以直接在LabVIEW程序中执行诸如设置键值、获取键值、执行事务、操作列表和集合等操作。`Palette`文件夹中的内容可能包含了工具包的VI控件和函数,方便开发者在LabVIEW的画板上直接拖放使用。 ...
此外,还有对Redis事务、发布/订阅、GeoSpatial功能的支持,以及与Redis Sentinel配合实现主从复制的高可用性。 在实际应用中,为了提高性能,可以利用Redis的持久化机制(如RDB或AOF),以及通过调整内存策略来...
扩展使得PHP能够直接与Redis通信,提供了一个方便的接口来执行各种Redis命令,如设置和获取键值、执行列表、集合、哈希表和有序集合的操作,以及事务和发布/订阅功能。 描述中提到“试了好多个版本这个在win7 64位...
标题 ...安装和配置好这个扩展后,你可以利用PHP的强大功能来执行各种Redis操作,例如存储、检索、更新和删除数据,以及利用Redis的高级特性如发布/订阅、事务处理和数据持久化等。
3. **Redis命令操作**:书中会详细介绍每种数据类型的命令,如`SET`、`GET`、`HSET`、`LPOP`、`SADD`、`ZADD`等,以及事务(Transaction)、管道(Pipeline)等高级操作。 4. **Redis持久化**:为了防止数据丢失,...