首页 > 数据库 >Redis的事务

Redis的事务

时间:2023-06-26 15:06:49浏览次数:42  
标签:newcounter 事务 127.0 命令 0.1 Redis 6379 key

谁说NoSQL都不支持事务,虽然Redis的Transactions提供的并不是严格的ACID的事务(比如一串用EXEC提交执行的命令,在执行中服务器宕机,那么会有一部分命令执行了,剩下的没执行),但是这个Transactions还是提供了基本的命令打包执行的功能(在服务器不出问题的情况下,可以保证一连串的命令是顺序在一起执行的,中间有会有其它客户端命令插进来执行)。Redis还提供了一个Watch功能,你可以对一个key进行Watch,然后再执行Transactions,在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执行。

组合命令

Redis本身支持一些简单的组合型的命令,比如以NX结尾命令都是判断在这个值没有时才进行某个命令。

127.0.0.1:6379> set name "ghj1976"     
OK      
127.0.0.1:6379> setnx name "ghj1977"      
(integer) 0      
127.0.0.1:6379> get name      
"ghj1976"      
127.0.0.1:6379>

参数说明:

SETNX key value

将 key 的值设为 value ,当且仅当 key 不存在。

若给定的 key 已经存在,则 SETNX 不做任何动作。

SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

可用版本:
>= 1.0.0
时间复杂度:
O(1)
返回值:
设置成功,返回 1 。
设置失败,返回 0 。

 

127.0.0.1:6379> getset name "ghj1978"     
"ghj1976"      
127.0.0.1:6379> get name      
"ghj1978"

说明:

GETSET key value

将给定 key 的值设为 value ,并返回 key 的旧值(old value)。

当 key 存在但不是字符串类型时,返回一个错误。

可用版本:
>= 1.0.0
时间复杂度:
O(1)
返回值:
返回给定 key 的旧值。
当 key 没有旧值时,也即是, key 不存在时,返回 nil 。

命令组合事务

当然,Redis还支持自定义的命令组合,通过MULTI和EXEC,将几个命令组合起来执行

127.0.0.1:6379> set newcounter 0     
OK      
127.0.0.1:6379> multi      
OK      
127.0.0.1:6379> incr newcounter      
QUEUED      
127.0.0.1:6379> incr newcounter      
QUEUED      
127.0.0.1:6379> incr newcounter      
QUEUED      
127.0.0.1:6379> exec      
1) (integer) 1      
2) (integer) 2      
3) (integer) 3      
127.0.0.1:6379> get newcounter      
"3"      
127.0.0.1:6379>

说明:

MULTI

标记一个事务块的开始。

事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

可用版本:
>= 1.2.0
时间复杂度:
O(1)。
返回值:
总是返回 OK 。

EXEC

执行所有事务块内的命令。

假如某个(或某些) key 正处于 WATCH 命令的监视之下,且事务块中有和这个(或这些) key 相关的命令,那么 EXEC 命令只在这个(或这些) key 没有被其他命令所改动的情况下执行并生效,否则该事务被打断(abort)。

可用版本:
>= 1.2.0
时间复杂度:
事务块内所有命令的时间复杂度的总和。
返回值:
事务块内所有命令的返回值,按命令执行的先后顺序排列。
当操作被打断时,返回空值 nil 。

你还可以用DICARD命令来中断执行中的命令序列

127.0.0.1:6379> set newcounter 0     
OK      
127.0.0.1:6379> multi      
OK      
127.0.0.1:6379> incr newcounter      
QUEUED      
127.0.0.1:6379> incr newcounter      
QUEUED      
127.0.0.1:6379> incr newcounter      
QUEUED      
127.0.0.1:6379> discard      
OK      
127.0.0.1:6379> get newcounter      
"0"      
127.0.0.1:6379>

DISCARD

取消事务,放弃执行事务块内的所有命令。

如果正在使用 WATCH 命令监视某个(或某些) key,那么取消所有监视,等同于执行命令 UNWATCH 。

可用版本:
>= 2.0.0
时间复杂度:
O(1)。
返回值:
总是返回 OK 。

 

 

参考资料:

Redis 命令参考
http://www.redisdoc.com/en/latest/index.html

十五分钟介绍 Redis数据结构
http://blog.nosqlfan.com/html/3202.html

Redis系统性介绍
http://blog.nosqlfan.com/html/3139.html

Redis之七种武器
http://blog.nosqlfan.com/html/2942.html

试用redis
http://try.redis.io/

Redis 设计与实现
http://www.redisbook.com/en/latest/

标签:newcounter,事务,127.0,命令,0.1,Redis,6379,key
From: https://blog.51cto.com/u_15588078/6554263

相关文章

  • 解决redis从服务器未配置主服务器密码导致数据未同步&磁盘饱满问题
    问题前置场景本人前几天买了一台2核4G+40G磁盘空间的云服务器用来学习使用,在服务器上安装了docker。为了学习redis主从架构,使用docker-compose部署了一主二从三台redis服务,部署完成之后测试发现从服务器并没有同步主服务器的数据,查看配置文件没有看出来什么问题,进入三台redis服务......
  • redis 主从复制如何实现的? redis 的集群模式如何实现? redis 的 key 是如何寻址的?
    1.redis主从复制如何实现的?1.1 连接建立阶段1.2  数据同步阶段1.3命令传播阶段是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。需要注意,主从复制的开启,完全是在从节点发起的;不需......
  • redis安装-备份-恢复 -- redislive -- web管理工具
    1.安装参考:https://www.jb51.net/article/146744.htm2.安装ruby2.3.31.gpg2--keyserverhkp://keys.gnupg.net--recv-keysD39DC0E32.curl-Lget.rvm.io|bash-sstable3.rvm生效source/usr/local/rvm/scripts/rvm4.安装一个版本rvminstall2.3.35.设置默认rubyrvmu......
  • 03 | 事务隔离:为什么你改了我还看不见?
    03|事务隔离:为什么你改了我还看不见?隔离性与隔离级别当数据库上有多个事务同时执行的时候,就可能出现脏读(dirtyread)、不可重复读(non-repeatableread)、幻读(phantomread)的问题,为了解决这些问题,就有了“隔离级别”的概念。SQL标准的事务隔离级别包括:读未提交(readuncommitt......
  • 2023-06-25:redis中什么是缓存穿透?该如何解决?
    2023-06-25:redis中什么是缓存穿透?该如何解决?答案2023-06-25:缓存穿透缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中。因此,每次请求都需要访问数据库,这将导致不存在的数据每次都需要查询存储层,这样缓存就失去了保护后端存储的作用。缓存穿透......
  • 2023-06-25:redis中什么是缓存穿透?该如何解决?
    2023-06-25:redis中什么是缓存穿透?该如何解决?答案2023-06-25:缓存穿透缓存穿透指的是查询一个根本不存在的数据,在这种情况下,无论是缓存层还是存储层都无法命中。因此,每次请求都需要访问数据库,这将导致不存在的数据每次都需要查询存储层,这样缓存就失去了保护后端存储的作用。缓存......
  • 利用chatgpt解决单主机多实例模式Redis主从配置的报错问题:Error condition on socket
    今天在配置redis主从配置时,从实例报错:ErrorconditiononsocketforSYNC:Connectionrefused我是在单体机上配置三个实例,实现redis的一主二从。1.首先,创建三个文件夹,名字分别叫7001、7002、7003(我喜欢将应用安装在tmp下)#进入/tmp目录cd/tmp#创建目录mkdir70017......
  • RedisInsight:Redis可视化工具介绍与使用
    RedisInsight简介RedisInsight是一个直观高效的RedisGUI管理工具,它可以对Redis的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用CLI和连接的Redis进行交互(RedisInsight内置对Redis模块支持):RedisInsight提供的功能:唯一支持RedisCluster......
  • 事务超时异常:org.springframework.transaction.TransactionTimedOutException: Transa
    报错如下:代码如下:Controllerimportcom.zwh.service.impl.TimeOutService;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.w......
  • redis,mongo,mysql,es区别
    Redis、MongoDB、MySQL和Elasticsearch(ES)都是常用的数据库系统,各有不同的特点和适用场景,具体区别如下:Redis:Redis是一种高性能键值存储数据库,基于内存操作,支持数据持久化,支持数据类型丰富灵活,如字符串、哈希、列表、集合、有序集合等。Redis还提供了订阅/发布、事务、Lua脚本、......