事务处理
总所周知,事务是指一个完整的动作,要么全部执行,要么全部失败。
事务的四大特性(简称ACID): 1、原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部执行,要么均不执行。 2、一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致。 3、隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。 4、持久性(Durability):对于任意提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。
在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTI,EXEC,DISCARD,WATCH。这四个指令构成了redis事务处理的基础。
1、MULTI:组装一个事务
2、EXEC:执行一个事务
3、DISCARD:取消一个事务
4、WATCH:监视一些key,一旦这些key在事务执行前被改变,则取消事务的执行。
例子1:简单粗暴:
redis> MULTI //标记事务开始 OK redis> INCR user_id //多条命令按顺序入队 QUEUED redis> INCR user_id QUEUED redis> INCR user_id QUEUED redis> PING QUEUED redis> EXEC //执行 1) (integer) 1 2) (integer) 2 3) (integer) 3 4) PONG
解释:QUEUED表示我们在用MULTI组装事务时,每一个命令都会进入到内存队列中缓存起来,如果出现QUEUED则表示我们这个命令成功插入了缓存队列,在将来执行EXEC时,这些被QUEUED的命令都会被组装成一个事务来执行(如果中途语句出错,则执行命令EXEC会失败)。
例子2:有关事务,大家经常会遇到两种错误
1、调用EXEC之前错误
2、调用EXEC之后错误
”调用EXEC之前错误“有可能是语法有误导致,也可能是由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,redis也会进行记录,在客户端调用EXEC时,redis会拒绝这一事务(这是redis2.6.5之版本之后的策略。在2.6.5之前的版本中,redis会忽略那些入队失败的命令,只执行那些入队成功的命令)。
127.0.0.1:6379> multi OK 127.0.0.1:6379> haha //一个明显错误的指令 (error) ERR unknown command 'haha' 127.0.0.1:6379> ping QUEUED 127.0.0.1:6379> exec //redis无情的拒绝了事务的执行,原因是“之前出现了错误” (error) EXECABORT Transaction discarded because of previous errors.
“调用EXEC之后错误”redis采取了完全不同的策略,即redis不会理睬这些错误,而是继续向下执行事务中的其他命令。这是因为,对于应用层面对错误,并不是redis自身需要考虑和处理的问题所以一个事务中如果一条命令执行失败了,并不会影响接下来的其他命令的执行。
127.0.0.1:6379> multi OK 127.0.0.1:6379> set age 23 QUEUED //age不是集合,所以如下是一条明显错误的指令 127.0.0.1:6379> sadd age 15 QUEUED 127.0.0.1:6379> set age 29 QUEUED 127.0.0.1:6379> exec //执行事务时,redis不会理睬第2条指令执行错误 1) OK 2) (error) WRONGTYPE Operation against a key holding the wrong kind of value 3) OK 127.0.0.1:6379> get age "29" //可以看出第3条指令被成功执行了
再来说下WATCH,这是一个很好的命令,它可以帮我们很好的实现类似于乐观锁的效果,即CAS(Check And Set)。WATCH本身的作用是监视key是否被改动过,而且支持同时监视多个key,只要还没出发事务,WATCH都会尽职尽责的监视,一旦发现谋个key被修改了,在执行EXEC时就会返回nil,表示事务无法触发。
127.0.0.1:6379> set age 23 OK 127.0.0.1:6379> watch age //开始监视age OK 127.0.0.1:6379> set age 24 //在EXEC之前,age的值被修改了 OK 127.0.0.1:6379> multi OK 127.0.0.1:6379> set age 25 QUEUED 127.0.0.1:6379> get age QUEUED 127.0.0.1:6379> exec //触发EXEC (nil) //事务无法被执行
相关推荐
- **事务处理**:能够执行 Redis 的事务,确保多个操作的原子性。 - **管道**:使用 Redis 的 Pipeline 技术,批量发送命令,减少网络延迟。 3. **配置使用** 在 NGINX 的配置文件中,通过 `set $redis_key ...
为了充分利用Redis的功能,建议学习其官方文档,了解如何配置和使用不同的数据结构(如字符串、哈希、列表、集合和有序集合),以及如何利用发布/订阅、事务、阻塞操作等功能来设计高效的应用。同时,掌握持久化机制...
`redis-py-cluster`库是Python连接Redis集群的客户端,它提供了简单易用的API,允许开发者执行常见的Redis操作,如设置和获取键值、执行事务、操作哈希表等。该库实现了CLUSTER指挥,如`CLUSTER NODES`和`CLUSTER ...
PHPRedis 提供了丰富的 API,使得开发者能够通过 PHP 代码直接调用 Redis 的各种命令,如设置和获取键值、执行事务、操作集合、有序集合、哈希表等。由于是 C 扩展,它的性能相对较高,延迟较低,适合处理大量数据...
6. 事务(Transactions):Redis支持简单的事务操作,允许多个命令作为一个原子操作执行,确保数据一致性。 7. Lua脚本:Redis可以通过内置的Lua解释器执行用户提供的脚本,实现更复杂的逻辑操作,且这些操作在...
- **事务**:提供原子性操作,确保一组命令要么全部执行,要么全部不执行。 - **发布/订阅**:支持消息订阅和发布功能,可用于实现简单的消息队列。 2. **Windows上的安装和配置**: - `redis.windows-service....
4. **事务**: Redis支持事务,用户可以一次性执行多条命令,保证原子性。 5. **发布/订阅**: Redis的发布/订阅功能允许客户端订阅特定的频道,当有消息发布到该频道时,所有订阅者都会收到消息,常用于实现消息通知...
4. 事务处理:支持原子操作,保证数据一致性。 5. Lua脚本支持:可以通过Lua编写复杂逻辑,一次执行多条命令。 **RedisDesktopManager** Redis Desktop Manager是一款跨平台的Redis图形化管理工具,提供了一个简洁...
Jedis提供了丰富的API,支持连接池、事务处理、发布/订阅等功能,使得在Java应用中操作Redis变得简单。 2. "commons-pool2-2.0.jar":Apache Commons Pool是一个对象池设计模式的实现,主要用于管理和复用昂贵资源...
4. **Jedis客户端**:Jedis提供了丰富的操作Redis的方法,包括基本的set、get、del等命令,以及事务处理、发布订阅等功能。在本项目中,开发者可以通过Jedis与Redis服务器交互,存取和管理session数据。 5. **集成...
- **事务处理**:Redis支持事务操作,可以确保一组操作的原子性。 - **发布订阅**:Redis提供了发布/订阅模式,用于实现消息传递和事件驱动。 - **Lua脚本**:用户可以通过Lua脚本来实现更复杂的数据处理逻辑。 ...
9. **事务与发布订阅**:Redis还支持事务,可以一次性执行多条命令。发布订阅(Pub/Sub)模式则提供了一种广播消息的能力,订阅者可以订阅特定的主题,发布者向主题发布消息,所有订阅者都能接收到。 10. **性能...
此外,Redis还支持事务、发布/订阅、lua脚本等功能,进一步增强了其功能性和灵活性。 总的来说,"redis-mac-6.2.2"是一个专门为MacOS优化的Redis版本,提供了高效、可靠的数据存储和处理能力。无论是开发者还是运维...
- **事务**:Redis提供了简单的事务功能,允许一组操作原子性地执行。 - **发布/订阅**:Redis的pub/sub机制允许实现消息传递和事件驱动架构。 2. **Windows安装** - 下载:从官方网站或者镜像站点获取最新版本...
6. **监控与日志**:可能包括实时性能监控,如 TPS(每秒事务处理量)、内存使用情况等,以及错误日志查看。 7. **多语言支持**:考虑到全球用户的需求,可能提供多种语言界面。 标签 "redis 数据库 database 缓存...
此外,Redis还提供了发布/订阅、事务、持久化、Lua脚本等功能,极大地扩展了其应用范围。 在Redis 5.0.10版本中,主要包含了以下改进和修复: 1. 性能优化:持续优化了内存管理,提升了命令处理速度,尤其在高并发...
标题中的"php_redis-2.2.7-5.6-nts-vc11-x86"和"php_redis-2.2.5-5.6-ts-vc11-x86"指的是PHP的Redis扩展...在开发过程中,合理利用Redis的特性,如事务、发布/订阅、主从复制等,可以极大地提高应用的效率和可扩展性。
此外,Redis还提供了事务、发布/订阅、Lua脚本等功能,增强了其实用性和灵活性。 在Windows环境中,Redis可能会遇到一些不同于Linux的问题,如文件权限、服务管理等。但是,通过正确配置和使用,Redis在Windows上...
7. **事务管理**:使用Redis的事务功能,确保一组操作的原子性。 8. **集群支持**:对Redis集群进行管理和操作,包括节点发现、槽分配等。 总之,Redis Desktop Manager 0.9.3.817版是开发人员和DBA管理Redis数据库...
- **事务**:Redis支持多条命令的原子执行,通过`MULTI`、`EXEC`命令组合实现。 - **发布/订阅**:Redis的pub/sub功能使得可以实现实时消息传递。 - **主从复制**:通过复制,可以构建高可用的Redis集群,提高...