什么是Redis事务
Redis事务是一组命令的集合,通过MULTI、EXEC、DISCARD和WATCH四个命令实现。事务中的命令会被按顺序执行,期间不会被其他客户端命令插入。
CentOS上配置Redis事务的前提
在开始配置事务之前,确保你的CentOS系统已经完成以下准备工作:
- 已安装Redis服务(建议7.0及以上版本)
- Redis服务正常运行
- 具备root或sudo权限
检查Redis版本
redis-server --version
redis-cli ping
如果返回PONG,说明服务正常。
Redis事务核心命令详解
1. MULTI — 开启事务
MULTI命令标记事务开始,之后的所有命令都会进入队列而非立即执行:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key1 value1
QUEUED
127.0.0.1:6379> SET key2 value2
QUEUED
2. EXEC — 提交事务
EXEC命令一次性执行队列中的所有命令:
127.0.0.1:6379> EXEC
1) OK
2) OK
3. DISCARD — 取消事务
如果想放弃当前事务,使用DISCARD清空命令队列:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key3 value3
QUEUED
127.0.0.1:6379> DISCARD
OK
4. WATCH — 乐观锁
WATCH用于监控一个或多个键,如果在EXEC执行前这些键被其他客户端修改,事务将自动取消:
127.0.0.1:6379> WATCH counter
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR counter
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 2
CentOS中Redis事务配置优化
修改redis.conf关键参数
编辑Redis配置文件以优化事务行为:
sudo vi /etc/redis/redis.conf
需要关注的配置项:
| 配置项 | 建议值 | 说明 |
|---|---|---|
| timeout | 300 | 客户端空闲超时,避免长时间占用连接 |
| maxclients | 10000 | 最大客户端连接数 |
| maxmemory | 2gb | 内存上限,防止事务占用过多内存 |
| appendonly | yes | 开启AOF持久化,保证事务数据安全 |
开启AOF持久化保障事务数据
事务执行后数据仅存在内存中,建议开启AOF确保数据不丢失:
# redis.conf中修改
appendonly yes
appendfsync everysec
修改后重启Redis:
sudo systemctl restart redis
事务使用注意事项
- Redis事务不支持回滚:如果队列中某条命令执行失败,其余命令仍会继续执行,这是与MySQL事务的重要区别
- WATCH必须在MULTI之前调用:顺序不能颠倒
- 事务中不能嵌套MULTI:事务内再次调用MULTI会报错
- 大量命令的事务会阻塞Redis:Redis是单线程模型,长事务会影响其他客户端响应
- WATCH的键在EXEC后会自动取消监控:无需手动UNWATCH
实战示例:用事务实现秒杀库存扣减
# 终端1:监控库存
127.0.0.1:6379> WATCH stock:10086
OK
127.0.0.1:6379> GET stock:10086
"10"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> DECR stock:10086
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 9
如果EXEC返回nil,说明库存被其他客户端抢先修改,需要重新获取并重试。
常见问题排查
事务返回nil
说明WATCH监控的键被修改,事务被取消。解决方案:
- 捕获nil返回值后重试整个事务流程
- 减少WATCH到EXEC之间的耗时操作
事务中命令报错
区分两种错误类型:
- 命令语法错误:进入队列时就会报错,EXEC会拒绝执行整个事务
- 运行时错误(如对字符串执行INCR):只有该命令失败,其余命令正常执行
连接超时导致事务丢失
在redis.conf中适当增大timeout值,或在应用层使用连接池管理。
总结
CentOS下Redis事务配置的核心在于理解MULTI/EXEC/DISCARD/WATCH四个命令的协作机制,配合AOF持久化保障数据安全,同时注意Redis事务不支持回滚这一关键特性。在实际业务中,结合WATCH实现乐观锁是最常见的事务应用模式。