首页 > 数据库 >Redis系列之事务机制

Redis系列之事务机制

时间:2023-12-26 12:33:36浏览次数:25  
标签:事务 127.0 系列 0.1 redis Redis 命令 OK


什么是Redis事务

学习mysql数据库的时候,我们知道了事务的ACID特性,Redis也是支持事务的,不过和数据库的事务又有什么区别?在mysql数据库中,我们使用begin开启事务,提交是commit,回滚是rollback,然后Redis中的事务是怎么一回事?redis的事务其实可以看做是一组命令按照顺序,串行执行队列中的命令,其它客户端的命令不会写入到这个队列中。总的来说,redis事务就是一次性、顺序性、排他性的执行一个队列中的一组命令

redis事务相关命令和使用

MULTI 、 EXEC 、 DISCARD 和 WATCH、UNWATCH命令是redis实现事务需要的命令

  • multi:开启事务,事务开启后,事务中的多条命令会排队,等事务提交
  • discard:取消事务,放弃执行队列里的所有命令
  • exec:执行事务里的所有命令
  • watch:监控一个或者多个key,如果事务提交之前,这个key被其它客户端修改了,这个事务就不会提交
  • unwatch: 取消watch对所有key的监视

redis事务例子

  • 正常的事务执行过程
127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr testid
"QUEUED"

127.0.0.1:0>exec
 1)  "1"
  • 语法错误导致的事务回滚
127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr testid
"QUEUED"

127.0.0.1:0>seta a
"ERR unknown command `seta`, with args beginning with: `a`, "

127.0.0.1:0>exec
"EXECABORT Transaction discarded because of previous errors."
  • 对string类型进行incr
    对一个key先设置为string类型的,然后使用incr命令进行递增,再提交事务,出现错误
127.0.0.1:0>set testid aa
"OK"

127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr testid
"QUEUED"

127.0.0.1:0>exec
 1)  "ERR value is not an integer or out of range"
  • 手动回滚
127.0.0.1:0>multi
"OK"

127.0.0.1:0>incr id
"QUEUED"
127.0.0.1:0>discard
"OK"
  • watch命令使用
    watch命令有点像cas锁,check-and-set,事务开启后,其它客户端更改了值,事务不执行
127.0.0.1:0>watch id
"OK"
127.0.0.1:0>multi
"OK"
127.0.0.1:0>set id 1
"QUEUED"
127.0.0.1:0>get id
"QUEUED"

另外一个客户端设置key的值

127.0.0.1:0>set id 2
"QUEUED"

客户端1再提交事务

127.0.0.1:0>exec
 (nil)

redis事务特点

  • 命令是原子性的,在执行事务中的指令时,不能执行其它指令,但是redis是保证分布式的ap模式的,不能保证cp特性,所以一般对业务要求严格的也不采用redis事务
  • redis事务可以在一定程度保证原子性,但是不能获取事务中间指令的结果,然后再决定后面的执行逻辑,所以这种业务场景也不适用,这时候可以使用lua脚本来实现


标签:事务,127.0,系列,0.1,redis,Redis,命令,OK
From: https://blog.51cto.com/u_15704340/8981818

相关文章

  • Windows下的Redis启动报错Redis service failed to start解决方法
    报错原因:Redis服务没有找到log文件解决方法在Redis安装目录下打开redis.windows-service.conf文件搜索logfile,找到logfile存放目录,一般默认为Logs/redis_log.txt在Redis安装目录创建Logs文件夹,在Logs文件夹下创建redis_log.txt文件重新启动即可解决......
  • Redis相关
    2023.12.26臭宝今天早上起床没拉粑粑,so sad   o(╥﹏╥)o  1.Redis为什么快?Redis是存在内存中的,Redis是单线程的,避免上下文切换。渐进式RehashRedis的所有数据都是存在一个hash数组上的,hash数组每个元素都是一个链表(所有类型都是,如String,hash,list,set,zset,bitma......
  • MYSQL 事务
    事务定义事务就是一组数据库操作序列(包含一个或多个sql操作命令),事务会把所有操作看作是一个不可分割的整体向数据库系统提交或撤销操作,所有操作要么都执行,要么都不执行。事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。事务适用于多用户......
  • MySQL的事务(看看也许有帮助呢)
    MySQL的事务一、事务的概念在MySQL中,只有InnoDB存储引擎才支持事务。事务的处理用来维护数据库数据的完整性,保证同一个事务里的一批SQL语句,要么全部执行,要么全部不执行。事务用来管理DDL、DML、DCL操作,比如insert、update、delete语句,默认自动提交,即执行SQL语句后会马上执行co......
  • Redis进阶 Lua函数
    1.可以直接声明一个局部变量来接收函数,也可以直接简写localsquare=function(i)returni*iend简写:localfunctionsquare(i)returni*iend 2.当调用函数时,参数是一一对应的,如果多了参数,则会忽略,少则会将对应位置的参数赋值为nil 3.如果想要实现可变参数个数,也......
  • Maven系列(二)exec-maven-plugin
    转载自:https://www.cnblogs.com/binarylei/p/8628243.htmlMaven系列(二)exec-maven-pluginMaven系列(二)exec-maven-plugin1.mvn命令行运行#exec:java不会自动编译代码,你需要手动执行mvncompile来完成编译mvncompile#执行exec运行main方法mvnexec:java-......
  • 数据库事务的作用
    数据库事务的主要作用是确保数据库在执行多个相关操作时能够保持一致性和完整性。事务是指一组数据库操作语句,这些语句将作为一个逻辑单元一起执行,要么全部执行成功,要么全部不执行。当一个事务成功提交后,数据库中的数据应该保持一致性状态,反之如果事务执行出错或中断,则要回滚事务,使......
  • 美团面试:ES+Redis+MySQL高可用,如何实现?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • Ubuntu上安装、使用Redis的详细教程
    sudoapt-getupdatesudoapt-getinstallredis启动方式二systemctlstartredis-server启动方式三serviceredis-serverstart重启redisserviceredis-serverrestart关闭redisserviceredis-serverstop查看redis状态serviceredis-serverstatus4、在宿主机连接redis根据以......
  • aioredis
    importasyncioimportaioredisfromconfig.env_configimportREDIS_URLclassRedisClient:def__init__(self,url,decode_responses=True,max_connections=30):self.url=urlself.decode_responses=decode_responsesself.max_c......