首页 > 数据库 >redis初级之事务

redis初级之事务

时间:2024-11-28 11:54:37浏览次数:6  
标签:事务 set key2 key1 redis 初级 执行 客户端

事务

​ 事务表示一组动作,要么全部执行,要么全不执行。例如在抖音上用户A关注了用户B,在用户A的关注的人中要添加用户B,在用户B的粉丝中要添加用户A,这些操作要么全部执行,要不全不执行,否则就会造成数据不同步的问题,比如用户A关注了用户B,用户A关注的人中有用户B,但是用户B的粉丝中并没有用户A。

命令

​ Redis实现了一套比较简单的事务功能,一共有五个关于事务的命令。

命令 说明
WATCH 监视某个或多个键
UNWATCH 取消监视所有被监视的键
MULTI 标记事务的开始
EXEC 执行一个事务中的所有命令
DISCARD 取消事务

将一组需要被一起执行的命令放到MULTI和EXEC命令之间即可实现一个事务。

# 事务实现的示例代码
# 客户端1

> multi
"OK"

> set key1 1
"QUEUED"

> set key2 1
"QUEUED"

> exec
1) "OK"
2) "OK"

> mget key1 key2
1) "1"
2) "1"

可以看到在执行set命令时,返回结果为QUEUED,代表此时命令并没有真的去执行,而是暂时保存在了Redis中。如果我们此时在另一个客户端中执行get命令,会发现返回结果为nil。

# 客户端1
> multi
"OK"
# 客户端1
> set key1 1
"QUEUED"
# 客户端1
> set key2 1
"QUEUED"

# 客户端2
> get key1
(nil)

只有当执行EXEC命令后,事务中的命令才会真的执行完成。

如果中途我们想停止此次事务的执行,我们可以使用DISCARD命令来取消事务。

# 客户端1
> discard
"ok"

> get key1
(nil)

报错时事务的处理机制

​ 如果在执行事务时出错,Redis也会根据出错的类型不同有不同的处理机制。

1.命令错误

例如将命令set写成了sett,属于是语法错误,Redis根本无法执行,这种情况下事务不会执行成功。

# 示例代码
> get key1
(nil)

> multi
"OK"

> sett key1 1
"ERR unknown command `sett`, with args beginning with: `key1`, `1`, "

> incr key1
"QUEUED"

> exec
"EXECABORT Transaction discarded because of previous errors."

> get key1
(nil)

2.运行时错误

比如set key1=1,set key2 = hello。在事务中对key1,key2 进行incr操作。

可以发现在执行exec命令之后的返回结果中可以看到incr key2 命令报错,但是事务还是执行了且对key1进行了+1操作。因为incr key2命令是正确的,产生的错误是运行时错误。

# 示例代码
> set key1 1
"OK"

> set key2 hello
"OK"

> mget key1 key2
1) "1"
2) "hello"

> multi
"OK"

> incr key1
"QUEUED"

> incr key2
"QUEUED"

> exec
1) "2"
2) "ReplyError: ERR value is not an integer or out of range"

> mget key1 key2
1) "2"
2) "hello"

总结

​ 由此可见,Redis并不支持事务回滚,需要开发人员在开发过程中注意此种情况的发生。

监听键

​ 有些事务需要确保事务在真正的执行之前,事务中的某些键没有被修改过,如果没有被修改则执行事务,否则不执行(乐观锁)。Redis提供了WATCH命令来实现这种功能。

# 示例代码
# 客户端1
> lrange list 0 -1
(empty list or set)
# 客户端1
> rpush list 1
(integer) 1
# 客户端1
> watch list
"OK"
# 客户端1
> multi
"OK"
# 客户端1
> rpush list 3
"QUEUED"
# 客户端2
> rpush list 2
(integer) 2
# 客户端1
> exec
(nil)
# 客户端1
> lrange list 0 -1
1) "1"
2) "2"

只要该键在被监听之后,事务真正执行(EXEC)之前被修改过,则事务将不执行。

同时也可以使用UNWATCH命令取消键的监听,UNWATCH命令会取消监听当前客户端中所有被监听的键。

标签:事务,set,key2,key1,redis,初级,执行,客户端
From: https://www.cnblogs.com/lixiuxiu/p/18574008

相关文章

  • ssm整合怎么处理事务?
    今天来学习一下ssm怎么处理事务。在此之前先要了解事务是什么?目录1、什么是事务?2、事务的四个特性3、为什么会存在事务(事务的作用)?4、ssm整合怎么处理事务1、@Transactional的作用 2、如果不管出现什么异常都要回滚应该怎么处理?3、添加了@Transactional注解代码中......
  • Redis【1】- 如何阅读 Redis源码
    1Redis的简介Redis实际上是简称,全称为RemoteDictionaryServer(远程字典服务器),由SalvatoreSanfilippo写的高性能key-value存储系统,其完全开源免费,遵守BSD协议。Redis与其他key-value缓存产品(如memcache)有以下几个特点。数据持久化:可以将内存中的数据保存在磁......
  • 5、Redis缓存设计最佳实践
    缓存穿透缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,通常出于容错的考虑,如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。造成缓存穿透的基本原因有两个:第一,自身业务......
  • 6、Redis开发规范与性能优化
    键值设计key设计可读性与管理性,以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id简洁性,保证语义的前提下,控制key的长度不要包含特殊字符value设计拒绝bigkey在Redis中,一个字符串最大512MB,一个二级数据结构(例如hash、list、set、zset)可以存储......
  • 3、Redis主从、哨兵与集群架构
    Redis主从架构主从搭建步骤1、复制一份redis.conf文件2、将相关配置修改为如下值:port6380pidfile/var/run/redis_6380.pid#把pid进程号写入pidfile配置的文件logfile"6380.log"dir/usr/local/redis-5.0.3/data/6380#指定数据存放目录#需要注释掉bind#......
  • spring(四)转账日志(事务案例)
    一、转账业务追加日志分析实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕即:A账户减钱,B账户加钱,数据库记录日志无论转账操作是否成功,均进行转账操作的日志留痕二、事务传播行为事务传播行为:事务协调员对事务管理员所携带事务的处理态度  添加日志是一......
  • spring(三)事务
    一、Spring事务作用-事务作用:在数据层保障一系列的数据库操作同成功同失败-Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败事务能在数据层和业务层开展,业务层组合了若干数据层的功能;在业务层开事务可以保证调用的多个数据层操作......
  • redis锁等待随机毫秒数拦截和程序自动过期双重机制
    redis锁等待随机毫秒数拦截和程序自动过期双重机制上一个操作加了锁,需要等待上一个操作执行完毕之后,才允许当前操作执行,所以当前操作需要执行锁等待处理。 packagecom.example.core.mydemo.javaDemo;importjava.time.LocalDateTime;publicclassRandomTest{publ......
  • redis锁和等待锁随机毫秒数解决程序调用方控制执行的先后顺序,避免并发操作造成的数据
    redis锁和等待锁随机毫秒数解决程序调用方控制执行的先后顺序,避免并发操作造成的数据不一致现象:向第三方服务调用接口,比如更换商品换货,需要先取消,然后再新增操作。同时可能存在修改并发操作(同时操作换货和修改操作),在取消和新增的间隙中做了修改操作,引起脏数据等数据不一致的问题......
  • mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
    随笔从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条?数据源的统一与拆分监控报警系统的指标、规则与执行闭环我们的系统应该配置哪些监控报警项?监控报警系统如何实现自监控?java老矣,尚能饭否?一骑红尘妃子笑,无人知是荔枝来!张居正的考成法,对我们有何参考价值?mon......